<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:dcterms="http://purl.org/dc/terms/"
     xmlns:media="http://search.yahoo.com/mrss/"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:cf="https://www.futureplc.com/rss/content-flags"
>
    <channel>
                    <atom:link href="https://www.tomsguide.com/feeds/tag/gaming-peripherals" rel="self" type="application/rss+xml" />
                            <title><![CDATA[ Latest from Tom's Guide in Gaming-peripherals ]]></title>
                <link>https://www.tomsguide.com/gaming/gaming-peripherals</link>
        <description><![CDATA[ All the latest gaming-peripherals content from the Tom's Guide team ]]></description>
                                    <lastBuildDate>Sat, 12 Sep 2026 12:30:00 +0000</lastBuildDate>
                            <language>en</language>
                                <item>
                                                            <title><![CDATA[ This premium PC controller does something I've never seen before — and it’s a game-changer ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I mostly know SteelSeries for its lineup of gaming headsets, keyboards, and other accessories. Curiously enough, it has never released a full-fledged gaming controller for consoles and PC. Well, that used to be the case, as we now have the SteelSeries Aeon Pro. And let me tell you, it’s a pretty awesome gaming controller.</p><p>Its standout feature is the QuickSwitch Dock System, which can connect to your PC and Xbox simultaneously for seamless pairing. The dock itself has a slot to charge the extra detachable battery, while the controller has an OLED panel for easy profile switching. It also includes expected “pro” controller features like Hall Effect thumbsticks, remappable back buttons, and rubber grips.</p><p>While the SteelSeries Aeon Pro is pretty pricey at $259, it’s arguably worth the money given what it packs and what it can do. I’ve used and tested many of the <a href="https://www.tomsguide.com/best-picks/best-pc-game-controllers">best PC controllers</a>, and this is one of the most impressive yet. If that price doesn’t scare you away, there’s a lot to like here. This is what I think after using the Aeon Pro for the better part of two weeks.</p><div class="product"><a data-dimension112="41d9ce06-ae0f-11f1-ad0d-6917892df765" data-action="Deal Block" data-label="Aeon Pro" data-dimension48="Aeon Pro" data-dimension25="$259" href="https://steelseries.com/gaming-controllers/aeon-pro?srsltid=AfmBOop_FgUbthHFvuHncUbwafvG-6tomHZXEkiIiP5SWbO4OBpkTt4W" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1200px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="4KQWbcoHH7mXgVxr9YU3vC" name="SteelSeries Aeon Pro controller deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4KQWbcoHH7mXgVxr9YU3vC.jpg" mos="" align="middle" fullscreen="" width="1200" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The SteelSeries Aeon Pro is a $259 Xbox and PC controller for gamers who bounce between both. Its QuickSwitch dock stays wired to each system, so you swap platforms without re-pairing, while dual hot-swap batteries keep you playing instead of charging. It features Hall Effect thumbsticks, clicky mechanical buttons, and an OLED screen for easy profile switching. Though pricey, it’s one of the most innovative controllers on the market.<a class="view-deal button" href="https://steelseries.com/gaming-controllers/aeon-pro?srsltid=AfmBOop_FgUbthHFvuHncUbwafvG-6tomHZXEkiIiP5SWbO4OBpkTt4W" target="_blank" rel="nofollow" data-dimension112="41d9ce06-ae0f-11f1-ad0d-6917892df765" data-action="Deal Block" data-label="Aeon Pro" data-dimension48="Aeon Pro" data-dimension25="$259">View Deal</a></p></div><h2 id="a-solid-controller">A solid controller</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="939zHBW3NJqEYJrzqkhvJC" name="SteelSeries Aeon Pro-11" alt="SteelSeries Aeon Pro" src="https://cdn.mos.cms.futurecdn.net/939zHBW3NJqEYJrzqkhvJC.jpg" mos="" align="middle" fullscreen="" width="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 start with the Aeon Pro itself. Its overall size and weight are virtually identical to a standard Xbox controller. Of course, it feels much different in hand thanks to the wrap-around rubber grips and four back buttons. Still, if you’re familiar with the Xbox controller, it doesn’t take very long to acclimate to SteelSeries’ peripheral.</p><p>Button layout isn’t radically different. The asymmetrical thumbsticks, raised D-Pad, four face buttons, and four shoulder buttons are exactly where you’d expect. The main difference here is that the Xbox Home button is lower to accommodate the OLED screen in the top center. The options and select buttons are now located directly beneath the D-Pad and right thumbstick instead of in the middle.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="5j5Z3mRywJXeN9Uy6iQuLg" name="SteelSeries Aeon Pro-6" alt="SteelSeries Aeon Pro" src="https://cdn.mos.cms.futurecdn.net/5j5Z3mRywJXeN9Uy6iQuLg.jpg" mos="" align="middle" fullscreen="" width="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>Aside from the thumbsticks, all the buttons—including the D-Pad—are clicky like a keyboard, which is appropriate for a PC controller. I should add that the triggers only click once you flip the trigger locks to shorten their actuation point. I’m a fan of the <a href="https://www.tomsguide.com/best-picks/best-mechanical-keyboards">best mechanical keyboards</a>, so I’m all about the clicky.</p><p>The back buttons generally don’t bother me because both are positioned where my middle and ring fingers naturally rest. That said, I wish they were removable, as on the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/scuf-valor-pro-review">Scuf Valor Pro</a>. This is a minor thing for me, but it could be frustrating if you’re not a fan of back buttons. Still, I’d rather have four permanent back buttons than none.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="dkHaryt32gioYFxG2hHm9o" name="SteelSeries Aeon Pro-10" alt="SteelSeries Aeon Pro" src="https://cdn.mos.cms.futurecdn.net/dkHaryt32gioYFxG2hHm9o.jpg" mos="" align="middle" fullscreen="" width="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>Lastly, there are the Hall Effect thumbsticks. Even though TMR thumbsticks are all the rage now, Hall Effect — the OG magnetic switch type — still delivers smooth, precise movement, especially compared with traditional analog sticks. And since they’re magnetic instead of analog, you likely won’t have to suffer from stick drift for a long time — if ever.</p><h2 id="an-innovative-dock">An innovative dock</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="5GDrxinx2tbQtNLg9eJ7xG" name="SteelSeries Aeon Pro-9" alt="SteelSeries Aeon Pro" src="https://cdn.mos.cms.futurecdn.net/5GDrxinx2tbQtNLg9eJ7xG.jpg" mos="" align="middle" fullscreen="" width="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>Controller charging stations aren’t new. However, SteelSeries’ QuickSwitch Dock System (as the company calls it) does something I’ve never seen before on a controller dock: it charges a separate battery (included with the controller). So when the battery inside your controller runs out, you can simply swap in the fully charged one and keep playing without a major interruption.</p><p>If that sounds familiar, it’s because this feature comes from SteelSeries’ own <a href="https://www.tomsguide.com/reviews/steelseries-arctis-nova-pro-wireless">Arctis Nova Pro</a> headset, which has a hub that lets you charge its batteries. Best of all, the batteries for that headset and the Aeon Pro are interchangeable. If you own both peripherals, you’ll have four chargeable batteries at your disposal!</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="j3Yq5pvDoHBfLKWPU6BnVb" name="SteelSeries Aeon Pro-8" alt="SteelSeries Aeon Pro" src="https://cdn.mos.cms.futurecdn.net/j3Yq5pvDoHBfLKWPU6BnVb.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Like the Arctis Nova Pro’s hub, the QuickSwitch Dock System lets you connect to your PC and Xbox at the same time via the two USB-C ports on the back. Thanks to this feature, you won’t have to constantly pair and re-pair the controller to whatever platform you’re using, as you would with other controllers.</p><p>Another cool feature is the two slots for extra thumbsticks. One thumbstick is the same size as the two on the controller, only it is convex instead of concave. The other thumbstick is about twice as long for more precise aiming in shooting games. The magnetic thumbsticks snap in and out easily, which is a bonus.</p><p>The compartment for the extra battery sits right under the thumbsticks, and you just press down to lock it in place or release it. This is a simple process, but it’s extremely satisfying to press the battery in and out.</p><h2 id="an-oled-screen-on-a-game-controller">An OLED screen on a game controller?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qGBqF7hLnJndZyT3ZopN7U" name="SteelSeries Aeon Pro-3" alt="SteelSeries Aeon Pro" src="https://cdn.mos.cms.futurecdn.net/qGBqF7hLnJndZyT3ZopN7U.jpg" mos="" align="middle" fullscreen="" width="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>Remapping buttons or fine-tuning thumbstick sensitivity on controllers usually requires you to dive into a dedicated desktop or mobile app. While the SteelSeries GG desktop app exists for that, you can almost effectively ignore it and still customize the Aeon Pro to your liking thanks to the integrated OLED screen.</p><p>On this monochrome screen, you can access profiles, switch between PC and Xbox, monitor battery life, and remap the controls. While the screen isn’t all that large, all the text appears nice and sharp.</p><p>My favorite thing about the OLED is that it quickly shows which profile you’re using, which is especially handy if you have different configurations for different genres or games. This way, I don’t have to open an app to see if I’m using the right profile, or remember which colors correspond to which layouts, like some controllers have you do.</p><p>Though I question why the screen needed to be OLED since it’s monochrome, I can’t complain about the results. Sure, you can make finer adjustments via the GG app, but it’s good that you can configure most of what you’d want right on the controller.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W5ErZW"></div>                            </div>                            <script src="https://kwizly.com/embed/W5ErZW.js" async></script><h2 id="my-new-daily-driver">My new daily driver</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="7YgfF97brCRTreyFWya6oY" name="SteelSeries Aeon Pro-2" alt="SteelSeries Aeon Pro" src="https://cdn.mos.cms.futurecdn.net/7YgfF97brCRTreyFWya6oY.jpg" mos="" align="middle" fullscreen="" width="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>We’ll have a full review of the SteelSeries Aeon Pro controller for you soon, but I wanted to share my thoughts ahead of that since I’ve been enjoying this awesome peripheral for some time. Again, it’s definitely pricey, but given all the cool features it packs, I think it’s worth the money for hardcore PC gamers.</p><p>If you’ve liked what I had to say about the Aeon Pro, then give it a shot. I promise you won’t be disappointed.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><strong></strong><a href="https://www.tomsguide.com/computing/gaming-laptops/alienware-16-area-51-gaming-laptop-2026-review"><strong>I just tested the new Alienware 16 Area-51 — and the OLED panel makes it the complete package</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/computing/laptops/lenovo-yoga-9n-2-in-1-hands-on"><strong>I went hands-on with Lenovo’s RTX Spark-powered Yoga 9n 2-in-1 laptop — and it’s a creative powerhouse</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/gaming/metal-gear-solid-4-on-ps5-is-an-almost-perfect-port-of-my-favorite-ps3-exclusive"><strong>Metal Gear Solid 4 on PS5 is an almost perfect port of my favorite PS3 exclusive</strong></a><strong></strong></li></ul><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=gaming+controllers&min_discount_ratio=0.95&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="8">8 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const finalHref = cardLink.href || cardLink.getAttribute('href') || '';                let actualRevenueId = cardLink.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = this.getRowsLimit();          } else {             this.displayLimit += this.getRowsLimit();          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: this.decodeHTML(item.name || item.title || item.model_name || item.product_name || 'Unknown Product'),            brand: this.decodeHTML(item.brand || ''),            productName: this.decodeHTML(item.model_name || item.product_name || item.name || ''),            merchant: this.decodeHTML(item.merchant_name || item.merchant || item.retailer || 'Retailer'),            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const finalHref = btn.href || btn.getAttribute('href') || '';                let actualRevenueId = btn.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += this.getRowsLimit();                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');               document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/this-premium-pc-controller-does-something-ive-never-seen-before-and-its-a-game-changer</link>
                                                                            <description>
                            <![CDATA[ The $259 SteelSeries Aeon Pro controller is expensive, but its unique dock and premium features make it one of the best gaming controllers available. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">gEcBRYFYgoHh7MDXQjXexT</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/L8Sp7VoNWHNDiXoDpmao87-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 12 Sep 2026 12:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></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/L8Sp7VoNWHNDiXoDpmao87-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[SteelSeries Aeon Pro controller]]></media:description>                                                            <media:text><![CDATA[SteelSeries Aeon Pro controller]]></media:text>
                                <media:title type="plain"><![CDATA[SteelSeries Aeon Pro controller]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/L8Sp7VoNWHNDiXoDpmao87-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I mostly know SteelSeries for its lineup of gaming headsets, keyboards, and other accessories. Curiously enough, it has never released a full-fledged gaming controller for consoles and PC. Well, that used to be the case, as we now have the SteelSeries Aeon Pro. And let me tell you, it’s a pretty awesome gaming controller.</p><p>Its standout feature is the QuickSwitch Dock System, which can connect to your PC and Xbox simultaneously for seamless pairing. The dock itself has a slot to charge the extra detachable battery, while the controller has an OLED panel for easy profile switching. It also includes expected “pro” controller features like Hall Effect thumbsticks, remappable back buttons, and rubber grips.</p><p>While the SteelSeries Aeon Pro is pretty pricey at $259, it’s arguably worth the money given what it packs and what it can do. I’ve used and tested many of the <a href="https://www.tomsguide.com/best-picks/best-pc-game-controllers">best PC controllers</a>, and this is one of the most impressive yet. If that price doesn’t scare you away, there’s a lot to like here. This is what I think after using the Aeon Pro for the better part of two weeks.</p><div class="product"><a data-dimension112="41d9ce06-ae0f-11f1-ad0d-6917892df765" data-action="Deal Block" data-label="Aeon Pro" data-dimension48="Aeon Pro" data-dimension25="$259" href="https://steelseries.com/gaming-controllers/aeon-pro?srsltid=AfmBOop_FgUbthHFvuHncUbwafvG-6tomHZXEkiIiP5SWbO4OBpkTt4W" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1200px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="4KQWbcoHH7mXgVxr9YU3vC" name="SteelSeries Aeon Pro controller deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4KQWbcoHH7mXgVxr9YU3vC.jpg" mos="" align="middle" fullscreen="" width="1200" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The SteelSeries Aeon Pro is a $259 Xbox and PC controller for gamers who bounce between both. Its QuickSwitch dock stays wired to each system, so you swap platforms without re-pairing, while dual hot-swap batteries keep you playing instead of charging. It features Hall Effect thumbsticks, clicky mechanical buttons, and an OLED screen for easy profile switching. Though pricey, it’s one of the most innovative controllers on the market.<a class="view-deal button" href="https://steelseries.com/gaming-controllers/aeon-pro?srsltid=AfmBOop_FgUbthHFvuHncUbwafvG-6tomHZXEkiIiP5SWbO4OBpkTt4W" target="_blank" rel="nofollow" data-dimension112="41d9ce06-ae0f-11f1-ad0d-6917892df765" data-action="Deal Block" data-label="Aeon Pro" data-dimension48="Aeon Pro" data-dimension25="$259">View Deal</a></p></div><h2 id="a-solid-controller">A solid controller</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="939zHBW3NJqEYJrzqkhvJC" name="SteelSeries Aeon Pro-11" alt="SteelSeries Aeon Pro" src="https://cdn.mos.cms.futurecdn.net/939zHBW3NJqEYJrzqkhvJC.jpg" mos="" align="middle" fullscreen="" width="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 start with the Aeon Pro itself. Its overall size and weight are virtually identical to a standard Xbox controller. Of course, it feels much different in hand thanks to the wrap-around rubber grips and four back buttons. Still, if you’re familiar with the Xbox controller, it doesn’t take very long to acclimate to SteelSeries’ peripheral.</p><p>Button layout isn’t radically different. The asymmetrical thumbsticks, raised D-Pad, four face buttons, and four shoulder buttons are exactly where you’d expect. The main difference here is that the Xbox Home button is lower to accommodate the OLED screen in the top center. The options and select buttons are now located directly beneath the D-Pad and right thumbstick instead of in the middle.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="5j5Z3mRywJXeN9Uy6iQuLg" name="SteelSeries Aeon Pro-6" alt="SteelSeries Aeon Pro" src="https://cdn.mos.cms.futurecdn.net/5j5Z3mRywJXeN9Uy6iQuLg.jpg" mos="" align="middle" fullscreen="" width="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>Aside from the thumbsticks, all the buttons—including the D-Pad—are clicky like a keyboard, which is appropriate for a PC controller. I should add that the triggers only click once you flip the trigger locks to shorten their actuation point. I’m a fan of the <a href="https://www.tomsguide.com/best-picks/best-mechanical-keyboards">best mechanical keyboards</a>, so I’m all about the clicky.</p><p>The back buttons generally don’t bother me because both are positioned where my middle and ring fingers naturally rest. That said, I wish they were removable, as on the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/scuf-valor-pro-review">Scuf Valor Pro</a>. This is a minor thing for me, but it could be frustrating if you’re not a fan of back buttons. Still, I’d rather have four permanent back buttons than none.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="dkHaryt32gioYFxG2hHm9o" name="SteelSeries Aeon Pro-10" alt="SteelSeries Aeon Pro" src="https://cdn.mos.cms.futurecdn.net/dkHaryt32gioYFxG2hHm9o.jpg" mos="" align="middle" fullscreen="" width="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>Lastly, there are the Hall Effect thumbsticks. Even though TMR thumbsticks are all the rage now, Hall Effect — the OG magnetic switch type — still delivers smooth, precise movement, especially compared with traditional analog sticks. And since they’re magnetic instead of analog, you likely won’t have to suffer from stick drift for a long time — if ever.</p><h2 id="an-innovative-dock">An innovative dock</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="5GDrxinx2tbQtNLg9eJ7xG" name="SteelSeries Aeon Pro-9" alt="SteelSeries Aeon Pro" src="https://cdn.mos.cms.futurecdn.net/5GDrxinx2tbQtNLg9eJ7xG.jpg" mos="" align="middle" fullscreen="" width="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>Controller charging stations aren’t new. However, SteelSeries’ QuickSwitch Dock System (as the company calls it) does something I’ve never seen before on a controller dock: it charges a separate battery (included with the controller). So when the battery inside your controller runs out, you can simply swap in the fully charged one and keep playing without a major interruption.</p><p>If that sounds familiar, it’s because this feature comes from SteelSeries’ own <a href="https://www.tomsguide.com/reviews/steelseries-arctis-nova-pro-wireless">Arctis Nova Pro</a> headset, which has a hub that lets you charge its batteries. Best of all, the batteries for that headset and the Aeon Pro are interchangeable. If you own both peripherals, you’ll have four chargeable batteries at your disposal!</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="j3Yq5pvDoHBfLKWPU6BnVb" name="SteelSeries Aeon Pro-8" alt="SteelSeries Aeon Pro" src="https://cdn.mos.cms.futurecdn.net/j3Yq5pvDoHBfLKWPU6BnVb.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Like the Arctis Nova Pro’s hub, the QuickSwitch Dock System lets you connect to your PC and Xbox at the same time via the two USB-C ports on the back. Thanks to this feature, you won’t have to constantly pair and re-pair the controller to whatever platform you’re using, as you would with other controllers.</p><p>Another cool feature is the two slots for extra thumbsticks. One thumbstick is the same size as the two on the controller, only it is convex instead of concave. The other thumbstick is about twice as long for more precise aiming in shooting games. The magnetic thumbsticks snap in and out easily, which is a bonus.</p><p>The compartment for the extra battery sits right under the thumbsticks, and you just press down to lock it in place or release it. This is a simple process, but it’s extremely satisfying to press the battery in and out.</p><h2 id="an-oled-screen-on-a-game-controller">An OLED screen on a game controller?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qGBqF7hLnJndZyT3ZopN7U" name="SteelSeries Aeon Pro-3" alt="SteelSeries Aeon Pro" src="https://cdn.mos.cms.futurecdn.net/qGBqF7hLnJndZyT3ZopN7U.jpg" mos="" align="middle" fullscreen="" width="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>Remapping buttons or fine-tuning thumbstick sensitivity on controllers usually requires you to dive into a dedicated desktop or mobile app. While the SteelSeries GG desktop app exists for that, you can almost effectively ignore it and still customize the Aeon Pro to your liking thanks to the integrated OLED screen.</p><p>On this monochrome screen, you can access profiles, switch between PC and Xbox, monitor battery life, and remap the controls. While the screen isn’t all that large, all the text appears nice and sharp.</p><p>My favorite thing about the OLED is that it quickly shows which profile you’re using, which is especially handy if you have different configurations for different genres or games. This way, I don’t have to open an app to see if I’m using the right profile, or remember which colors correspond to which layouts, like some controllers have you do.</p><p>Though I question why the screen needed to be OLED since it’s monochrome, I can’t complain about the results. Sure, you can make finer adjustments via the GG app, but it’s good that you can configure most of what you’d want right on the controller.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W5ErZW"></div>                            </div>                            <script src="https://kwizly.com/embed/W5ErZW.js" async></script><h2 id="my-new-daily-driver">My new daily driver</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="7YgfF97brCRTreyFWya6oY" name="SteelSeries Aeon Pro-2" alt="SteelSeries Aeon Pro" src="https://cdn.mos.cms.futurecdn.net/7YgfF97brCRTreyFWya6oY.jpg" mos="" align="middle" fullscreen="" width="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>We’ll have a full review of the SteelSeries Aeon Pro controller for you soon, but I wanted to share my thoughts ahead of that since I’ve been enjoying this awesome peripheral for some time. Again, it’s definitely pricey, but given all the cool features it packs, I think it’s worth the money for hardcore PC gamers.</p><p>If you’ve liked what I had to say about the Aeon Pro, then give it a shot. I promise you won’t be disappointed.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><strong></strong><a href="https://www.tomsguide.com/computing/gaming-laptops/alienware-16-area-51-gaming-laptop-2026-review"><strong>I just tested the new Alienware 16 Area-51 — and the OLED panel makes it the complete package</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/computing/laptops/lenovo-yoga-9n-2-in-1-hands-on"><strong>I went hands-on with Lenovo’s RTX Spark-powered Yoga 9n 2-in-1 laptop — and it’s a creative powerhouse</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/gaming/metal-gear-solid-4-on-ps5-is-an-almost-perfect-port-of-my-favorite-ps3-exclusive"><strong>Metal Gear Solid 4 on PS5 is an almost perfect port of my favorite PS3 exclusive</strong></a><strong></strong></li></ul><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=gaming+controllers&min_discount_ratio=0.95&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="8">8 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const finalHref = cardLink.href || cardLink.getAttribute('href') || '';                let actualRevenueId = cardLink.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = this.getRowsLimit();          } else {             this.displayLimit += this.getRowsLimit();          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: this.decodeHTML(item.name || item.title || item.model_name || item.product_name || 'Unknown Product'),            brand: this.decodeHTML(item.brand || ''),            productName: this.decodeHTML(item.model_name || item.product_name || item.name || ''),            merchant: this.decodeHTML(item.merchant_name || item.merchant || item.retailer || 'Retailer'),            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const finalHref = btn.href || btn.getAttribute('href') || '';                let actualRevenueId = btn.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += this.getRowsLimit();                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');               document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I ran Counter-Strike at 600fps to test out Sony’s elite esports monitor — here’s my verdict ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Sony’s elite esports gaming monitor just got, well, even more elite. The Inzone M10S II succeeds (you guessed it) the original M10S — a monitor I know well. I attended the original M10S launch at Gamescom 2024, where I spoke with the Fnatic esports team, who were heavily involved in its design, and the Sony engineers who brought Fnatic’s requests to life.</p><p>The new model shares the same core objectives as its predecessor: to provide professional esports gamers, or those aspiring to be one, with everything they need. As such, the core formula remains largely unchanged: blazing refresh and response rates; an array of features tailored entirely to esports; all combined with Sony’s premium design.</p><p>This time, refresh rates have been boosted in QHD and FHD modes; there’s a new anti-glare coating and a brightness boost, at least on paper. So, is this the <a href="https://www.tomsguide.com/us/best-gaming-monitors,review-3114.html"><u>best gaming monitor</u></a> for elite players? Find out in my full Sony Inzone M10S II review.</p><h2 class="article-body__section" id="section-sony-inzone-m10s-ii-review-cheat-sheet"><span>Sony Inzone M10S II review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>An elite esports gaming monitor</li><li><strong>Who is it for? </strong>Pro esports gamers, or those aspiring to be</li><li><strong>What does it cost? </strong><a href="https://electronics.sony.com/tv-video/gaming-monitors/all-inzone-monitors/p/sdm27q102-b" target="_blank" rel="nofollow">$1,099</a> / <a href="https://www.amazon.co.uk/Sony-INZONE-M10S-Gaming-Monitor/dp/B0GVJFDTB3/" target="_blank" rel="nofollow">£1,199</a></li><li><strong>What do we like? </strong>Be-all, end-all gaming performance and features; premium and thoughtful design</li><li><strong>What don’t we like? </strong>Not the brightest compared to other OLED monitors; USB-A and -B ports only</li></ul><h2 class="article-body__section" id="section-sony-inzone-m10s-ii-review-specs"><span>Sony Inzone M10S II review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://electronics.sony.com/tv-video/gaming-monitors/all-inzone-monitors/p/sdm27q102-b" target="_blank" rel="nofollow">$1,099</a> / <a href="https://www.amazon.co.uk/Sony-INZONE-M10S-Gaming-Monitor/dp/B0GVJFDTB3/" target="_blank" rel="nofollow">£1,199</a></p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>27-inch</p></td></tr><tr><td class="firstcol " ><p><strong>Resolution</strong></p></td><td  ><p>2560 x 1440</p></td></tr><tr><td class="firstcol " ><p><strong>Aspect ratio</strong></p></td><td  ><p>16:9</p></td></tr><tr><td class="firstcol " ><p><strong>Refresh rate</strong></p></td><td  ><p>540Hz (QHD); 720Hz (HD)</p></td></tr><tr><td class="firstcol " ><p><strong>Response time</strong></p></td><td  ><p>0.02ms</p></td></tr><tr><td class="firstcol " ><p><strong>Panel type</strong></p></td><td  ><p>OLED</p></td></tr><tr><td class="firstcol " ><p><strong>Color depth</strong></p></td><td  ><p>10-bit</p></td></tr><tr><td class="firstcol " ><p><strong>Inputs</strong></p></td><td  ><p>DisplayPort 2.1; 2x HDMI 2.1; 1x USB Type-B upstream; 2x USB Type-A downstream; 1x USB Type-A (software update only); 3.5mm jack</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>23.8 x 19.8 x 7.8 inches (with stand)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>13.67 lbs (with stand)</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-sony-inzone-m10s-ii-review-the-ups"><span>Sony Inzone M10S II review: The ups</span></h2><p>The M10S II has one job: to be the ultimate gaming monitor for esports players. With its impressive specs and an extensive array of performance and quality-of-life features, it succeeds. And as a Sony product, it boasts premium looks and a high-quality build.</p><h2 id="ultra-fast-performance">Ultra-fast performance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="dgELH7YWCoEkHwQJffwJaZ" name="Sony_M10S2_ 2.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/dgELH7YWCoEkHwQJffwJaZ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><div  class="fancy-box"><div class="fancy_box-title">Tom's Guide reviews gaming platform</div><div class="fancy_box_body"><p class="fancy-box__body-text"><strong>Supplied by: </strong><a data-analytics-id="inline-link" href="https://www.msi.com/" target="_blank" rel="nofollow"><strong>MSI</strong></a><strong> | Tom's Guide</strong><br><strong></strong><br><strong>CPU:</strong> <a data-analytics-id="inline-link" href="https://www.amazon.com/AMD-7700X-16-Thread-Unlocked-Processor/dp/B0BBHHT8LY/" target="_blank" rel="nofollow">AMD Ryzen 7 7700X</a><strong> </strong>|<strong> Graphics card:</strong> <a data-analytics-id="inline-link" href="https://www.msi.com/Graphics-Card/GeForce-RTX-5070-Ti-16G-VANGUARD-SOC" target="_blank" rel="nofollow">MSI RTX 5070 Ti 16GB Vanguard SOC</a><strong> </strong>|<strong> Motherboard: </strong><a data-analytics-id="inline-link" href="https://www.msi.com/Motherboard/B850-GAMING-PLUS-WIFI" target="_blank" rel="nofollow">MSI B850E Gaming Plus WiFi</a><strong> </strong>|<strong> RAM: </strong><a data-analytics-id="inline-link" href="https://www.newegg.com/kingston-technology-corp-fury-renegade-32gb-ddr5-8000-cas-latency-cl38-desktop-memory-silver-black/p/N82E16820242829" target="_blank" rel="nofollow">Kingston Fury Renegade DDR5 32GB</a><strong> </strong>|<strong> Cooler:</strong> <a data-analytics-id="inline-link" href="https://www.amazon.com/Noctua-NH-U12S-chromax-Black-Single-Tower-Cooler/dp/B07Y88BNYZ" target="_blank">Noctua NH-U12S</a><strong> </strong>|<strong> PSU:</strong> <a data-analytics-id="inline-link" href="https://www.msi.com/Power-Supply/MEG-Ai1300P-PCIE5" target="_blank" rel="nofollow">MSI MEG Ai1300P PCIE5</a><strong> </strong>|<strong> Case: </strong><a data-analytics-id="inline-link" href="https://www.msi.com/PC-Case/MPG-GUNGNIR-110R" target="_blank" rel="nofollow">MSI MPG GUNGNIR 110R</a></p></div></div><p>The M10S II packs so many gaming features that I’ll have to break them up. First, I’ll cover the hardware side of things. And <em>that</em> refresh rate! With 540Hz in QHD mode and up to 720Hz when dropping to 720p (HD), this monitor is absolutely rapid, relaying enemy movement as accurately as possible, with no motion blur or lag.</p><p>With an ultra low response time of 0.02ms gtg (gray to gray, which means how fast the pixels can change color), plus Sony’s Motion Blur Reduction, ghosting is effectively removed. There’s also G-Sync to remove tearing, especially in situations with rapidly changing frame rates. All this means the enemy you’re shooting at is more likely to be exactly where you’re seeing it, and you aren’t shooting its ghost trail or some other artefact.</p><p>I’m not an esports pro, of course, but playing Counter-Strike 2 at 600fps was a smooth experience — though not particularly enjoyable at 720p. Our TG testing rig couldn’t hit the maximum 720fps, even with Counter-Strike set to low and running at 720p, but topping out at 600fps was still pretty cool. At 1440p with Counter-Strike on high settings, our testing rig still hit around 400fps.</p><p>The original M10S looks like a tortoise in comparison, topping out at <em><strong>only</strong></em> 480Hz and a <em><strong>mere</strong></em> 0.03ms response time. Our favorite high-refresh-rate monitor (up to now), the <a href="https://www.tomsguide.com/computing/monitors/msi-mag-272qp-qd-oled-x50-review"><u>MSI MAG 272QP QD-OLED X50</u></a> ($749), manages <em><strong>just</strong></em> 500Hz.</p><h2 id="plethora-of-gaming-features">Plethora of gaming features</h2><p>The M10S II also offers a comprehensive array of gaming features designed to suit elite gamers — like the Fnatic team. There’s a 24.5-inch tournament crop for competition practice, and two FPS modes, FPS Pro (which simulates an LCD) and FPS Pro+, which adjust contrast ratios to make enemy detection easier, especially in dimly lit game scenarios. I especially enjoyed using FPS Pro when playing Hell Let Loose, particularly on darker nighttime maps, as it lifted the blacks a little to help me spot enemies hiding in bushes.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="S4SAwUmha8JfVBRu7TriZa" name="Sony_M10S2_ 5.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/S4SAwUmha8JfVBRu7TriZa.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Those aren’t the only game modes, though, as there’s a specific MOBA/RTS mode, as well as a general game mode for casual play.</p><p>There’s also an on-screen crosshair with a variety of crosshair types to choose from. I found this really handy in Counter-Strike 2, where many guns have no ADS mode and the in-game crosshair expands and contracts with movement and movement penalties. It was also super useful in Hell Let Loose, as it allowed me to more accurately fire from the hip and score reflex kills on enemies popping up from bushes or around corners, which I might otherwise have missed.</p><p>On that note, there’s also a black equalizer mode to brighten shadows without affecting lighter areas of the screen. This is handy if you’re already in a game-specific mode and only want to boost shadows, or if affecting highlights would hamper your performance.</p><h2 id="plus-some-useful-qol-features">Plus some useful QoL features</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6ZRAudYR7PuyXrwbVscXiZ" name="Sony_M10S2_ 3.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/6ZRAudYR7PuyXrwbVscXiZ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I also appreciate some of the quality-of-life (QoL) features found in the M10S range. The M10S II, like its predecessor, is designed with setup flexibility as a key consideration, and plenty of attention has been paid to the details.</p><p>In particular, there’s the stand. The M10S II features the same cantilevered stand as its predecessor. I actually spoke to the engineer who designed this stand at the original M10S press briefing — the stand was his passion project because he was trying to solve an issue he had with monitors. The cantilever channels all the weight into the center for perfect balance, allowing Sony to keep the base small.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/EmMsEVzXmWDZwR9XjPvFYF.jpg" alt="A keyboard about to be slid over the M10S II's base stand" /><figcaption>Before!<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/xD4knPrxjzJpq95fLuAYTF.jpg" alt="A keyboard over the M10S II's base stand" /><figcaption>After!<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/AmxfvLVC93t7jNrUE2ZFaF.jpg" alt="The Sony M10S II's cable tidy" /><figcaption>And the cable tidy doing its job admirably.<small role="credit">Future</small></figcaption></figure></figure><p>The M10S II is therefore much easier to position than many other monitors. The M10S II replaced my <a href="https://www.tomsguide.com/computing/monitors/lenovo-legion-r27qe-gen-2-review"><u>Lenovo Legion R27qe Gen 2</u></a> (£199, U.K. only), with its enormous tripod stand — with the Sony, my desk felt so much more spacious and open, and for once I had room for other products I was testing. The base is also extremely thin, deliberately designed so you can slide your keyboard over it and keep your desk tidy when not in use. The arm swivels, so you can adjust the monitor's rotation without having to pick up and move the whole assembly. And there's a neat cable tidy to, well, keep your cables tidy!</p><p>I’m also a big fan of the anti-glare coating on the screen. I work with a window behind me in the office, along with overhead lighting. I was able to game and work on the M10S II for hours without eye strain or headaches.</p><h2 id="accurate-color-rendition">Accurate color rendition</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="s2sHA2gKHAZTa69V3Et8Ha" name="Sony_M10S2_ 4.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/s2sHA2gKHAZTa69V3Et8Ha.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>While the M10S II isn’t a production monitor, it’s still important that the panel reproduces color accurately. Thankfully, the M10S II does! As you can see in our lab test results below, the M10S II achieved a Delta-E score of 0.26. This score measures how closely the on-screen color matches the color sent to the display by the computer, and the lower the better.</p><div ><table><thead><tr><th class="firstcol " ><p><strong>Product name</strong></p></th><th  ><p><strong>Panel type</strong></p></th><th  ><p><strong>Delta E</strong></p></th><th  ><p><strong>sRGB volume</strong></p></th><th  ><p><strong>DCI P3 volume</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Sony Inzone M10S II</strong></p></td><td  ><p>OLED</p></td><td  ><p>0.26</p></td><td  ><p>185.80%</p></td><td  ><p>131.60%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/msi-mpg-272urx-qd-oled-monitor-review"><strong>MSI MPG 272URX QD-OLED</strong></a></p></td><td  ><p>OLED</p></td><td  ><p>0.15</p></td><td  ><p>131%</p></td><td  ><p>97%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/lenovo-legion-pro-34wd-10-oled-review"><strong>Lenovo Legion Pro 34WD10</strong></a></p></td><td  ><p>OLED</p></td><td  ><p>0.08</p></td><td  ><p>156.40%</p></td><td  ><p>110.80%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/alienware-aw2725q-gaming-monitor-review"><strong>Alienware AW2725Q</strong></a></p></td><td  ><p>QD-OLED</p></td><td  ><p>0.06</p></td><td  ><p>182.50%</p></td><td  ><p>129.30%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/msi-mag-272qp-qd-oled-x50-review"><strong>MSI MAG 272 QP QD-OLED X50</strong></a></p></td><td  ><p>OLED</p></td><td  ><p>0.11</p></td><td  ><p>192.90%</p></td><td  ><p>136.70%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/msi-mpg-341cqr-qd-oled-x36-review"><strong>MSI MPG 341CQR QD-OLED X36</strong></a></p></td><td  ><p>QD-OLED</p></td><td  ><p>0.15</p></td><td  ><p>166.30%</p></td><td  ><p>117.80%</p></td></tr></tbody></table></div><p>A 0.26 Delta-E isn’t as good as some of the other gaming monitors we’ve tested, such as the Alienware AW2525HM, MSI MAG 272 QP, or MSI MPG 341CQR QD-OLED X36. But it’s still fairly respectable, and it means the colors you’re seeing on screen are rendered accurately.</p><p>The M10S II also covers both the sRGB and DCI-P3 color gamuts. What does that mean? Games are mastered in sRGB for SDR and in DCI-P3 for HDR, so the M10S II can reproduce every unique color in every game you play.</p><p>Now, an ultra-wide gamut can cause oversaturation in those spaces, resulting in an unnatural, neon effect. So, more technically isn’t always better. But while colors appear very bold and vivid on the M10S II, they didn’t feel overdone. And besides, there are sRGB and Cinema (for DCI-P3) color modes if you want to ensure strict accuracy to those gamuts.</p><h2 id="sony-s-typically-premium-design">Sony’s typically premium design</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="TKK6c4T63tdmtZJU3kNfba" name="Sony_M10S2_ 8.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/TKK6c4T63tdmtZJU3kNfba.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Unsurprisingly, as this is a Sony product, the M10S II is built extremely well. The monitor looks and feels premium, with high-quality materials used throughout.</p><p>The rear of the display is finished in textured metal rather than plastic. The stand and base are also made from metal and feel extremely sturdy. It simply feels built to last, and there’s a three-year warranty to back it up anyway.</p><h2 id="arguably-good-value">Arguably good value</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LarUzNpMtjrLRDAFWrQmuZ" name="Sony_M10S2_ 6.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/LarUzNpMtjrLRDAFWrQmuZ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>This might sound a little odd given that the M10S II costs <a href="https://electronics.sony.com/tv-video/gaming-monitors/all-inzone-monitors/p/sdm27q102-b" target="_blank" rel="nofollow"><u>$1,099</u></a> / <a href="https://www.amazon.co.uk/Sony-INZONE-M10S-Gaming-Monitor/dp/B0GVJFDTB3/" target="_blank" rel="nofollow"><u>£1,199</u></a>, but I’d argue it’s fairly good value. It’s not uncommon for gaming monitors to push well beyond the $1,000 mark. The <a href="https://www.tomsguide.com/computing/monitors/lenovo-legion-pro-34wd-10-oled-review"><u>Lenovo Legion Pro 34WD-10 OLED</u></a>, for example, launched at $1,099. The <a href="https://www.tomsguide.com/reviews/samsung-odyssey-oled-g9"><u>Samsung Odyssey OLED G9</u></a>, meanwhile, launched at $1,799.</p><p>I know: those are ultrawides, and their prices have dropped since launch. But what I mean here is that the M10S II isn’t priced beyond the pale. And yet it offers superb performance for elite gamers. If you’re one of those people, the M10S II could make strong financial and competitive sense.</p><h2 class="article-body__section" id="section-sony-inzone-m10s-ii-review-the-downs"><span>Sony Inzone M10S II review: The downs</span></h2><p>The Inzone M10S II doesn’t have many faults. However, it’s not the brightest OLED we’ve lab tested, and the USB ports on the underside are pretty dated.</p><h2 id="not-the-brightest">Not the brightest</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HZwVkRiBJBLqzXttnbMSga" name="Sony_M10S2_ 7.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/HZwVkRiBJBLqzXttnbMSga.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>We don’t like to rely on manufacturer claims, which are often best-case scenarios and can be a tad (to say the least) unrealistic. As such, as part of our lab testing process, we also measure peak SDR and HDR brightness.</p><div ><table><thead><tr><th class="firstcol " ><p><strong>Product name</strong></p></th><th  ><p><strong>Panel type</strong></p></th><th  ><p><strong>Nits (HDR, at 10%)</strong></p></th><th  ><p><strong>Nits (SDR)</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Sony Inzone M10S II</strong></p></td><td  ><p>OLED</p></td><td  ><p>146 </p></td><td  ><p>231</p></td></tr><tr><td class="firstcol " ><p><strong>MSI MPG 272URX QD-OLED</strong></p></td><td  ><p>OLED</p></td><td  ><p>449 </p></td><td  ><p>254</p></td></tr><tr><td class="firstcol " ><p><strong>Lenovo Legion Pro 34WD10</strong></p></td><td  ><p>OLED</p></td><td  ><p>443</p></td><td  ><p>265</p></td></tr><tr><td class="firstcol " ><p><strong>Alienware AW2725Q</strong></p></td><td  ><p>QD-OLED</p></td><td  ><p>334</p></td><td  ><p>250 </p></td></tr><tr><td class="firstcol " ><p><strong>MSI MAG 272 QP</strong></p></td><td  ><p>OLED</p></td><td  ><p>284 </p></td><td  ><p>289</p></td></tr><tr><td class="firstcol " ><p><strong>MSI MPG 341CQR QD-OLED X36</strong></p></td><td  ><p>QD-OLED</p></td><td  ><p>413</p></td><td  ><p>280</p></td></tr></tbody></table></div><p>As you can see in the test results, the M10S II isn’t as bright as other OLED gaming panels we’ve tested and is well below the (rather ambitious) 1,500-nit peak brightness claimed by Sony.</p><p>Still, when you think about it, this monitor’s primary purpose is to be used in a dark room. And besides, figures alone don’t always tell the full story, and I certainly wouldn’t let our measured peak brightness put you off buying this monitor. I’ve had no issues using it in bright environments, largely thanks to the anti-glare coating. And I never struggled with darker in-game scenarios, thanks to the different color modes and black point equalizer.</p><h2 id="dated-usb-ports">Dated USB ports</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="QMNtiWvm7wPDH9KhHvZa3a" name="Sony_M10S2_ 9.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/QMNtiWvm7wPDH9KhHvZa3a.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>My only other gripe with the M10S II is that it uses fairly dated ports, at least when it comes to USB (with HDMI 2.1 and DisplayPort 2.1, the video ports are just fine). There are two USB-A downstream ports and a USB-B upstream port. These are outdated, and it would’ve been nice to see at least a USB-C port or two.</p><p>Again, it’s important to remember use cases here. I’m not going to complain about the lack of a Thunderbolt port or KVM controller on a monitor that isn’t designed for productivity, but come on, it’s 2026… how can Sony fit a Type-B but not a single Type-C?</p><h2 class="article-body__section" id="section-sony-inzone-m10s-ii-review-verdict"><span>Sony Inzone M10S II review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xdncXHJiq6rPWsCo2R3LFa" name="Sony_M10S2_.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/xdncXHJiq6rPWsCo2R3LFa.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>If you want the fastest and most feature-packed gaming monitor around, especially if you’re an elite competitive player or aspiring pro, I wholeheartedly recommend the Sony Inzone M10S II.</p><p>Its flaws are very few and fairly minor. What’s more, it not only delivers blazing-fast hardware performance but also a huge roster of genuinely useful gaming tools and thoughtful quality-of-life features! Then there’s Sony’s usual build quality and a fairly reasonable price tag, all things considered. I’m genuinely rather sad to be giving it back to Sony!</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/monitors/sony-inzone-m10s-ii-review</link>
                                                                            <description>
                            <![CDATA[ The Sony Inzone M10S II is ultra fast, built beautifully and packs plenty of gaming features. Its flaws are few, although it isn't the brightest. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">JbAH7NarBmT6NbfUPdwVZR</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/xdncXHJiq6rPWsCo2R3LFa-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 11 Sep 2026 12:02:35 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Monitors]]></category>
                                                    <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Computing Hardware]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                <author><![CDATA[ peter.wolinski@futurenet.com (Peter Wolinski) ]]></author>                    <dc:creator><![CDATA[ Peter Wolinski ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/stgPfXWY7ukw8J8rfC7vjg.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Peter is a Senior Editor at Tom&#039;s Guide, heading up the site&#039;s Reviews team and Cameras section. Having built gaming PCs since he was 10 (that&#039;s a while ago now) he&#039;s a bit of a nerd about components and hardware. He&#039;s also been an iPhone user since the classic iPhone 4, and a Mac user for well over a decade. Experienced in using and testing all kinds of technology — from phones through to tablets, computers, games consoles, cameras and smart home tech — helping people find the best tech for them (at the best prices) is what Peter does best. A photographer since he bought his first camera (a Fujifilm) in 2015, Peter was previously an Editor for Canon-Europe.com. He then edited the Cameras and How To sections of Tom&#039;s Guide. When he&#039;s not crafting helpful, in-depth reviews, Peter can usually be found out and about honing his architectural photography skills, riding his motorcycle around Welsh mountain roads, telling everyone about his two greyhounds, squeezing a few extra FPS out of PC games or perfecting his espresso shots.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/xdncXHJiq6rPWsCo2R3LFa-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Sony Inzone M10S II against a blue gradient background]]></media:description>                                                            <media:text><![CDATA[The Sony Inzone M10S II against a blue gradient background]]></media:text>
                                <media:title type="plain"><![CDATA[The Sony Inzone M10S II against a blue gradient background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/xdncXHJiq6rPWsCo2R3LFa-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Sony’s elite esports gaming monitor just got, well, even more elite. The Inzone M10S II succeeds (you guessed it) the original M10S — a monitor I know well. I attended the original M10S launch at Gamescom 2024, where I spoke with the Fnatic esports team, who were heavily involved in its design, and the Sony engineers who brought Fnatic’s requests to life.</p><p>The new model shares the same core objectives as its predecessor: to provide professional esports gamers, or those aspiring to be one, with everything they need. As such, the core formula remains largely unchanged: blazing refresh and response rates; an array of features tailored entirely to esports; all combined with Sony’s premium design.</p><p>This time, refresh rates have been boosted in QHD and FHD modes; there’s a new anti-glare coating and a brightness boost, at least on paper. So, is this the <a href="https://www.tomsguide.com/us/best-gaming-monitors,review-3114.html"><u>best gaming monitor</u></a> for elite players? Find out in my full Sony Inzone M10S II review.</p><h2 class="article-body__section" id="section-sony-inzone-m10s-ii-review-cheat-sheet"><span>Sony Inzone M10S II review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>An elite esports gaming monitor</li><li><strong>Who is it for? </strong>Pro esports gamers, or those aspiring to be</li><li><strong>What does it cost? </strong><a href="https://electronics.sony.com/tv-video/gaming-monitors/all-inzone-monitors/p/sdm27q102-b" target="_blank" rel="nofollow">$1,099</a> / <a href="https://www.amazon.co.uk/Sony-INZONE-M10S-Gaming-Monitor/dp/B0GVJFDTB3/" target="_blank" rel="nofollow">£1,199</a></li><li><strong>What do we like? </strong>Be-all, end-all gaming performance and features; premium and thoughtful design</li><li><strong>What don’t we like? </strong>Not the brightest compared to other OLED monitors; USB-A and -B ports only</li></ul><h2 class="article-body__section" id="section-sony-inzone-m10s-ii-review-specs"><span>Sony Inzone M10S II review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://electronics.sony.com/tv-video/gaming-monitors/all-inzone-monitors/p/sdm27q102-b" target="_blank" rel="nofollow">$1,099</a> / <a href="https://www.amazon.co.uk/Sony-INZONE-M10S-Gaming-Monitor/dp/B0GVJFDTB3/" target="_blank" rel="nofollow">£1,199</a></p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>27-inch</p></td></tr><tr><td class="firstcol " ><p><strong>Resolution</strong></p></td><td  ><p>2560 x 1440</p></td></tr><tr><td class="firstcol " ><p><strong>Aspect ratio</strong></p></td><td  ><p>16:9</p></td></tr><tr><td class="firstcol " ><p><strong>Refresh rate</strong></p></td><td  ><p>540Hz (QHD); 720Hz (HD)</p></td></tr><tr><td class="firstcol " ><p><strong>Response time</strong></p></td><td  ><p>0.02ms</p></td></tr><tr><td class="firstcol " ><p><strong>Panel type</strong></p></td><td  ><p>OLED</p></td></tr><tr><td class="firstcol " ><p><strong>Color depth</strong></p></td><td  ><p>10-bit</p></td></tr><tr><td class="firstcol " ><p><strong>Inputs</strong></p></td><td  ><p>DisplayPort 2.1; 2x HDMI 2.1; 1x USB Type-B upstream; 2x USB Type-A downstream; 1x USB Type-A (software update only); 3.5mm jack</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>23.8 x 19.8 x 7.8 inches (with stand)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>13.67 lbs (with stand)</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-sony-inzone-m10s-ii-review-the-ups"><span>Sony Inzone M10S II review: The ups</span></h2><p>The M10S II has one job: to be the ultimate gaming monitor for esports players. With its impressive specs and an extensive array of performance and quality-of-life features, it succeeds. And as a Sony product, it boasts premium looks and a high-quality build.</p><h2 id="ultra-fast-performance">Ultra-fast performance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="dgELH7YWCoEkHwQJffwJaZ" name="Sony_M10S2_ 2.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/dgELH7YWCoEkHwQJffwJaZ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><div  class="fancy-box"><div class="fancy_box-title">Tom's Guide reviews gaming platform</div><div class="fancy_box_body"><p class="fancy-box__body-text"><strong>Supplied by: </strong><a data-analytics-id="inline-link" href="https://www.msi.com/" target="_blank" rel="nofollow"><strong>MSI</strong></a><strong> | Tom's Guide</strong><br><strong></strong><br><strong>CPU:</strong> <a data-analytics-id="inline-link" href="https://www.amazon.com/AMD-7700X-16-Thread-Unlocked-Processor/dp/B0BBHHT8LY/" target="_blank" rel="nofollow">AMD Ryzen 7 7700X</a><strong> </strong>|<strong> Graphics card:</strong> <a data-analytics-id="inline-link" href="https://www.msi.com/Graphics-Card/GeForce-RTX-5070-Ti-16G-VANGUARD-SOC" target="_blank" rel="nofollow">MSI RTX 5070 Ti 16GB Vanguard SOC</a><strong> </strong>|<strong> Motherboard: </strong><a data-analytics-id="inline-link" href="https://www.msi.com/Motherboard/B850-GAMING-PLUS-WIFI" target="_blank" rel="nofollow">MSI B850E Gaming Plus WiFi</a><strong> </strong>|<strong> RAM: </strong><a data-analytics-id="inline-link" href="https://www.newegg.com/kingston-technology-corp-fury-renegade-32gb-ddr5-8000-cas-latency-cl38-desktop-memory-silver-black/p/N82E16820242829" target="_blank" rel="nofollow">Kingston Fury Renegade DDR5 32GB</a><strong> </strong>|<strong> Cooler:</strong> <a data-analytics-id="inline-link" href="https://www.amazon.com/Noctua-NH-U12S-chromax-Black-Single-Tower-Cooler/dp/B07Y88BNYZ" target="_blank">Noctua NH-U12S</a><strong> </strong>|<strong> PSU:</strong> <a data-analytics-id="inline-link" href="https://www.msi.com/Power-Supply/MEG-Ai1300P-PCIE5" target="_blank" rel="nofollow">MSI MEG Ai1300P PCIE5</a><strong> </strong>|<strong> Case: </strong><a data-analytics-id="inline-link" href="https://www.msi.com/PC-Case/MPG-GUNGNIR-110R" target="_blank" rel="nofollow">MSI MPG GUNGNIR 110R</a></p></div></div><p>The M10S II packs so many gaming features that I’ll have to break them up. First, I’ll cover the hardware side of things. And <em>that</em> refresh rate! With 540Hz in QHD mode and up to 720Hz when dropping to 720p (HD), this monitor is absolutely rapid, relaying enemy movement as accurately as possible, with no motion blur or lag.</p><p>With an ultra low response time of 0.02ms gtg (gray to gray, which means how fast the pixels can change color), plus Sony’s Motion Blur Reduction, ghosting is effectively removed. There’s also G-Sync to remove tearing, especially in situations with rapidly changing frame rates. All this means the enemy you’re shooting at is more likely to be exactly where you’re seeing it, and you aren’t shooting its ghost trail or some other artefact.</p><p>I’m not an esports pro, of course, but playing Counter-Strike 2 at 600fps was a smooth experience — though not particularly enjoyable at 720p. Our TG testing rig couldn’t hit the maximum 720fps, even with Counter-Strike set to low and running at 720p, but topping out at 600fps was still pretty cool. At 1440p with Counter-Strike on high settings, our testing rig still hit around 400fps.</p><p>The original M10S looks like a tortoise in comparison, topping out at <em><strong>only</strong></em> 480Hz and a <em><strong>mere</strong></em> 0.03ms response time. Our favorite high-refresh-rate monitor (up to now), the <a href="https://www.tomsguide.com/computing/monitors/msi-mag-272qp-qd-oled-x50-review"><u>MSI MAG 272QP QD-OLED X50</u></a> ($749), manages <em><strong>just</strong></em> 500Hz.</p><h2 id="plethora-of-gaming-features">Plethora of gaming features</h2><p>The M10S II also offers a comprehensive array of gaming features designed to suit elite gamers — like the Fnatic team. There’s a 24.5-inch tournament crop for competition practice, and two FPS modes, FPS Pro (which simulates an LCD) and FPS Pro+, which adjust contrast ratios to make enemy detection easier, especially in dimly lit game scenarios. I especially enjoyed using FPS Pro when playing Hell Let Loose, particularly on darker nighttime maps, as it lifted the blacks a little to help me spot enemies hiding in bushes.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="S4SAwUmha8JfVBRu7TriZa" name="Sony_M10S2_ 5.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/S4SAwUmha8JfVBRu7TriZa.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Those aren’t the only game modes, though, as there’s a specific MOBA/RTS mode, as well as a general game mode for casual play.</p><p>There’s also an on-screen crosshair with a variety of crosshair types to choose from. I found this really handy in Counter-Strike 2, where many guns have no ADS mode and the in-game crosshair expands and contracts with movement and movement penalties. It was also super useful in Hell Let Loose, as it allowed me to more accurately fire from the hip and score reflex kills on enemies popping up from bushes or around corners, which I might otherwise have missed.</p><p>On that note, there’s also a black equalizer mode to brighten shadows without affecting lighter areas of the screen. This is handy if you’re already in a game-specific mode and only want to boost shadows, or if affecting highlights would hamper your performance.</p><h2 id="plus-some-useful-qol-features">Plus some useful QoL features</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6ZRAudYR7PuyXrwbVscXiZ" name="Sony_M10S2_ 3.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/6ZRAudYR7PuyXrwbVscXiZ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I also appreciate some of the quality-of-life (QoL) features found in the M10S range. The M10S II, like its predecessor, is designed with setup flexibility as a key consideration, and plenty of attention has been paid to the details.</p><p>In particular, there’s the stand. The M10S II features the same cantilevered stand as its predecessor. I actually spoke to the engineer who designed this stand at the original M10S press briefing — the stand was his passion project because he was trying to solve an issue he had with monitors. The cantilever channels all the weight into the center for perfect balance, allowing Sony to keep the base small.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/EmMsEVzXmWDZwR9XjPvFYF.jpg" alt="A keyboard about to be slid over the M10S II's base stand" /><figcaption>Before!<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/xD4knPrxjzJpq95fLuAYTF.jpg" alt="A keyboard over the M10S II's base stand" /><figcaption>After!<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/AmxfvLVC93t7jNrUE2ZFaF.jpg" alt="The Sony M10S II's cable tidy" /><figcaption>And the cable tidy doing its job admirably.<small role="credit">Future</small></figcaption></figure></figure><p>The M10S II is therefore much easier to position than many other monitors. The M10S II replaced my <a href="https://www.tomsguide.com/computing/monitors/lenovo-legion-r27qe-gen-2-review"><u>Lenovo Legion R27qe Gen 2</u></a> (£199, U.K. only), with its enormous tripod stand — with the Sony, my desk felt so much more spacious and open, and for once I had room for other products I was testing. The base is also extremely thin, deliberately designed so you can slide your keyboard over it and keep your desk tidy when not in use. The arm swivels, so you can adjust the monitor's rotation without having to pick up and move the whole assembly. And there's a neat cable tidy to, well, keep your cables tidy!</p><p>I’m also a big fan of the anti-glare coating on the screen. I work with a window behind me in the office, along with overhead lighting. I was able to game and work on the M10S II for hours without eye strain or headaches.</p><h2 id="accurate-color-rendition">Accurate color rendition</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="s2sHA2gKHAZTa69V3Et8Ha" name="Sony_M10S2_ 4.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/s2sHA2gKHAZTa69V3Et8Ha.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>While the M10S II isn’t a production monitor, it’s still important that the panel reproduces color accurately. Thankfully, the M10S II does! As you can see in our lab test results below, the M10S II achieved a Delta-E score of 0.26. This score measures how closely the on-screen color matches the color sent to the display by the computer, and the lower the better.</p><div ><table><thead><tr><th class="firstcol " ><p><strong>Product name</strong></p></th><th  ><p><strong>Panel type</strong></p></th><th  ><p><strong>Delta E</strong></p></th><th  ><p><strong>sRGB volume</strong></p></th><th  ><p><strong>DCI P3 volume</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Sony Inzone M10S II</strong></p></td><td  ><p>OLED</p></td><td  ><p>0.26</p></td><td  ><p>185.80%</p></td><td  ><p>131.60%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/msi-mpg-272urx-qd-oled-monitor-review"><strong>MSI MPG 272URX QD-OLED</strong></a></p></td><td  ><p>OLED</p></td><td  ><p>0.15</p></td><td  ><p>131%</p></td><td  ><p>97%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/lenovo-legion-pro-34wd-10-oled-review"><strong>Lenovo Legion Pro 34WD10</strong></a></p></td><td  ><p>OLED</p></td><td  ><p>0.08</p></td><td  ><p>156.40%</p></td><td  ><p>110.80%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/alienware-aw2725q-gaming-monitor-review"><strong>Alienware AW2725Q</strong></a></p></td><td  ><p>QD-OLED</p></td><td  ><p>0.06</p></td><td  ><p>182.50%</p></td><td  ><p>129.30%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/msi-mag-272qp-qd-oled-x50-review"><strong>MSI MAG 272 QP QD-OLED X50</strong></a></p></td><td  ><p>OLED</p></td><td  ><p>0.11</p></td><td  ><p>192.90%</p></td><td  ><p>136.70%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/msi-mpg-341cqr-qd-oled-x36-review"><strong>MSI MPG 341CQR QD-OLED X36</strong></a></p></td><td  ><p>QD-OLED</p></td><td  ><p>0.15</p></td><td  ><p>166.30%</p></td><td  ><p>117.80%</p></td></tr></tbody></table></div><p>A 0.26 Delta-E isn’t as good as some of the other gaming monitors we’ve tested, such as the Alienware AW2525HM, MSI MAG 272 QP, or MSI MPG 341CQR QD-OLED X36. But it’s still fairly respectable, and it means the colors you’re seeing on screen are rendered accurately.</p><p>The M10S II also covers both the sRGB and DCI-P3 color gamuts. What does that mean? Games are mastered in sRGB for SDR and in DCI-P3 for HDR, so the M10S II can reproduce every unique color in every game you play.</p><p>Now, an ultra-wide gamut can cause oversaturation in those spaces, resulting in an unnatural, neon effect. So, more technically isn’t always better. But while colors appear very bold and vivid on the M10S II, they didn’t feel overdone. And besides, there are sRGB and Cinema (for DCI-P3) color modes if you want to ensure strict accuracy to those gamuts.</p><h2 id="sony-s-typically-premium-design">Sony’s typically premium design</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="TKK6c4T63tdmtZJU3kNfba" name="Sony_M10S2_ 8.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/TKK6c4T63tdmtZJU3kNfba.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Unsurprisingly, as this is a Sony product, the M10S II is built extremely well. The monitor looks and feels premium, with high-quality materials used throughout.</p><p>The rear of the display is finished in textured metal rather than plastic. The stand and base are also made from metal and feel extremely sturdy. It simply feels built to last, and there’s a three-year warranty to back it up anyway.</p><h2 id="arguably-good-value">Arguably good value</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LarUzNpMtjrLRDAFWrQmuZ" name="Sony_M10S2_ 6.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/LarUzNpMtjrLRDAFWrQmuZ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>This might sound a little odd given that the M10S II costs <a href="https://electronics.sony.com/tv-video/gaming-monitors/all-inzone-monitors/p/sdm27q102-b" target="_blank" rel="nofollow"><u>$1,099</u></a> / <a href="https://www.amazon.co.uk/Sony-INZONE-M10S-Gaming-Monitor/dp/B0GVJFDTB3/" target="_blank" rel="nofollow"><u>£1,199</u></a>, but I’d argue it’s fairly good value. It’s not uncommon for gaming monitors to push well beyond the $1,000 mark. The <a href="https://www.tomsguide.com/computing/monitors/lenovo-legion-pro-34wd-10-oled-review"><u>Lenovo Legion Pro 34WD-10 OLED</u></a>, for example, launched at $1,099. The <a href="https://www.tomsguide.com/reviews/samsung-odyssey-oled-g9"><u>Samsung Odyssey OLED G9</u></a>, meanwhile, launched at $1,799.</p><p>I know: those are ultrawides, and their prices have dropped since launch. But what I mean here is that the M10S II isn’t priced beyond the pale. And yet it offers superb performance for elite gamers. If you’re one of those people, the M10S II could make strong financial and competitive sense.</p><h2 class="article-body__section" id="section-sony-inzone-m10s-ii-review-the-downs"><span>Sony Inzone M10S II review: The downs</span></h2><p>The Inzone M10S II doesn’t have many faults. However, it’s not the brightest OLED we’ve lab tested, and the USB ports on the underside are pretty dated.</p><h2 id="not-the-brightest">Not the brightest</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HZwVkRiBJBLqzXttnbMSga" name="Sony_M10S2_ 7.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/HZwVkRiBJBLqzXttnbMSga.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>We don’t like to rely on manufacturer claims, which are often best-case scenarios and can be a tad (to say the least) unrealistic. As such, as part of our lab testing process, we also measure peak SDR and HDR brightness.</p><div ><table><thead><tr><th class="firstcol " ><p><strong>Product name</strong></p></th><th  ><p><strong>Panel type</strong></p></th><th  ><p><strong>Nits (HDR, at 10%)</strong></p></th><th  ><p><strong>Nits (SDR)</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Sony Inzone M10S II</strong></p></td><td  ><p>OLED</p></td><td  ><p>146 </p></td><td  ><p>231</p></td></tr><tr><td class="firstcol " ><p><strong>MSI MPG 272URX QD-OLED</strong></p></td><td  ><p>OLED</p></td><td  ><p>449 </p></td><td  ><p>254</p></td></tr><tr><td class="firstcol " ><p><strong>Lenovo Legion Pro 34WD10</strong></p></td><td  ><p>OLED</p></td><td  ><p>443</p></td><td  ><p>265</p></td></tr><tr><td class="firstcol " ><p><strong>Alienware AW2725Q</strong></p></td><td  ><p>QD-OLED</p></td><td  ><p>334</p></td><td  ><p>250 </p></td></tr><tr><td class="firstcol " ><p><strong>MSI MAG 272 QP</strong></p></td><td  ><p>OLED</p></td><td  ><p>284 </p></td><td  ><p>289</p></td></tr><tr><td class="firstcol " ><p><strong>MSI MPG 341CQR QD-OLED X36</strong></p></td><td  ><p>QD-OLED</p></td><td  ><p>413</p></td><td  ><p>280</p></td></tr></tbody></table></div><p>As you can see in the test results, the M10S II isn’t as bright as other OLED gaming panels we’ve tested and is well below the (rather ambitious) 1,500-nit peak brightness claimed by Sony.</p><p>Still, when you think about it, this monitor’s primary purpose is to be used in a dark room. And besides, figures alone don’t always tell the full story, and I certainly wouldn’t let our measured peak brightness put you off buying this monitor. I’ve had no issues using it in bright environments, largely thanks to the anti-glare coating. And I never struggled with darker in-game scenarios, thanks to the different color modes and black point equalizer.</p><h2 id="dated-usb-ports">Dated USB ports</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="QMNtiWvm7wPDH9KhHvZa3a" name="Sony_M10S2_ 9.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/QMNtiWvm7wPDH9KhHvZa3a.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>My only other gripe with the M10S II is that it uses fairly dated ports, at least when it comes to USB (with HDMI 2.1 and DisplayPort 2.1, the video ports are just fine). There are two USB-A downstream ports and a USB-B upstream port. These are outdated, and it would’ve been nice to see at least a USB-C port or two.</p><p>Again, it’s important to remember use cases here. I’m not going to complain about the lack of a Thunderbolt port or KVM controller on a monitor that isn’t designed for productivity, but come on, it’s 2026… how can Sony fit a Type-B but not a single Type-C?</p><h2 class="article-body__section" id="section-sony-inzone-m10s-ii-review-verdict"><span>Sony Inzone M10S II review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xdncXHJiq6rPWsCo2R3LFa" name="Sony_M10S2_.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/xdncXHJiq6rPWsCo2R3LFa.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>If you want the fastest and most feature-packed gaming monitor around, especially if you’re an elite competitive player or aspiring pro, I wholeheartedly recommend the Sony Inzone M10S II.</p><p>Its flaws are very few and fairly minor. What’s more, it not only delivers blazing-fast hardware performance but also a huge roster of genuinely useful gaming tools and thoughtful quality-of-life features! Then there’s Sony’s usual build quality and a fairly reasonable price tag, all things considered. I’m genuinely rather sad to be giving it back to Sony!</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The Asus ROG Kithara sounds amazing, but here’s why you shouldn’t buy it at full price ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Asus ROG Kithara is a premium open back gaming headset and a collaboration between Asus and HIFIMAN — renowned manufacturer of affordable audiophile headphones.</p><p>Asus promises incredible sound from the Kithara, with the detail and soundstage of HIFIMAN’s open back cans. And, yeah, the headset delivers pretty much exactly that. It’s also lightweight and comfortable, simple to operate, and great for music too.</p><p>Unfortunately, the usual afflictions of HIFIMAN gear appear, with a cheap headband that needs tightening to avoid slippage. Its mic is lackluster, and compounding both these issues is an unwarrantable price tag of nearly $300. </p><p>But could this still be one of the <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets%5C">best gaming headsets</a> for audiophiles? Find out in my full Asus ROG Kithara review.  </p><h2 class="article-body__section" id="section-asus-rog-kithara-review-cheat-sheet"><span>Asus ROG Kithara review: Cheat sheet</span></h2><ul><li><strong>What is it?</strong> A premium open back gaming headset, and collab between Asus and HIFIMAN</li><li><strong>Who is it for? </strong>Gamers wanting spacious, audiophile-tier sound</li><li><strong>What does it cost? </strong>A whopping <a href="https://www.amazon.com/ASUS-ROG-Audiophile-Open-Back-Headphones/dp/B0GG53SPJC" target="_blank" rel="nofollow">$299</a> / <a href="https://www.amazon.co.uk/ASUS-ROG-Audiophile-Headphones-Microphone-Black/dp/B0GG53SPJC" target="_blank" rel="nofollow">£285</a></li><li><strong>What do we like? </strong>The beautiful sound, lightweight fit and simplicity</li><li><strong>What don’t we like? </strong>The poor build quality, lackluster mic and high price</li></ul><h2 class="article-body__section" id="section-asus-rog-kithara-review-specs"><span>Asus ROG Kithara review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/ASUS-ROG-Audiophile-Open-Back-Headphones/dp/B0GG53SPJC" target="_blank" rel="nofollow">$299</a> / <a href="https://www.amazon.co.uk/ASUS-ROG-Audiophile-Headphones-Microphone-Black/dp/B0GG53SPJC" target="_blank" rel="nofollow">£285</a></p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Black</p></td></tr><tr><td class="firstcol " ><p><strong>Platforms</strong></p></td><td  ><p>PC, PlayStation, Xbox</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>3.5mm, 4.4mm, 6.3mm USB-C (via 3.5mm adapter)</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>None</p></td></tr><tr><td class="firstcol " ><p><strong>Frequency response</strong></p></td><td  ><p>8-55,000Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Drivers</strong></p></td><td  ><p>100mm planar magnetic</p></td></tr><tr><td class="firstcol " ><p><strong>Microphone</strong></p></td><td  ><p>Boom mic</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>14 ounces / 420 grams</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-asus-rog-kithara-review-the-ups"><span>Asus ROG Kithara review: The ups</span></h2><p>The Asus ROG Kithara is, first and foremost, about sound, which is where it excels with open, spacious and detailed sound. It’s also lightweight and comfy, not to mention being about as simple as headsets come.</p><h2 id="spacious-detailed-sound">Spacious, detailed sound</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="WDkwYYB8JDjbUgNpvvTaW" name="ROG_Kithara_Gaming Headset_003.JPG" alt="The Asus ROG Kithara earcups facing upwards on a white table" src="https://cdn.mos.cms.futurecdn.net/WDkwYYB8JDjbUgNpvvTaW.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><div  class="fancy-box"><div class="fancy_box-title">Tom's Guide reviews gaming platform</div><div class="fancy_box_body"><p class="fancy-box__body-text"><strong>Supplied by: </strong><a data-analytics-id="inline-link" href="https://www.msi.com/" target="_blank" rel="nofollow"><strong>MSI</strong></a><strong> | Tom's Guide</strong><br><strong></strong><br><strong>CPU:</strong> <a data-analytics-id="inline-link" href="https://www.amazon.com/AMD-7700X-16-Thread-Unlocked-Processor/dp/B0BBHHT8LY/" target="_blank" rel="nofollow">AMD Ryzen 7 7700X</a><strong> </strong>|<strong> Graphics card:</strong> <a data-analytics-id="inline-link" href="https://www.msi.com/Graphics-Card/GeForce-RTX-5070-Ti-16G-VANGUARD-SOC" target="_blank" rel="nofollow">MSI RTX 5070 Ti 16GB Vanguard SOC</a><strong> </strong>|<strong> Motherboard: </strong><a data-analytics-id="inline-link" href="https://www.msi.com/Motherboard/B850-GAMING-PLUS-WIFI" target="_blank" rel="nofollow">MSI B850E Gaming Plus WiFi</a><strong> </strong>|<strong> RAM: </strong><a data-analytics-id="inline-link" href="https://www.newegg.com/kingston-technology-corp-fury-renegade-32gb-ddr5-8000-cas-latency-cl38-desktop-memory-silver-black/p/N82E16820242829" target="_blank" rel="nofollow">Kingston Fury Renegade DDR5 32GB</a><strong> </strong>|<strong> Cooler:</strong> <a data-analytics-id="inline-link" href="https://www.amazon.com/Noctua-NH-U12S-chromax-Black-Single-Tower-Cooler/dp/B07Y88BNYZ" target="_blank">Noctua NH-U12S</a><strong> </strong>|<strong> PSU:</strong> <a data-analytics-id="inline-link" href="https://www.msi.com/Power-Supply/MEG-Ai1300P-PCIE5" target="_blank" rel="nofollow">MSI MEG Ai1300P PCIE5</a><strong> </strong>|<strong> Case: </strong><a data-analytics-id="inline-link" href="https://www.msi.com/PC-Case/MPG-GUNGNIR-110R" target="_blank" rel="nofollow">MSI MPG GUNGNIR 110R</a></p></div></div><p>The Kithara is essentially just a set of HIFIMAN open back headphones with some Asus branding. It uses the planar magnetic drivers that HIFIMAN is renowned for, and which I have a fair bit of experience with — I’ve used the <a href="https://www.tomsguide.com/audio/over-ear-headphones/i-ignored-reddit-and-built-my-own-audiophile-headphone-setup-for-under-usd500-heres-the-gear-i-chose">HIFIMAN Sundara</a> ($179) and 400SE ($109) regularly for comparative testing open back headphones. The drivers in the Kithara are enormous at 100mm, and bigger than the 90mm planars in the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/audeze-maxwell-review">Audeze Maxwell</a> ($299), Maxwell 2 ($329) and Maxwell 2 ANC ($449).</p><p>The Kithara sounds pure HIFIMAN, albeit with a gaming tune — it’s mostly a neutral, reference-style tune with some extra amplification at the high-end. </p><p>When driven properly, there’s plenty of detail across the highs and mids, in large part thanks to the ultra fast transient response of the planar drivers — basically, they can start and stop vibrating very quickly, giving more definition and a cleaner sound. As an open back headset, the Kithara boasts very open, wide sound and strong spatial imaging, too. All of this helped me hear and pinpoint enemy cues, like footsteps and reloads, to get the drop on unsuspecting foes in Hell Let Loose and Counter Strike 2. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="i5GG4HzuXAhr3mYLs4Ziq" name="IMG_2409" alt="A frequency response curve in hand, showing the response of the tested Asus ROG Kithara" src="https://cdn.mos.cms.futurecdn.net/i5GG4HzuXAhr3mYLs4Ziq.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Here's the frequency response curve for my set of Kithara. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The flat tuning means this isn’t a very bassy headset, even though the response range bottoms out at an impressive 8Hz — while the drivers can technically replicate that low, there’s not much amplification there. Explosions in Hell Let Loose lacked the impact you’d get from the bassy <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-pro-omni-review">SteelSeries Arctis Nova Pro Omni</a> ($399) and <a href="https://www.tomsguide.com/gaming/gaming-peripherals/audeze-maxwell-2-review">Audeze Maxwell 2</a>.</p><p>Tonal separation is really strong, which was perfect for the beautiful campaign soundtrack of Total War: Rome II. Each of the instruments, from flutes through to horns and percussion existed on their own isolated plane, and I could pick them apart with ease.</p><p>Naturally, this all makes the Kithara great for listening to music, too… as long as you’re not a bass fanatic. </p><p><em>Listen along to my testing playlist on </em><a href="https://www.tomsguide.com/audio/qobuz-review"><em>Qobuz</em></a><em>, our favorite </em><a href="https://www.tomsguide.com/buying-guide/best-music-streaming-services"><em>music streaming service</em></a><em> for audiophiles.</em></p><iframe allow="" height="390" width="400" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://widget.qobuz.com/playlist/59666746?zone=GB-en"></iframe><h2 id="audiophile-accessories-included">Audiophile accessories included</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1625px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LynfGBi38hoFbnG7ZXzYYo" name="ROG_Kithara_Gaming Headset_011.JPG" alt="The Asus ROG Kithara on a white table with a blue background" src="https://cdn.mos.cms.futurecdn.net/v2/t:166,l:136,cw:1625,ch:914,q:80/LynfGBi38hoFbnG7ZXzYYo.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Like I mentioned above, the Kithara is ideal (and indeed intended) for music as well as gaming. As such, it’s great to see an array of audiophile accessories included. There’s a headphone cable without a mic for listening to music, and no fewer than three swappable jacks included: 3.5mm, balanced 4.4mm, and 6.3mm. </p><p>The Kithara even comes with a diagram of its individual frequency response curve from quality checking, which is really cool. I’d expect no less from a set of HIFIMAN cans.</p><h2 id="refreshingly-simple">Refreshingly simple</h2><p>The Kithara is a super simple headset. It’s literally plug and play. No batteries, no ANC, no companion app. Obviously, this gives you fewer features than, say, the Arctis Nova Pro Omni or Maxwell 2, but that’s not necessarily a bad thing. Sometimes it’s nice to cut the clutter and use a plain old set of headphones (with a mic).</p><h2 id="open-back-awareness">Open back awareness</h2><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="3tqLyFVsE7GtiPfjNF9HW" name="ROG_Kithara_Gaming Headset_012.JPG" alt="The Asus ROG Kithara on a white table with a blue background" src="https://cdn.mos.cms.futurecdn.net/3tqLyFVsE7GtiPfjNF9HW.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Thanks to the open back design, the Kithara lets you hear everything around you, so you can stay aware of your surroundings. Now, I know, I know — gaming is often about immersion and concentration, right? Not always, I’d say.</p><p>Sure, in FPS games like Counter Strike 2, or strategic stealthy games like Sniper Elite: Resistance, I found myself missing the isolation of my closed back <a href="https://www.tomsguide.com/gaming/gaming-peripherals/fractal-design-scape-review">Fractal Design Scape</a> ($149) or the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-7-gen-2-review">SteelSeries Arctis Nova 7 Gen 2</a> ($199). </p><p>However, in less intense gameplay, like Rome II, I really appreciated being able to hear one of my dogs barking to tell me she needed to go out for a wee; or my wife calling from downstairs to tell me my cup of tea was ready. My wife and I work in the same home office, and I also enjoyed being able to chat with her while I gamed.</p><p>Naturally, this also has its downsides when it comes to distractions and immersion-breaking, which I’ll cover a little later. But that’s kinda the price you pay for open back space.</p><h2 id="lightweight-and-comfortable">Lightweight and comfortable</h2><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="RZKQoXSRkNFvCJWKUaWKN" name="ROG_Kithara_Gaming Headset_015.JPG" alt="The Asus ROG Kithara on a white table with a blue background" src="https://cdn.mos.cms.futurecdn.net/RZKQoXSRkNFvCJWKUaWKN.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Kithara is extremely lightweight and comfortable, which is yet another benefit of that open back HIFIMAN design — both the Sundara and 400SE headphones are similarly lightweight. The Kithara weighs just 14 ounces / 420g, and I had no issue wearing the headset for hours on end.</p><p>The earcups are extremely soft and well padded. The default set of pads has a faux leather rim, but a second set is included which is completely velour and a little more breathable.</p><h2 id="stealthy-looks">Stealthy looks</h2><p>Beauty is in the eye of the beholder, of course, but I think the Kithara is fairly nice looking. It’s not gonna win any pageants like the Fractal Design Scape or <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-blackshark-v3-pro-review">Razer BlackShark V3 Pro</a> ($249). But clad in black and gunmetal, it’s pleasingly stealthy and much less garish than some of Asus’ other offerings — looking at you, <a href="https://www.tomsguide.com/gaming/gaming-peripherals/asus-tuf-gaming-h1-gen-ii-headset-review">Asus TUF H1 Gen II</a> ($49) and <a href="https://www.tomsguide.com/gaming/gaming-peripherals/asus-rog-delta-ii-gaming-headset-review">ROG Delta II</a> ($229)</p><h2 class="article-body__section" id="section-asus-rog-kithara-review-the-downs"><span>Asus ROG Kithara review: The downs</span></h2><p>The ROG Kithara has a couple of noteworthy flaws. It’s built like a HIFIMAN product, so not that well, and features a lackluster mic. I’d also argue that it’s downright overpriced.</p><h2 id="hifiman-build-quality">HIFIMAN build quality</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1281px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="LT4ZuwY5cDSdHGa3FnXHX" name="ROG_Kithara_Gaming Headset_008.JPG" alt="The Asus ROG Kithara on a white table with a blue background" src="https://cdn.mos.cms.futurecdn.net/v2/t:0,l:329,cw:1281,ch:721,q:80/LT4ZuwY5cDSdHGa3FnXHX.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Asus hasn’t yet confirmed to me the extent to which HIFIMAN was involved in building the Kithara (I’ve asked). But if I had to guess, I’d say HIFIMAN built the whole thing and stuck Asus’ branding on it.</p><p>My first words on picking the Kithara up were: ‘yep, feels like HIFIMAN.’ And that’s not a good thing. HIFIMAN is well known for its build quality issues, with the popular Sundara being a ‘frequently returned product’ on Amazon due to headstrap build issues.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="b483aVLCU5SNkiGULSQpn" name="IMG_2410" alt="The Asus ROG Kithara headband adjustment" src="https://cdn.mos.cms.futurecdn.net/b483aVLCU5SNkiGULSQpn.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Kithara feels no different. The head strap is made of thin, cheap-feeling leatherette, just like the Sundara. The headband is a thin piece of metal. The adjustment sliders constantly slip downwards from where you set them. Asus acknowledges this is an issue, and it can be solved easily with a T7 Torx driver, in fairness. But why should I have to fix my own headset from factory? At $300, that’s not acceptable.</p><p>Now, none of this bothers me too much on HIFIMAN headphones, because they’re cheap. The problem is that the Kithara isn’t cheap, at <a href="https://www.amazon.com/ASUS-ROG-Audiophile-Open-Back-Headphones/dp/B0GG53SPJC" target="_blank" rel="nofollow">$299</a> / <a href="https://www.amazon.co.uk/ASUS-ROG-Audiophile-Headphones-Microphone-Black/dp/B0GG53SPJC" target="_blank" rel="nofollow">£285</a>. It’s HIFIMAN quality; Asus prices. </p><h2 id="lackluster-mic">Lackluster mic</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="TtnYLYPXr3f7y9FBAJDKX" name="ROG_Kithara_Gaming Headset_009.JPG" alt="The Asus ROG Kithara on a white table with a blue background" src="https://cdn.mos.cms.futurecdn.net/TtnYLYPXr3f7y9FBAJDKX.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I’ll preface this by saying that the Kithara’s mic isn’t <em>bad</em>. In both my testing calls and game chat, nobody had issues understanding me — that was super important in Hell Let Loose where team communication is vital. </p><p>My colleagues reported, however, that the mic sounded fairly tinny and low quality. Again, that stings a little when paying $299, especially as rivals like the Maxwell 2 and <a href="https://www.tomsguide.com/gaming/gaming-peripherals/turtle-beach-stealth-pro-ii-review">Turtle Beach Stealth Pro II</a> ($349) offer fantastic, broadcast-worthy mics for only $50 more. If you’re going to be on stream, I’d recommend either of those.</p><h2 id="should-cost-half-its-msrp">Should cost half its MSRP</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1227px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="6MfYqv5RUo7NCmzSfxioV" name="ROG_Kithara_Gaming Headset_005.JPG" alt="The Asus ROG Kithara on a white table with a blue background" src="https://cdn.mos.cms.futurecdn.net/v2/t:365,l:339,cw:1227,ch:690,q:80/6MfYqv5RUo7NCmzSfxioV.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>As I’ve already alluded to a few times, my biggest gripe with the Kithara is its price. In a world where the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/sony-inzone-h6-air-review">Sony Inzone H6 Air</a> ($199) exists for a hundred dollars less, with spacious open back sound, premium build quality and an excellent mic, there’s just no way I can recommend the Kithara. That’s why I’ve scored this headset 3.5 — we define this score as very good, but it misses out on our Tom’s Guide Recommended award. I can’t recommend this headset over the higher-scoring H6 Air.</p><h2 id="open-back-might-not-be-for-everyone">Open back might not be for everyone</h2><p>Before you drop 300 smackeroonies into the Kithara, it’s worth making sure an open back headset is right for you. This isn’t really a con, so I’ve left it until last, but the environmental sound leakage may not be best for every gamer.</p><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="QsqtvqkTpjgzuR8yf87bF" name="ROG_Kithara_Gaming Headset_013.JPG" alt="The Asus ROG Kithara on a white table with a blue background" src="https://cdn.mos.cms.futurecdn.net/QsqtvqkTpjgzuR8yf87bF.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>While the headset is loud enough for fine detail, some of that can get drowned out by external noise coming through the open driver backs. In Hell Let Loose, I sometimes found it difficult to hear the super fine interference noises of enemy garrisons and outposts, leaving me hunting around blindly and getting killed. This was only an issue when I had the window open, but could make the difference in shooters where enemy cue sounds are pivotal.</p><p>As I mentioned above, the sound is also nowhere near as immersive or intense as a closed back headset. Switching back to my Fractal Design Scape after testing the Kithara, the chaos, explosions and bullet hisses in Hell Let Loose sounded way more intense and frightening. </p><p>Like I said, this isn’t a con. If you’d like that more spacious, detailed and gentle sound, plus you game in quiet environments, it shouldn’t be an issue. If you’d rather a headset that fully isolates and immerses you, a closed back design with ANC is your best bet. These tend to cost more though, like the $399 Arctis Nova Pro Omni, $429 <a href="https://www.tomsguide.com/gaming/gaming-peripherals/audeze-maxwell-2-anc-review">Audeze Maxwell 2 ANC</a> and $599 <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-elite-review">SteelSeries Arctis Nova Elite</a>.</p><h2 class="article-body__section" id="section-asus-rog-kithara-review-verdict"><span>Asus ROG Kithara review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ZodY286KAY7Yy6qjaU8GHo" name="ROG_Kithara_Gaming Headset_010.JPG" alt="The Asus ROG Kithara on a white table with a blue background" src="https://cdn.mos.cms.futurecdn.net/ZodY286KAY7Yy6qjaU8GHo.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Kithara is a very good headset. It offers extremely detailed, spacious sound that’ll appeal especially to any lovers of open back headphones, who want the same kind of experience when gaming. It’s great for music, too, while proving lightweight, comfy and fuss-free.</p><p>However, I pretty much summed up my verdict already in the price section. Our 3.5-star score means a product is very good, but we wouldn’t outright recommend it over cheaper rivals. The build quality is poor, while the mic is lackluster, neither of which is worthy of the $300 price tag. If you’ve got to have planar magnetic open backs, my advice is to invest in a set of Torx drivers and wait for a sale.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/asus-rog-kithara-review</link>
                                                                            <description>
                            <![CDATA[ The Asus ROG Kithara sounds great and is comfy for hours, but its mic and build quality make the high price tag difficult to stomach. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">hUc5NXAmaJLbxRNfmQJS3d</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/YBbiEUKbBv4UugJbWBT9Ro-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 11 Sep 2026 11:28:27 +0000</pubDate>                                                                                                                                <updated>Fri, 11 Sep 2026 11:39:48 +0000</updated>
                                                                                                                                            <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                <author><![CDATA[ peter.wolinski@futurenet.com (Peter Wolinski) ]]></author>                    <dc:creator><![CDATA[ Peter Wolinski ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/stgPfXWY7ukw8J8rfC7vjg.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Peter is a Senior Editor at Tom&#039;s Guide, heading up the site&#039;s Reviews team and Cameras section. Having built gaming PCs since he was 10 (that&#039;s a while ago now) he&#039;s a bit of a nerd about components and hardware. He&#039;s also been an iPhone user since the classic iPhone 4, and a Mac user for well over a decade. Experienced in using and testing all kinds of technology — from phones through to tablets, computers, games consoles, cameras and smart home tech — helping people find the best tech for them (at the best prices) is what Peter does best. A photographer since he bought his first camera (a Fujifilm) in 2015, Peter was previously an Editor for Canon-Europe.com. He then edited the Cameras and How To sections of Tom&#039;s Guide. When he&#039;s not crafting helpful, in-depth reviews, Peter can usually be found out and about honing his architectural photography skills, riding his motorcycle around Welsh mountain roads, telling everyone about his two greyhounds, squeezing a few extra FPS out of PC games or perfecting his espresso shots.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/YBbiEUKbBv4UugJbWBT9Ro-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Asus ROG Kithara on a white table with a blue background]]></media:description>                                                            <media:text><![CDATA[The Asus ROG Kithara on a white table with a blue background]]></media:text>
                                <media:title type="plain"><![CDATA[The Asus ROG Kithara on a white table with a blue background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/YBbiEUKbBv4UugJbWBT9Ro-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Asus ROG Kithara is a premium open back gaming headset and a collaboration between Asus and HIFIMAN — renowned manufacturer of affordable audiophile headphones.</p><p>Asus promises incredible sound from the Kithara, with the detail and soundstage of HIFIMAN’s open back cans. And, yeah, the headset delivers pretty much exactly that. It’s also lightweight and comfortable, simple to operate, and great for music too.</p><p>Unfortunately, the usual afflictions of HIFIMAN gear appear, with a cheap headband that needs tightening to avoid slippage. Its mic is lackluster, and compounding both these issues is an unwarrantable price tag of nearly $300. </p><p>But could this still be one of the <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets%5C">best gaming headsets</a> for audiophiles? Find out in my full Asus ROG Kithara review.  </p><h2 class="article-body__section" id="section-asus-rog-kithara-review-cheat-sheet"><span>Asus ROG Kithara review: Cheat sheet</span></h2><ul><li><strong>What is it?</strong> A premium open back gaming headset, and collab between Asus and HIFIMAN</li><li><strong>Who is it for? </strong>Gamers wanting spacious, audiophile-tier sound</li><li><strong>What does it cost? </strong>A whopping <a href="https://www.amazon.com/ASUS-ROG-Audiophile-Open-Back-Headphones/dp/B0GG53SPJC" target="_blank" rel="nofollow">$299</a> / <a href="https://www.amazon.co.uk/ASUS-ROG-Audiophile-Headphones-Microphone-Black/dp/B0GG53SPJC" target="_blank" rel="nofollow">£285</a></li><li><strong>What do we like? </strong>The beautiful sound, lightweight fit and simplicity</li><li><strong>What don’t we like? </strong>The poor build quality, lackluster mic and high price</li></ul><h2 class="article-body__section" id="section-asus-rog-kithara-review-specs"><span>Asus ROG Kithara review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/ASUS-ROG-Audiophile-Open-Back-Headphones/dp/B0GG53SPJC" target="_blank" rel="nofollow">$299</a> / <a href="https://www.amazon.co.uk/ASUS-ROG-Audiophile-Headphones-Microphone-Black/dp/B0GG53SPJC" target="_blank" rel="nofollow">£285</a></p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Black</p></td></tr><tr><td class="firstcol " ><p><strong>Platforms</strong></p></td><td  ><p>PC, PlayStation, Xbox</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>3.5mm, 4.4mm, 6.3mm USB-C (via 3.5mm adapter)</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>None</p></td></tr><tr><td class="firstcol " ><p><strong>Frequency response</strong></p></td><td  ><p>8-55,000Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Drivers</strong></p></td><td  ><p>100mm planar magnetic</p></td></tr><tr><td class="firstcol " ><p><strong>Microphone</strong></p></td><td  ><p>Boom mic</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>14 ounces / 420 grams</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-asus-rog-kithara-review-the-ups"><span>Asus ROG Kithara review: The ups</span></h2><p>The Asus ROG Kithara is, first and foremost, about sound, which is where it excels with open, spacious and detailed sound. It’s also lightweight and comfy, not to mention being about as simple as headsets come.</p><h2 id="spacious-detailed-sound">Spacious, detailed sound</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="WDkwYYB8JDjbUgNpvvTaW" name="ROG_Kithara_Gaming Headset_003.JPG" alt="The Asus ROG Kithara earcups facing upwards on a white table" src="https://cdn.mos.cms.futurecdn.net/WDkwYYB8JDjbUgNpvvTaW.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><div  class="fancy-box"><div class="fancy_box-title">Tom's Guide reviews gaming platform</div><div class="fancy_box_body"><p class="fancy-box__body-text"><strong>Supplied by: </strong><a data-analytics-id="inline-link" href="https://www.msi.com/" target="_blank" rel="nofollow"><strong>MSI</strong></a><strong> | Tom's Guide</strong><br><strong></strong><br><strong>CPU:</strong> <a data-analytics-id="inline-link" href="https://www.amazon.com/AMD-7700X-16-Thread-Unlocked-Processor/dp/B0BBHHT8LY/" target="_blank" rel="nofollow">AMD Ryzen 7 7700X</a><strong> </strong>|<strong> Graphics card:</strong> <a data-analytics-id="inline-link" href="https://www.msi.com/Graphics-Card/GeForce-RTX-5070-Ti-16G-VANGUARD-SOC" target="_blank" rel="nofollow">MSI RTX 5070 Ti 16GB Vanguard SOC</a><strong> </strong>|<strong> Motherboard: </strong><a data-analytics-id="inline-link" href="https://www.msi.com/Motherboard/B850-GAMING-PLUS-WIFI" target="_blank" rel="nofollow">MSI B850E Gaming Plus WiFi</a><strong> </strong>|<strong> RAM: </strong><a data-analytics-id="inline-link" href="https://www.newegg.com/kingston-technology-corp-fury-renegade-32gb-ddr5-8000-cas-latency-cl38-desktop-memory-silver-black/p/N82E16820242829" target="_blank" rel="nofollow">Kingston Fury Renegade DDR5 32GB</a><strong> </strong>|<strong> Cooler:</strong> <a data-analytics-id="inline-link" href="https://www.amazon.com/Noctua-NH-U12S-chromax-Black-Single-Tower-Cooler/dp/B07Y88BNYZ" target="_blank">Noctua NH-U12S</a><strong> </strong>|<strong> PSU:</strong> <a data-analytics-id="inline-link" href="https://www.msi.com/Power-Supply/MEG-Ai1300P-PCIE5" target="_blank" rel="nofollow">MSI MEG Ai1300P PCIE5</a><strong> </strong>|<strong> Case: </strong><a data-analytics-id="inline-link" href="https://www.msi.com/PC-Case/MPG-GUNGNIR-110R" target="_blank" rel="nofollow">MSI MPG GUNGNIR 110R</a></p></div></div><p>The Kithara is essentially just a set of HIFIMAN open back headphones with some Asus branding. It uses the planar magnetic drivers that HIFIMAN is renowned for, and which I have a fair bit of experience with — I’ve used the <a href="https://www.tomsguide.com/audio/over-ear-headphones/i-ignored-reddit-and-built-my-own-audiophile-headphone-setup-for-under-usd500-heres-the-gear-i-chose">HIFIMAN Sundara</a> ($179) and 400SE ($109) regularly for comparative testing open back headphones. The drivers in the Kithara are enormous at 100mm, and bigger than the 90mm planars in the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/audeze-maxwell-review">Audeze Maxwell</a> ($299), Maxwell 2 ($329) and Maxwell 2 ANC ($449).</p><p>The Kithara sounds pure HIFIMAN, albeit with a gaming tune — it’s mostly a neutral, reference-style tune with some extra amplification at the high-end. </p><p>When driven properly, there’s plenty of detail across the highs and mids, in large part thanks to the ultra fast transient response of the planar drivers — basically, they can start and stop vibrating very quickly, giving more definition and a cleaner sound. As an open back headset, the Kithara boasts very open, wide sound and strong spatial imaging, too. All of this helped me hear and pinpoint enemy cues, like footsteps and reloads, to get the drop on unsuspecting foes in Hell Let Loose and Counter Strike 2. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="i5GG4HzuXAhr3mYLs4Ziq" name="IMG_2409" alt="A frequency response curve in hand, showing the response of the tested Asus ROG Kithara" src="https://cdn.mos.cms.futurecdn.net/i5GG4HzuXAhr3mYLs4Ziq.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Here's the frequency response curve for my set of Kithara. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The flat tuning means this isn’t a very bassy headset, even though the response range bottoms out at an impressive 8Hz — while the drivers can technically replicate that low, there’s not much amplification there. Explosions in Hell Let Loose lacked the impact you’d get from the bassy <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-pro-omni-review">SteelSeries Arctis Nova Pro Omni</a> ($399) and <a href="https://www.tomsguide.com/gaming/gaming-peripherals/audeze-maxwell-2-review">Audeze Maxwell 2</a>.</p><p>Tonal separation is really strong, which was perfect for the beautiful campaign soundtrack of Total War: Rome II. Each of the instruments, from flutes through to horns and percussion existed on their own isolated plane, and I could pick them apart with ease.</p><p>Naturally, this all makes the Kithara great for listening to music, too… as long as you’re not a bass fanatic. </p><p><em>Listen along to my testing playlist on </em><a href="https://www.tomsguide.com/audio/qobuz-review"><em>Qobuz</em></a><em>, our favorite </em><a href="https://www.tomsguide.com/buying-guide/best-music-streaming-services"><em>music streaming service</em></a><em> for audiophiles.</em></p><iframe allow="" height="390" width="400" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://widget.qobuz.com/playlist/59666746?zone=GB-en"></iframe><h2 id="audiophile-accessories-included">Audiophile accessories included</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1625px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LynfGBi38hoFbnG7ZXzYYo" name="ROG_Kithara_Gaming Headset_011.JPG" alt="The Asus ROG Kithara on a white table with a blue background" src="https://cdn.mos.cms.futurecdn.net/v2/t:166,l:136,cw:1625,ch:914,q:80/LynfGBi38hoFbnG7ZXzYYo.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Like I mentioned above, the Kithara is ideal (and indeed intended) for music as well as gaming. As such, it’s great to see an array of audiophile accessories included. There’s a headphone cable without a mic for listening to music, and no fewer than three swappable jacks included: 3.5mm, balanced 4.4mm, and 6.3mm. </p><p>The Kithara even comes with a diagram of its individual frequency response curve from quality checking, which is really cool. I’d expect no less from a set of HIFIMAN cans.</p><h2 id="refreshingly-simple">Refreshingly simple</h2><p>The Kithara is a super simple headset. It’s literally plug and play. No batteries, no ANC, no companion app. Obviously, this gives you fewer features than, say, the Arctis Nova Pro Omni or Maxwell 2, but that’s not necessarily a bad thing. Sometimes it’s nice to cut the clutter and use a plain old set of headphones (with a mic).</p><h2 id="open-back-awareness">Open back awareness</h2><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="3tqLyFVsE7GtiPfjNF9HW" name="ROG_Kithara_Gaming Headset_012.JPG" alt="The Asus ROG Kithara on a white table with a blue background" src="https://cdn.mos.cms.futurecdn.net/3tqLyFVsE7GtiPfjNF9HW.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Thanks to the open back design, the Kithara lets you hear everything around you, so you can stay aware of your surroundings. Now, I know, I know — gaming is often about immersion and concentration, right? Not always, I’d say.</p><p>Sure, in FPS games like Counter Strike 2, or strategic stealthy games like Sniper Elite: Resistance, I found myself missing the isolation of my closed back <a href="https://www.tomsguide.com/gaming/gaming-peripherals/fractal-design-scape-review">Fractal Design Scape</a> ($149) or the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-7-gen-2-review">SteelSeries Arctis Nova 7 Gen 2</a> ($199). </p><p>However, in less intense gameplay, like Rome II, I really appreciated being able to hear one of my dogs barking to tell me she needed to go out for a wee; or my wife calling from downstairs to tell me my cup of tea was ready. My wife and I work in the same home office, and I also enjoyed being able to chat with her while I gamed.</p><p>Naturally, this also has its downsides when it comes to distractions and immersion-breaking, which I’ll cover a little later. But that’s kinda the price you pay for open back space.</p><h2 id="lightweight-and-comfortable">Lightweight and comfortable</h2><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="RZKQoXSRkNFvCJWKUaWKN" name="ROG_Kithara_Gaming Headset_015.JPG" alt="The Asus ROG Kithara on a white table with a blue background" src="https://cdn.mos.cms.futurecdn.net/RZKQoXSRkNFvCJWKUaWKN.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Kithara is extremely lightweight and comfortable, which is yet another benefit of that open back HIFIMAN design — both the Sundara and 400SE headphones are similarly lightweight. The Kithara weighs just 14 ounces / 420g, and I had no issue wearing the headset for hours on end.</p><p>The earcups are extremely soft and well padded. The default set of pads has a faux leather rim, but a second set is included which is completely velour and a little more breathable.</p><h2 id="stealthy-looks">Stealthy looks</h2><p>Beauty is in the eye of the beholder, of course, but I think the Kithara is fairly nice looking. It’s not gonna win any pageants like the Fractal Design Scape or <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-blackshark-v3-pro-review">Razer BlackShark V3 Pro</a> ($249). But clad in black and gunmetal, it’s pleasingly stealthy and much less garish than some of Asus’ other offerings — looking at you, <a href="https://www.tomsguide.com/gaming/gaming-peripherals/asus-tuf-gaming-h1-gen-ii-headset-review">Asus TUF H1 Gen II</a> ($49) and <a href="https://www.tomsguide.com/gaming/gaming-peripherals/asus-rog-delta-ii-gaming-headset-review">ROG Delta II</a> ($229)</p><h2 class="article-body__section" id="section-asus-rog-kithara-review-the-downs"><span>Asus ROG Kithara review: The downs</span></h2><p>The ROG Kithara has a couple of noteworthy flaws. It’s built like a HIFIMAN product, so not that well, and features a lackluster mic. I’d also argue that it’s downright overpriced.</p><h2 id="hifiman-build-quality">HIFIMAN build quality</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1281px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="LT4ZuwY5cDSdHGa3FnXHX" name="ROG_Kithara_Gaming Headset_008.JPG" alt="The Asus ROG Kithara on a white table with a blue background" src="https://cdn.mos.cms.futurecdn.net/v2/t:0,l:329,cw:1281,ch:721,q:80/LT4ZuwY5cDSdHGa3FnXHX.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Asus hasn’t yet confirmed to me the extent to which HIFIMAN was involved in building the Kithara (I’ve asked). But if I had to guess, I’d say HIFIMAN built the whole thing and stuck Asus’ branding on it.</p><p>My first words on picking the Kithara up were: ‘yep, feels like HIFIMAN.’ And that’s not a good thing. HIFIMAN is well known for its build quality issues, with the popular Sundara being a ‘frequently returned product’ on Amazon due to headstrap build issues.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="b483aVLCU5SNkiGULSQpn" name="IMG_2410" alt="The Asus ROG Kithara headband adjustment" src="https://cdn.mos.cms.futurecdn.net/b483aVLCU5SNkiGULSQpn.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Kithara feels no different. The head strap is made of thin, cheap-feeling leatherette, just like the Sundara. The headband is a thin piece of metal. The adjustment sliders constantly slip downwards from where you set them. Asus acknowledges this is an issue, and it can be solved easily with a T7 Torx driver, in fairness. But why should I have to fix my own headset from factory? At $300, that’s not acceptable.</p><p>Now, none of this bothers me too much on HIFIMAN headphones, because they’re cheap. The problem is that the Kithara isn’t cheap, at <a href="https://www.amazon.com/ASUS-ROG-Audiophile-Open-Back-Headphones/dp/B0GG53SPJC" target="_blank" rel="nofollow">$299</a> / <a href="https://www.amazon.co.uk/ASUS-ROG-Audiophile-Headphones-Microphone-Black/dp/B0GG53SPJC" target="_blank" rel="nofollow">£285</a>. It’s HIFIMAN quality; Asus prices. </p><h2 id="lackluster-mic">Lackluster mic</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="TtnYLYPXr3f7y9FBAJDKX" name="ROG_Kithara_Gaming Headset_009.JPG" alt="The Asus ROG Kithara on a white table with a blue background" src="https://cdn.mos.cms.futurecdn.net/TtnYLYPXr3f7y9FBAJDKX.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I’ll preface this by saying that the Kithara’s mic isn’t <em>bad</em>. In both my testing calls and game chat, nobody had issues understanding me — that was super important in Hell Let Loose where team communication is vital. </p><p>My colleagues reported, however, that the mic sounded fairly tinny and low quality. Again, that stings a little when paying $299, especially as rivals like the Maxwell 2 and <a href="https://www.tomsguide.com/gaming/gaming-peripherals/turtle-beach-stealth-pro-ii-review">Turtle Beach Stealth Pro II</a> ($349) offer fantastic, broadcast-worthy mics for only $50 more. If you’re going to be on stream, I’d recommend either of those.</p><h2 id="should-cost-half-its-msrp">Should cost half its MSRP</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1227px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="6MfYqv5RUo7NCmzSfxioV" name="ROG_Kithara_Gaming Headset_005.JPG" alt="The Asus ROG Kithara on a white table with a blue background" src="https://cdn.mos.cms.futurecdn.net/v2/t:365,l:339,cw:1227,ch:690,q:80/6MfYqv5RUo7NCmzSfxioV.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>As I’ve already alluded to a few times, my biggest gripe with the Kithara is its price. In a world where the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/sony-inzone-h6-air-review">Sony Inzone H6 Air</a> ($199) exists for a hundred dollars less, with spacious open back sound, premium build quality and an excellent mic, there’s just no way I can recommend the Kithara. That’s why I’ve scored this headset 3.5 — we define this score as very good, but it misses out on our Tom’s Guide Recommended award. I can’t recommend this headset over the higher-scoring H6 Air.</p><h2 id="open-back-might-not-be-for-everyone">Open back might not be for everyone</h2><p>Before you drop 300 smackeroonies into the Kithara, it’s worth making sure an open back headset is right for you. This isn’t really a con, so I’ve left it until last, but the environmental sound leakage may not be best for every gamer.</p><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="QsqtvqkTpjgzuR8yf87bF" name="ROG_Kithara_Gaming Headset_013.JPG" alt="The Asus ROG Kithara on a white table with a blue background" src="https://cdn.mos.cms.futurecdn.net/QsqtvqkTpjgzuR8yf87bF.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>While the headset is loud enough for fine detail, some of that can get drowned out by external noise coming through the open driver backs. In Hell Let Loose, I sometimes found it difficult to hear the super fine interference noises of enemy garrisons and outposts, leaving me hunting around blindly and getting killed. This was only an issue when I had the window open, but could make the difference in shooters where enemy cue sounds are pivotal.</p><p>As I mentioned above, the sound is also nowhere near as immersive or intense as a closed back headset. Switching back to my Fractal Design Scape after testing the Kithara, the chaos, explosions and bullet hisses in Hell Let Loose sounded way more intense and frightening. </p><p>Like I said, this isn’t a con. If you’d like that more spacious, detailed and gentle sound, plus you game in quiet environments, it shouldn’t be an issue. If you’d rather a headset that fully isolates and immerses you, a closed back design with ANC is your best bet. These tend to cost more though, like the $399 Arctis Nova Pro Omni, $429 <a href="https://www.tomsguide.com/gaming/gaming-peripherals/audeze-maxwell-2-anc-review">Audeze Maxwell 2 ANC</a> and $599 <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-elite-review">SteelSeries Arctis Nova Elite</a>.</p><h2 class="article-body__section" id="section-asus-rog-kithara-review-verdict"><span>Asus ROG Kithara review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ZodY286KAY7Yy6qjaU8GHo" name="ROG_Kithara_Gaming Headset_010.JPG" alt="The Asus ROG Kithara on a white table with a blue background" src="https://cdn.mos.cms.futurecdn.net/ZodY286KAY7Yy6qjaU8GHo.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Kithara is a very good headset. It offers extremely detailed, spacious sound that’ll appeal especially to any lovers of open back headphones, who want the same kind of experience when gaming. It’s great for music, too, while proving lightweight, comfy and fuss-free.</p><p>However, I pretty much summed up my verdict already in the price section. Our 3.5-star score means a product is very good, but we wouldn’t outright recommend it over cheaper rivals. The build quality is poor, while the mic is lackluster, neither of which is worthy of the $300 price tag. If you’ve got to have planar magnetic open backs, my advice is to invest in a set of Torx drivers and wait for a sale.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ This $349 gaming headset gives SteelSeries, Razer and Audeze a serious run for their money ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Stealth Pro II is the flagship gaming headset from Turtle Beach, intended to compete with the heavy hitters from Razer, SteelSeries and Audeze. The <em>crème de la crème</em> are getting pricey now, with all the manufacturers above asking several hundred dollars for their very <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">best gaming headsets</a>. </p><p>The Stealth Pro II is no different, and hella pricey by objective standards, but actually comes in a little cheaper than some of its competition. It also offers excellent sound; an attractive, premium design; zero downtime battery; plus customization via a solid companion app. So could this be a fantastic balanced alternative to the main ultra-premium players?</p><p>As long as you don’t mind fairly weak ANC and a slightly tight clamp force! Find out more in my full Turtle Beach Stealth Pro II review.</p><h2 class="article-body__section" id="section-turtle-beach-stealth-pro-ii-review-cheat-sheet"><span>Turtle Beach Stealth Pro II review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>A premium flagship gaming headset from Turtle Beach</li><li><strong>Who is it for? </strong>Competitive gamers and those who value sound quality</li><li><strong>What does it cost? </strong><a href="https://www.amazon.com/Turtle-Beach-Stealth-Premium-Wireless/dp/B0GN4NBD2V/" target="_blank" rel="nofollow">$349</a> / <a href="https://www.amazon.co.uk/Turtle-Beach-Stealth-Wireless-Multiplatform-Black/dp/B0GQCNJCPR" target="_blank" rel="nofollow">£299</a></li><li><strong>What do we like?</strong> The sound, mic, companion app, styling and build, base station and zero downtime battery system</li><li><strong>What don’t we like?</strong> The ANC is a little weak, and I found the headset a tad clampy</li></ul><h2 class="article-body__section" id="section-turtle-beach-stealth-pro-ii-review-specs"><span>Turtle Beach Stealth Pro II review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/Turtle-Beach-Stealth-Premium-Wireless/dp/B0GN4NBD2V/" target="_blank" rel="nofollow">$349</a> / <a href="https://www.amazon.co.uk/Turtle-Beach-Stealth-Wireless-Multiplatform-Black/dp/B0GQCNJCPR" target="_blank" rel="nofollow">£299</a></p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Black, white</p></td></tr><tr><td class="firstcol " ><p><strong>Platforms</strong></p></td><td  ><p>PC, Xbox, PlayStation, Bluetooth devices</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Wired, 3x 2.4Ghz, 1x Bluetooth</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>2x rechargeable</p></td></tr><tr><td class="firstcol " ><p><strong>Battery life</strong></p></td><td  ><p>40 hours combined</p></td></tr><tr><td class="firstcol " ><p><strong>Frequency response</strong></p></td><td  ><p>10-40,000Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Drivers</strong></p></td><td  ><p>60mm coaxial</p></td></tr><tr><td class="firstcol " ><p><strong>Multipoint connectivity</strong></p></td><td  ><p>Yes</p></td></tr><tr><td class="firstcol " ><p><strong>Paired devices max</strong></p></td><td  ><p>4 (3x 2.4G, 1x BT)</p></td></tr><tr><td class="firstcol " ><p><strong>Microphone</strong></p></td><td  ><p>Unidirectional floating boom mic</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>13.8 ounces / 393 grams</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-turtle-beach-stealth-pro-ii-review-the-ups"><span>Turtle Beach Stealth Pro II review: The ups</span></h2><p>There’s a lot to love about the Stealth Pro II. Sound quality is excellent, there’s a useful companion app, a super clear mic, and a handy base station for ‘zero downtime’ battery life. It’s also moderately priced versus competition.</p><h2 id="excellent-sound-quality">Excellent sound quality</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HFWdi2AigrzMKFpu3MX5bc" name="Turtle Beach Stealth Pro II_test shots2" alt="The Turtle Beach Stealth Pro II with an earcup removed showing the coaxial driver" src="https://cdn.mos.cms.futurecdn.net/HFWdi2AigrzMKFpu3MX5bc.jpg" mos="" align="middle" fullscreen="1" width="2560" height="1440" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/HFWdi2AigrzMKFpu3MX5bc.jpg' target='_blank' class='expand-button icon-expand-image icon' ></a></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Coaxial drivers feature a tweeter that sits in the middle/on top of a main woofer. The tweeter sits under that central circular housing, while the main woofer is the larger, fluted circle. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Turtle Beach Stealth Pro II’s biggest strength is its sound quality. It uses a coaxial driver setup, with a 60mm woofer and separate tweeter in each earcup. This, in theory, gives better clarity and more separation between higher and lower frequencies, as each driver can focus on its own job. Connectivity-wise, there’s 24-bit/96kHz high resolution data/sampling rates over 2.4G, so this is a true hi-res headset, akin to the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-pro-omni-review">SteelSeries Arctis Nova Pro Omni</a> / Elite and <a href="https://www.tomsguide.com/gaming/gaming-peripherals/audeze-maxwell-2-anc-review">Audeze Maxwell 2 ANC</a>.</p><p>The sound is super spacious with exceptional clarity up top and very strong imaging (this lets you pinpoint noises to a specific point). This naturally benefits competitive gameplay, letting me hear the location of enemy cues like footsteps or reloads in my test FPS games: Counter Strike 2 and Isonzo. It was also handy for stealthy games like Sniper Elite: Resistance, where I could again hear and locate even the quietest tapping of enemy footsteps. And it was ideal for immersion, giving three-dimensionality to sounds and effects in the campaign and battles of Total War: Rome II.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1600px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mXPzdXE3NLgxLtw9ZvfbHc" name="Turtle Beach Stealth Pro II_screenshots3" alt="A screenshot of the Turtle Beach Swarm II app being used to customize the Stealth Pro II" src="https://cdn.mos.cms.futurecdn.net/mXPzdXE3NLgxLtw9ZvfbHc.jpg" mos="" align="middle" fullscreen="1" width="1600" height="900" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/mXPzdXE3NLgxLtw9ZvfbHc.jpg' target='_blank' class='expand-button icon-expand-image icon' ></a></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Via the Swarm II app, you have access to a preset Footsteps EQ for a competitive edge. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Turtle Beach / Future)</span></figcaption></figure><p>There’s also Dolby Atmos (DA) support, so you can benefit from that codec in games that use it for surround sound. But even without DA, the sound is impressively spatial.</p><p>Tonal separation and mid-range clarity are really excellent, too. Each of the instruments and layers of the beautiful Rome II soundtrack sounded isolated yet cohesive — the panpipes, the atmospheric flutes, the drums, the horns, all occupied their own distinct space.</p><p>And thanks to that hefty 60mm main driver, there’s plenty of bass performance, giving strong, impactful artillery explosions in Isonzo. Bass response is not quite as nicely controlled as on the Arctis Nova Pro Omni or Elite, and you don’t get anywhere near the tightness of the Maxwell 2’s low-end. I noticed a little bit of booming and muddying at times, too, but it was nothing major, and generally, I loved listening to games and music on the Stealth Pro II.</p><p><em>Listen along to my audio testing playlist on </em><a href="https://www.tomsguide.com/audio/qobuz-review"><em>Qobuz</em></a><em>, our favorite </em><a href="https://www.tomsguide.com/buying-guide/best-music-streaming-services"><em>music streaming service</em></a><em> for audiophiles.</em></p><iframe allow="" height="390" width="400" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://widget.qobuz.com/playlist/59666746?zone=GB-en"></iframe><h2 id="useful-companion-app">Useful companion app</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1600px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="WKivUJJSayR32JEJFmsJPc" name="Turtle Beach Stealth Pro II_screenshots4" alt="A screenshot of the Turtle Beach Swarm II app being used to customize the Stealth Pro II EQ" src="https://cdn.mos.cms.futurecdn.net/WKivUJJSayR32JEJFmsJPc.jpg" mos="" align="middle" fullscreen="1" width="1600" height="900" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/WKivUJJSayR32JEJFmsJPc.jpg' target='_blank' class='expand-button icon-expand-image icon' ></a></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Turtle Beach / Future)</span></figcaption></figure><p>Complementing the Stealth Pro II’s sound is an equally strong companion app, which gives you access to a full custom EQ, as well as EQ presets and a (<em>cringe</em>) “Superhuman hearing” mode — essentially some EQ presets to enhance things like footsteps.</p><p>There’s not the same enormous range of presets as on the SteelSeries GG app, with its hundreds-strong library of per-game EQs. But there’s still more than enough control in Swarm II to get the most out of your game audio.</p><p>In the app, you can also control the microphone EQ, update the headset and (my favorite aspect) change the control assignments to customize how the headset operates. So useful!</p><h2 id="multipoint-connectivity">Multipoint connectivity</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1181px;"><p class="vanilla-image-block" style="padding-top:56.31%;"><img id="phhk8xiqF6fCKSfmxYZ5vK" name="Turtlebeach_StealthPro_II_012.JPG" alt="The Turtle Beach Stealth Pro II earcup and controls" src="https://cdn.mos.cms.futurecdn.net/v2/t:380,l:413,cw:1181,ch:665,q:80/phhk8xiqF6fCKSfmxYZ5vK.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Stealth Pro II offers multipoint connectivity. You can hook up two devices over 2.4G out of the box, using the base station and included USB dongle. You can also buy more dongles (the carry case even comes with a spare dongle slot) to connect to even more, up to four devices. </p><p>If that weren’t enough, you can also connect over Bluetooth simultaneously. I found this a little annoying, though, as the headset doesn’t mute game sounds to prioritize Bluetooth if, for example, you get a call or need to take a work meeting while gaming (which, as you can imagine, happens a lot in my job). You just have both going on at once, and the sidetone dial didn't work to fix this. It’s not a huge issue, but I like that the Nova Pro Omni and Maxwell 2 prioritize Bluetooth in those scenarios.</p><h2 id="super-clear-mic">Super clear mic</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:960px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="3EgUuzZLcuowP7EX98QduK" name="Turtlebeach_StealthPro_II_014.JPG" alt="The Turtle Beach Stealth Pro II next to its base station and 2.4G dongle" src="https://cdn.mos.cms.futurecdn.net/v2/t:540,l:476,cw:960,ch:540,q:80/3EgUuzZLcuowP7EX98QduK.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Stealth Pro II uses a unidirectional mic that’s “floating,” meaning it’s suspended on rubber spokes to eliminate vibration. Turtle Beach says this gives exceptional clarity, although in fairness it’s just a great mic anyway, floating or otherwise.</p><p>Headset mics, even flagship ones, usually disappoint, so I was very surprised at the cleanness and airiness of voice recordings. There was arguably a little too much clarity, as I started to pick up on some of my inherent lispy and sibilant qualities — but there’s no denying how clean and noise-free the recordings were, especially using the ‘clarity’ mic EQ. </p><p>There’s environmental noise reduction, but being a unidirectional mic, that isn’t really needed — the mic only picks up sound from your mouth anyway. I recorded test clips with my window open to a very busy and loud road. Even with noise reduction off, I couldn’t hear the road in any recordings.</p><h2 id="stealthy-grown-up-design">Stealthy, grown-up design</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9im4tknZx6qrX7paMavoqK" name="Turtlebeach_StealthPro_II_011.JPG" alt="The Turtle Beach Stealth Pro II earcup showing the controls" src="https://cdn.mos.cms.futurecdn.net/9im4tknZx6qrX7paMavoqK.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Turtle Beach gear is very often styled a little ‘gamer-y’ for my tastes. Even the pricey stuff is typically a bit garish for me, like the $200 <a href="https://www.tomsguide.com/computing/keyboards/turtle-beach-command-series-kb7-tkl-review">Turtle Beach Command KB7</a> we tested before this headset. So I was pleasantly surprised by how grown up the Stealth Pro II feels. The eponymous, stealthy, blacked-out look means it won’t seem out of place in any setup — whether you’re an RGB-clad unicorn puke kinda person, or an anti-RGBer like me.</p><p>I definitely prefer the look of the Stealth Pro II to the chunky Maxwell 2 ANC, and I’d say it edges the Arctis Nova Pro Omni and Elite (although there’s not much in it). For sheer prettiness, the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-blackshark-v3-pro-review">Razer BlackShark V3 Pro</a> and <a href="https://www.tomsguide.com/gaming/gaming-peripherals/fractal-design-scape-review">Fractal Design Scape</a> still win out for me, but naturally this is all highly subjective.</p><h2 id="premium-build-too">Premium build, too</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8eL6o2trwA4CdbAWuBoEwK" name="Turtlebeach_StealthPro_II_013.JPG" alt="The Turtle Beach Stealth Pro II soft padded earcup pads" src="https://cdn.mos.cms.futurecdn.net/8eL6o2trwA4CdbAWuBoEwK.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Stealth Pro II looks and feels like a premium headset, too (as it should, given the price). The brushed metal earcup plates, gunmetal earcup carriers, matte black rubberized headband and mesh padding all scream quality. </p><p>Again, there’s very little between all the flagships here. You’ll find a touch of extra finesse and attention to detail on the Fractal Design Scape and BlackShark V3 Pro, but there’s seriously not much in it. The Maxwell 2 ANC feels as sturdy as they come, sure, but that’s mainly because it weighs a frankly preposterous 1.2lbs — it’s like comparing supercars to a dump truck. I’d say the Stealth Pro II feels a tad sturdier than the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-elite-review">Arctis Nova Elite</a> / Pro Omni, though. But did I mention there isn’t much in it? </p><h2 id="handy-base-station">Handy base station</h2><p>Man, I love me a base station. The Stealth Pro II’s is perhaps rather basic versus the Arctis Nova base station, which bundles a DAC for hi-res wireless, a multipoint USB-C hub, an EQ interface, a settings menu and a battery charging dock. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ggKFe2mTDHGacW5py94Uic" name="Turtle Beach Stealth Pro II_test shots1" alt="The Turtle Beach Stealth Pro II base station with a charging battery and the status lights illuminated purple and green" src="https://cdn.mos.cms.futurecdn.net/ggKFe2mTDHGacW5py94Uic.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>But hey, the Stealth Pro II’s base station is still super handy, facilitating wireless hi-res audio and battery charging for no downtime (more on this later). I love the simplistic status lights, too. The outer light shows you the audio sample rate and/or mic mute status, while the inner light around the battery eject button displays the current charge of the docked power cell.</p><p>By contrast, the Audeze Maxwell 2 ANC and Razer BlackShark V3 Pro only come with a 2.4G dongle — and the Razer’s was particularly annoying in testing.</p><h2 id="39-zero-downtime-39-battery">'Zero-downtime' battery</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="SykCfeEQLDNVpgTarrTptK" name="Turtlebeach_StealthPro_II_008.JPG" alt="The Turtle Beach Stealth Pro II battery removed next to the open earcup" src="https://cdn.mos.cms.futurecdn.net/SykCfeEQLDNVpgTarrTptK.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Stealth Pro II is rated for up to 20 hours on a single charge by Turtle Beach, ANC off. This is ostensibly a little weak. The BlackShark V3 Pro is rated for up to 70 hours, while even the power-hungry Maxwell 2 ANC manages 40 hours without ANC. </p><p>However, from my testing, I think Turtle Beach is being a little conservative. After around 18 hours of use with ANC on, I still had around 65% left — partly, this is because the headset is really loud, meaning I only ran it at around 30% volume to hear everything and be comfortable. That saves juice.</p><p>Just like SteelSeries’ Arctis Nova headsets, though, the important factor is that the Stealth Pro II is a zero downtime headset. Its second battery charges in the base station as you play, meaning no meaningful downtime when gaming near the base station.</p><h2 id="competitively-priced">Competitively priced</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="aSSXJHNEycTaASgCARkhvK" name="Turtlebeach_StealthPro_II_010.JPG" alt="The Turtle Beach Stealth Pro II in hand" src="https://cdn.mos.cms.futurecdn.net/aSSXJHNEycTaASgCARkhvK.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>It’d be remiss of me not to clarify here that the Stealth Pro II is objectively rather expensive at <a href="https://www.amazon.com/Turtle-Beach-Stealth-Premium-Wireless/dp/B0GN4NBD2V/" target="_blank" rel="nofollow">$349</a> / <a href="https://www.amazon.co.uk/Turtle-Beach-Stealth-Wireless-Multiplatform-Black/dp/B0GQCNJCPR" target="_blank" rel="nofollow">£299</a>. That said, it offers comparable performance and build quality to all its rivals, despite sitting in the middle of them all.</p><p>It’s cheaper than the $399 Arctis Nova Pro Omni and especially the $599 Elite, while offering comparatively strong sound quality. Its mic is just as good as the $449 Maxwell 2 ANC, and it’s a hell of a lot lighter and more breathable, even if it can’t match the sheer sound quality of Audeze’s planar drivers. Yet it’s cheaper than all the above.</p><p>The Stealth Pro II’s biggest foil is the $249 Razer BlackShark V3 Pro, which looks a little more premium and offers better ANC for around $100 less. But the Razer lacks the Stealth Pro II’s ‘zero downtime’ battery system and handy base station, and uses the Synapse companion software, which I like a whole lot less than Swarm II (to put it mildly).</p><h2 class="article-body__section" id="section-turtle-beach-stealth-pro-ii-review-the-downs"><span>Turtle Beach Stealth Pro II review: The downs</span></h2><p>It ain’t perfect, though. The Stealth Pro II’s biggest letdown for me was its ANC, which let through a lot of sound it shouldn’t. I also found the headset a little too clampy, although mileage may vary based on your head shape.</p><h2 id="a-little-too-clampy-for-me">A little too clampy for me</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YeKMHatYuYGg8XQZGNrEwK" name="Turtlebeach_StealthPro_II_009.JPG" alt="The Turtle Beach Stealth Pro II laying flat on a white surface with a blue background" src="https://cdn.mos.cms.futurecdn.net/YeKMHatYuYGg8XQZGNrEwK.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I'll caveat this section by saying I found the Stealth Pro II mostly very comfortable. The earcups are super thick and padded, not to mention breathable. There's a layer of foam covering the drivers so even if your ears stick out, they won't rub against the plastic driver housing. And the mesh headband padding is a marvel — it’s supportive, light, breathable and effortlessly comfy. </p><p>Unfortunately, the headset is a little too clampy for me, though. After a few hours using it, I started to feel pressure on my temples and experience headaches. In fairness, this may reduce over time as the headset flexes, and mileage will vary based on the shape of your head. I’ve got a moderately large noggin, so ye of average headsize may be just fine.</p><h2 id="disappointing-anc">Disappointing ANC</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rsmr74xACd434fhrxJgMwK" name="Turtlebeach_StealthPro_II_006.JPG" alt="The Turtle Beach Stealth Pro II earcup pads" src="https://cdn.mos.cms.futurecdn.net/rsmr74xACd434fhrxJgMwK.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>My biggest grip with the Stealth Pro II is its ANC. It has it, and it works to some extent, but it’s really rather poor versus rivals. The SteelSeries Arctis Nova Pro Omni and Elite, while their ANC isn’t perfect (and certainly doesn’t live up to the claims it can drown out a helicopter), performed much better than the Stealth Pro II in the same test. The Audeze Maxwell 2 ANC, meanwhile, is in a different league, as is the Razer BlackShark V3 Pro.</p><p>The Stealth Pro II, tested in my home office with traffic outside, let through substantial amounts of traffic noise. It also let through voices, keyboard sounds, mouse clicks, and chairs moving across the floor. It’s better than no ANC, but I wouldn’t recommend buying this headset if immersive and isolating ANC is your chief priority.</p><h2 id="what-s-that-smell">What’s that… smell?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="N6ujaJ4qU4bXnjgNscN7vK" name="Turtlebeach_StealthPro_II_003.JPG" alt="The Turtle Beach Stealth Pro II in its carry case" src="https://cdn.mos.cms.futurecdn.net/N6ujaJ4qU4bXnjgNscN7vK.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Here’s a weird one: I’ve never had to say this about a headset before, but my Stealth Pro II smells bad. Like really bad. Of smoke or burning or something carcinogenic. It’s as though it was QC’d in a room where someone smokes 80-a-day… for a week.</p><p>I’m not sure whether this is to do with the materials used or the manufacturing process, or both. But it’s bad enough to be noticeable when holding the headset, and even when wearing it sometimes. At times it made me feel a little nauseous.</p><p>I’ve reached out to Turtle Beach’s representative to see why this may be. They’ve confirmed it was an issue with some pre-production models, but I’ve arranged a replacement full production unit to confirm it’s a one-off. I’ll update this review accordingly.</p><h2 class="article-body__section" id="section-turtle-beach-stealth-pro-ii-review-verdict"><span>Turtle Beach Stealth Pro II review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="3QuLvQvhuMrcGhzHBiY4vK" name="Turtlebeach_StealthPro_II_007.JPG" alt="The Turtle Beach Stealth Pro II against a blue background" src="https://cdn.mos.cms.futurecdn.net/3QuLvQvhuMrcGhzHBiY4vK.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Stealth Pro II is a really strong flagship offering from Turtle Beach. The sound quality is impressive, as is the mic, and I love the array of super useful features, from the handy companion app to the base station and ‘zero downtime’ battery. For Xbox and PC gamers, this is a highly commendable choice.</p><p>But it’s not perfect. The ANC system isn't quite up to scratch with the best in the biz, although that’s my only major issue. I found it a little clampy, but that’s really an anatomical roll of the dice, and my headset smelled rather weird, which is likely an isolated manufacturing issue. Given this headset comes in at a cool $50 cheaper than its chief rival, the Nova Pro Omni, they’re definitely things I can forgive.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/turtle-beach-stealth-pro-ii-review</link>
                                                                            <description>
                            <![CDATA[ The Turtle Beach Stealth Pro II is a formidable flagship headset with sound quality to rival Razer and SteelSeries. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">gkTqoHMyLYWakTHQiDpMAU</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/3EgUuzZLcuowP7EX98QduK-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 04 Sep 2026 08:49:03 +0000</pubDate>                                                                                                                                <updated>Fri, 04 Sep 2026 08:49:07 +0000</updated>
                                                                                                                                            <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                <author><![CDATA[ peter.wolinski@futurenet.com (Peter Wolinski) ]]></author>                    <dc:creator><![CDATA[ Peter Wolinski ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/stgPfXWY7ukw8J8rfC7vjg.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Peter is a Senior Editor at Tom&#039;s Guide, heading up the site&#039;s Reviews team and Cameras section. Having built gaming PCs since he was 10 (that&#039;s a while ago now) he&#039;s a bit of a nerd about components and hardware. He&#039;s also been an iPhone user since the classic iPhone 4, and a Mac user for well over a decade. Experienced in using and testing all kinds of technology — from phones through to tablets, computers, games consoles, cameras and smart home tech — helping people find the best tech for them (at the best prices) is what Peter does best. A photographer since he bought his first camera (a Fujifilm) in 2015, Peter was previously an Editor for Canon-Europe.com. He then edited the Cameras and How To sections of Tom&#039;s Guide. When he&#039;s not crafting helpful, in-depth reviews, Peter can usually be found out and about honing his architectural photography skills, riding his motorcycle around Welsh mountain roads, telling everyone about his two greyhounds, squeezing a few extra FPS out of PC games or perfecting his espresso shots.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/3EgUuzZLcuowP7EX98QduK-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Turtle Beach Stealth Pro II next to its base station and 2.4G dongle]]></media:description>                                                            <media:text><![CDATA[The Turtle Beach Stealth Pro II next to its base station and 2.4G dongle]]></media:text>
                                <media:title type="plain"><![CDATA[The Turtle Beach Stealth Pro II next to its base station and 2.4G dongle]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/3EgUuzZLcuowP7EX98QduK-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Stealth Pro II is the flagship gaming headset from Turtle Beach, intended to compete with the heavy hitters from Razer, SteelSeries and Audeze. The <em>crème de la crème</em> are getting pricey now, with all the manufacturers above asking several hundred dollars for their very <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">best gaming headsets</a>. </p><p>The Stealth Pro II is no different, and hella pricey by objective standards, but actually comes in a little cheaper than some of its competition. It also offers excellent sound; an attractive, premium design; zero downtime battery; plus customization via a solid companion app. So could this be a fantastic balanced alternative to the main ultra-premium players?</p><p>As long as you don’t mind fairly weak ANC and a slightly tight clamp force! Find out more in my full Turtle Beach Stealth Pro II review.</p><h2 class="article-body__section" id="section-turtle-beach-stealth-pro-ii-review-cheat-sheet"><span>Turtle Beach Stealth Pro II review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>A premium flagship gaming headset from Turtle Beach</li><li><strong>Who is it for? </strong>Competitive gamers and those who value sound quality</li><li><strong>What does it cost? </strong><a href="https://www.amazon.com/Turtle-Beach-Stealth-Premium-Wireless/dp/B0GN4NBD2V/" target="_blank" rel="nofollow">$349</a> / <a href="https://www.amazon.co.uk/Turtle-Beach-Stealth-Wireless-Multiplatform-Black/dp/B0GQCNJCPR" target="_blank" rel="nofollow">£299</a></li><li><strong>What do we like?</strong> The sound, mic, companion app, styling and build, base station and zero downtime battery system</li><li><strong>What don’t we like?</strong> The ANC is a little weak, and I found the headset a tad clampy</li></ul><h2 class="article-body__section" id="section-turtle-beach-stealth-pro-ii-review-specs"><span>Turtle Beach Stealth Pro II review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/Turtle-Beach-Stealth-Premium-Wireless/dp/B0GN4NBD2V/" target="_blank" rel="nofollow">$349</a> / <a href="https://www.amazon.co.uk/Turtle-Beach-Stealth-Wireless-Multiplatform-Black/dp/B0GQCNJCPR" target="_blank" rel="nofollow">£299</a></p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Black, white</p></td></tr><tr><td class="firstcol " ><p><strong>Platforms</strong></p></td><td  ><p>PC, Xbox, PlayStation, Bluetooth devices</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Wired, 3x 2.4Ghz, 1x Bluetooth</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>2x rechargeable</p></td></tr><tr><td class="firstcol " ><p><strong>Battery life</strong></p></td><td  ><p>40 hours combined</p></td></tr><tr><td class="firstcol " ><p><strong>Frequency response</strong></p></td><td  ><p>10-40,000Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Drivers</strong></p></td><td  ><p>60mm coaxial</p></td></tr><tr><td class="firstcol " ><p><strong>Multipoint connectivity</strong></p></td><td  ><p>Yes</p></td></tr><tr><td class="firstcol " ><p><strong>Paired devices max</strong></p></td><td  ><p>4 (3x 2.4G, 1x BT)</p></td></tr><tr><td class="firstcol " ><p><strong>Microphone</strong></p></td><td  ><p>Unidirectional floating boom mic</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>13.8 ounces / 393 grams</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-turtle-beach-stealth-pro-ii-review-the-ups"><span>Turtle Beach Stealth Pro II review: The ups</span></h2><p>There’s a lot to love about the Stealth Pro II. Sound quality is excellent, there’s a useful companion app, a super clear mic, and a handy base station for ‘zero downtime’ battery life. It’s also moderately priced versus competition.</p><h2 id="excellent-sound-quality">Excellent sound quality</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HFWdi2AigrzMKFpu3MX5bc" name="Turtle Beach Stealth Pro II_test shots2" alt="The Turtle Beach Stealth Pro II with an earcup removed showing the coaxial driver" src="https://cdn.mos.cms.futurecdn.net/HFWdi2AigrzMKFpu3MX5bc.jpg" mos="" align="middle" fullscreen="1" width="2560" height="1440" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/HFWdi2AigrzMKFpu3MX5bc.jpg' target='_blank' class='expand-button icon-expand-image icon' ></a></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Coaxial drivers feature a tweeter that sits in the middle/on top of a main woofer. The tweeter sits under that central circular housing, while the main woofer is the larger, fluted circle. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Turtle Beach Stealth Pro II’s biggest strength is its sound quality. It uses a coaxial driver setup, with a 60mm woofer and separate tweeter in each earcup. This, in theory, gives better clarity and more separation between higher and lower frequencies, as each driver can focus on its own job. Connectivity-wise, there’s 24-bit/96kHz high resolution data/sampling rates over 2.4G, so this is a true hi-res headset, akin to the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-pro-omni-review">SteelSeries Arctis Nova Pro Omni</a> / Elite and <a href="https://www.tomsguide.com/gaming/gaming-peripherals/audeze-maxwell-2-anc-review">Audeze Maxwell 2 ANC</a>.</p><p>The sound is super spacious with exceptional clarity up top and very strong imaging (this lets you pinpoint noises to a specific point). This naturally benefits competitive gameplay, letting me hear the location of enemy cues like footsteps or reloads in my test FPS games: Counter Strike 2 and Isonzo. It was also handy for stealthy games like Sniper Elite: Resistance, where I could again hear and locate even the quietest tapping of enemy footsteps. And it was ideal for immersion, giving three-dimensionality to sounds and effects in the campaign and battles of Total War: Rome II.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1600px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mXPzdXE3NLgxLtw9ZvfbHc" name="Turtle Beach Stealth Pro II_screenshots3" alt="A screenshot of the Turtle Beach Swarm II app being used to customize the Stealth Pro II" src="https://cdn.mos.cms.futurecdn.net/mXPzdXE3NLgxLtw9ZvfbHc.jpg" mos="" align="middle" fullscreen="1" width="1600" height="900" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/mXPzdXE3NLgxLtw9ZvfbHc.jpg' target='_blank' class='expand-button icon-expand-image icon' ></a></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Via the Swarm II app, you have access to a preset Footsteps EQ for a competitive edge. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Turtle Beach / Future)</span></figcaption></figure><p>There’s also Dolby Atmos (DA) support, so you can benefit from that codec in games that use it for surround sound. But even without DA, the sound is impressively spatial.</p><p>Tonal separation and mid-range clarity are really excellent, too. Each of the instruments and layers of the beautiful Rome II soundtrack sounded isolated yet cohesive — the panpipes, the atmospheric flutes, the drums, the horns, all occupied their own distinct space.</p><p>And thanks to that hefty 60mm main driver, there’s plenty of bass performance, giving strong, impactful artillery explosions in Isonzo. Bass response is not quite as nicely controlled as on the Arctis Nova Pro Omni or Elite, and you don’t get anywhere near the tightness of the Maxwell 2’s low-end. I noticed a little bit of booming and muddying at times, too, but it was nothing major, and generally, I loved listening to games and music on the Stealth Pro II.</p><p><em>Listen along to my audio testing playlist on </em><a href="https://www.tomsguide.com/audio/qobuz-review"><em>Qobuz</em></a><em>, our favorite </em><a href="https://www.tomsguide.com/buying-guide/best-music-streaming-services"><em>music streaming service</em></a><em> for audiophiles.</em></p><iframe allow="" height="390" width="400" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://widget.qobuz.com/playlist/59666746?zone=GB-en"></iframe><h2 id="useful-companion-app">Useful companion app</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1600px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="WKivUJJSayR32JEJFmsJPc" name="Turtle Beach Stealth Pro II_screenshots4" alt="A screenshot of the Turtle Beach Swarm II app being used to customize the Stealth Pro II EQ" src="https://cdn.mos.cms.futurecdn.net/WKivUJJSayR32JEJFmsJPc.jpg" mos="" align="middle" fullscreen="1" width="1600" height="900" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/WKivUJJSayR32JEJFmsJPc.jpg' target='_blank' class='expand-button icon-expand-image icon' ></a></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Turtle Beach / Future)</span></figcaption></figure><p>Complementing the Stealth Pro II’s sound is an equally strong companion app, which gives you access to a full custom EQ, as well as EQ presets and a (<em>cringe</em>) “Superhuman hearing” mode — essentially some EQ presets to enhance things like footsteps.</p><p>There’s not the same enormous range of presets as on the SteelSeries GG app, with its hundreds-strong library of per-game EQs. But there’s still more than enough control in Swarm II to get the most out of your game audio.</p><p>In the app, you can also control the microphone EQ, update the headset and (my favorite aspect) change the control assignments to customize how the headset operates. So useful!</p><h2 id="multipoint-connectivity">Multipoint connectivity</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1181px;"><p class="vanilla-image-block" style="padding-top:56.31%;"><img id="phhk8xiqF6fCKSfmxYZ5vK" name="Turtlebeach_StealthPro_II_012.JPG" alt="The Turtle Beach Stealth Pro II earcup and controls" src="https://cdn.mos.cms.futurecdn.net/v2/t:380,l:413,cw:1181,ch:665,q:80/phhk8xiqF6fCKSfmxYZ5vK.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Stealth Pro II offers multipoint connectivity. You can hook up two devices over 2.4G out of the box, using the base station and included USB dongle. You can also buy more dongles (the carry case even comes with a spare dongle slot) to connect to even more, up to four devices. </p><p>If that weren’t enough, you can also connect over Bluetooth simultaneously. I found this a little annoying, though, as the headset doesn’t mute game sounds to prioritize Bluetooth if, for example, you get a call or need to take a work meeting while gaming (which, as you can imagine, happens a lot in my job). You just have both going on at once, and the sidetone dial didn't work to fix this. It’s not a huge issue, but I like that the Nova Pro Omni and Maxwell 2 prioritize Bluetooth in those scenarios.</p><h2 id="super-clear-mic">Super clear mic</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:960px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="3EgUuzZLcuowP7EX98QduK" name="Turtlebeach_StealthPro_II_014.JPG" alt="The Turtle Beach Stealth Pro II next to its base station and 2.4G dongle" src="https://cdn.mos.cms.futurecdn.net/v2/t:540,l:476,cw:960,ch:540,q:80/3EgUuzZLcuowP7EX98QduK.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Stealth Pro II uses a unidirectional mic that’s “floating,” meaning it’s suspended on rubber spokes to eliminate vibration. Turtle Beach says this gives exceptional clarity, although in fairness it’s just a great mic anyway, floating or otherwise.</p><p>Headset mics, even flagship ones, usually disappoint, so I was very surprised at the cleanness and airiness of voice recordings. There was arguably a little too much clarity, as I started to pick up on some of my inherent lispy and sibilant qualities — but there’s no denying how clean and noise-free the recordings were, especially using the ‘clarity’ mic EQ. </p><p>There’s environmental noise reduction, but being a unidirectional mic, that isn’t really needed — the mic only picks up sound from your mouth anyway. I recorded test clips with my window open to a very busy and loud road. Even with noise reduction off, I couldn’t hear the road in any recordings.</p><h2 id="stealthy-grown-up-design">Stealthy, grown-up design</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9im4tknZx6qrX7paMavoqK" name="Turtlebeach_StealthPro_II_011.JPG" alt="The Turtle Beach Stealth Pro II earcup showing the controls" src="https://cdn.mos.cms.futurecdn.net/9im4tknZx6qrX7paMavoqK.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Turtle Beach gear is very often styled a little ‘gamer-y’ for my tastes. Even the pricey stuff is typically a bit garish for me, like the $200 <a href="https://www.tomsguide.com/computing/keyboards/turtle-beach-command-series-kb7-tkl-review">Turtle Beach Command KB7</a> we tested before this headset. So I was pleasantly surprised by how grown up the Stealth Pro II feels. The eponymous, stealthy, blacked-out look means it won’t seem out of place in any setup — whether you’re an RGB-clad unicorn puke kinda person, or an anti-RGBer like me.</p><p>I definitely prefer the look of the Stealth Pro II to the chunky Maxwell 2 ANC, and I’d say it edges the Arctis Nova Pro Omni and Elite (although there’s not much in it). For sheer prettiness, the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-blackshark-v3-pro-review">Razer BlackShark V3 Pro</a> and <a href="https://www.tomsguide.com/gaming/gaming-peripherals/fractal-design-scape-review">Fractal Design Scape</a> still win out for me, but naturally this is all highly subjective.</p><h2 id="premium-build-too">Premium build, too</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8eL6o2trwA4CdbAWuBoEwK" name="Turtlebeach_StealthPro_II_013.JPG" alt="The Turtle Beach Stealth Pro II soft padded earcup pads" src="https://cdn.mos.cms.futurecdn.net/8eL6o2trwA4CdbAWuBoEwK.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Stealth Pro II looks and feels like a premium headset, too (as it should, given the price). The brushed metal earcup plates, gunmetal earcup carriers, matte black rubberized headband and mesh padding all scream quality. </p><p>Again, there’s very little between all the flagships here. You’ll find a touch of extra finesse and attention to detail on the Fractal Design Scape and BlackShark V3 Pro, but there’s seriously not much in it. The Maxwell 2 ANC feels as sturdy as they come, sure, but that’s mainly because it weighs a frankly preposterous 1.2lbs — it’s like comparing supercars to a dump truck. I’d say the Stealth Pro II feels a tad sturdier than the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-elite-review">Arctis Nova Elite</a> / Pro Omni, though. But did I mention there isn’t much in it? </p><h2 id="handy-base-station">Handy base station</h2><p>Man, I love me a base station. The Stealth Pro II’s is perhaps rather basic versus the Arctis Nova base station, which bundles a DAC for hi-res wireless, a multipoint USB-C hub, an EQ interface, a settings menu and a battery charging dock. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ggKFe2mTDHGacW5py94Uic" name="Turtle Beach Stealth Pro II_test shots1" alt="The Turtle Beach Stealth Pro II base station with a charging battery and the status lights illuminated purple and green" src="https://cdn.mos.cms.futurecdn.net/ggKFe2mTDHGacW5py94Uic.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>But hey, the Stealth Pro II’s base station is still super handy, facilitating wireless hi-res audio and battery charging for no downtime (more on this later). I love the simplistic status lights, too. The outer light shows you the audio sample rate and/or mic mute status, while the inner light around the battery eject button displays the current charge of the docked power cell.</p><p>By contrast, the Audeze Maxwell 2 ANC and Razer BlackShark V3 Pro only come with a 2.4G dongle — and the Razer’s was particularly annoying in testing.</p><h2 id="39-zero-downtime-39-battery">'Zero-downtime' battery</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="SykCfeEQLDNVpgTarrTptK" name="Turtlebeach_StealthPro_II_008.JPG" alt="The Turtle Beach Stealth Pro II battery removed next to the open earcup" src="https://cdn.mos.cms.futurecdn.net/SykCfeEQLDNVpgTarrTptK.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Stealth Pro II is rated for up to 20 hours on a single charge by Turtle Beach, ANC off. This is ostensibly a little weak. The BlackShark V3 Pro is rated for up to 70 hours, while even the power-hungry Maxwell 2 ANC manages 40 hours without ANC. </p><p>However, from my testing, I think Turtle Beach is being a little conservative. After around 18 hours of use with ANC on, I still had around 65% left — partly, this is because the headset is really loud, meaning I only ran it at around 30% volume to hear everything and be comfortable. That saves juice.</p><p>Just like SteelSeries’ Arctis Nova headsets, though, the important factor is that the Stealth Pro II is a zero downtime headset. Its second battery charges in the base station as you play, meaning no meaningful downtime when gaming near the base station.</p><h2 id="competitively-priced">Competitively priced</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="aSSXJHNEycTaASgCARkhvK" name="Turtlebeach_StealthPro_II_010.JPG" alt="The Turtle Beach Stealth Pro II in hand" src="https://cdn.mos.cms.futurecdn.net/aSSXJHNEycTaASgCARkhvK.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>It’d be remiss of me not to clarify here that the Stealth Pro II is objectively rather expensive at <a href="https://www.amazon.com/Turtle-Beach-Stealth-Premium-Wireless/dp/B0GN4NBD2V/" target="_blank" rel="nofollow">$349</a> / <a href="https://www.amazon.co.uk/Turtle-Beach-Stealth-Wireless-Multiplatform-Black/dp/B0GQCNJCPR" target="_blank" rel="nofollow">£299</a>. That said, it offers comparable performance and build quality to all its rivals, despite sitting in the middle of them all.</p><p>It’s cheaper than the $399 Arctis Nova Pro Omni and especially the $599 Elite, while offering comparatively strong sound quality. Its mic is just as good as the $449 Maxwell 2 ANC, and it’s a hell of a lot lighter and more breathable, even if it can’t match the sheer sound quality of Audeze’s planar drivers. Yet it’s cheaper than all the above.</p><p>The Stealth Pro II’s biggest foil is the $249 Razer BlackShark V3 Pro, which looks a little more premium and offers better ANC for around $100 less. But the Razer lacks the Stealth Pro II’s ‘zero downtime’ battery system and handy base station, and uses the Synapse companion software, which I like a whole lot less than Swarm II (to put it mildly).</p><h2 class="article-body__section" id="section-turtle-beach-stealth-pro-ii-review-the-downs"><span>Turtle Beach Stealth Pro II review: The downs</span></h2><p>It ain’t perfect, though. The Stealth Pro II’s biggest letdown for me was its ANC, which let through a lot of sound it shouldn’t. I also found the headset a little too clampy, although mileage may vary based on your head shape.</p><h2 id="a-little-too-clampy-for-me">A little too clampy for me</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YeKMHatYuYGg8XQZGNrEwK" name="Turtlebeach_StealthPro_II_009.JPG" alt="The Turtle Beach Stealth Pro II laying flat on a white surface with a blue background" src="https://cdn.mos.cms.futurecdn.net/YeKMHatYuYGg8XQZGNrEwK.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I'll caveat this section by saying I found the Stealth Pro II mostly very comfortable. The earcups are super thick and padded, not to mention breathable. There's a layer of foam covering the drivers so even if your ears stick out, they won't rub against the plastic driver housing. And the mesh headband padding is a marvel — it’s supportive, light, breathable and effortlessly comfy. </p><p>Unfortunately, the headset is a little too clampy for me, though. After a few hours using it, I started to feel pressure on my temples and experience headaches. In fairness, this may reduce over time as the headset flexes, and mileage will vary based on the shape of your head. I’ve got a moderately large noggin, so ye of average headsize may be just fine.</p><h2 id="disappointing-anc">Disappointing ANC</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rsmr74xACd434fhrxJgMwK" name="Turtlebeach_StealthPro_II_006.JPG" alt="The Turtle Beach Stealth Pro II earcup pads" src="https://cdn.mos.cms.futurecdn.net/rsmr74xACd434fhrxJgMwK.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>My biggest grip with the Stealth Pro II is its ANC. It has it, and it works to some extent, but it’s really rather poor versus rivals. The SteelSeries Arctis Nova Pro Omni and Elite, while their ANC isn’t perfect (and certainly doesn’t live up to the claims it can drown out a helicopter), performed much better than the Stealth Pro II in the same test. The Audeze Maxwell 2 ANC, meanwhile, is in a different league, as is the Razer BlackShark V3 Pro.</p><p>The Stealth Pro II, tested in my home office with traffic outside, let through substantial amounts of traffic noise. It also let through voices, keyboard sounds, mouse clicks, and chairs moving across the floor. It’s better than no ANC, but I wouldn’t recommend buying this headset if immersive and isolating ANC is your chief priority.</p><h2 id="what-s-that-smell">What’s that… smell?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="N6ujaJ4qU4bXnjgNscN7vK" name="Turtlebeach_StealthPro_II_003.JPG" alt="The Turtle Beach Stealth Pro II in its carry case" src="https://cdn.mos.cms.futurecdn.net/N6ujaJ4qU4bXnjgNscN7vK.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Here’s a weird one: I’ve never had to say this about a headset before, but my Stealth Pro II smells bad. Like really bad. Of smoke or burning or something carcinogenic. It’s as though it was QC’d in a room where someone smokes 80-a-day… for a week.</p><p>I’m not sure whether this is to do with the materials used or the manufacturing process, or both. But it’s bad enough to be noticeable when holding the headset, and even when wearing it sometimes. At times it made me feel a little nauseous.</p><p>I’ve reached out to Turtle Beach’s representative to see why this may be. They’ve confirmed it was an issue with some pre-production models, but I’ve arranged a replacement full production unit to confirm it’s a one-off. I’ll update this review accordingly.</p><h2 class="article-body__section" id="section-turtle-beach-stealth-pro-ii-review-verdict"><span>Turtle Beach Stealth Pro II review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="3QuLvQvhuMrcGhzHBiY4vK" name="Turtlebeach_StealthPro_II_007.JPG" alt="The Turtle Beach Stealth Pro II against a blue background" src="https://cdn.mos.cms.futurecdn.net/3QuLvQvhuMrcGhzHBiY4vK.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Stealth Pro II is a really strong flagship offering from Turtle Beach. The sound quality is impressive, as is the mic, and I love the array of super useful features, from the handy companion app to the base station and ‘zero downtime’ battery. For Xbox and PC gamers, this is a highly commendable choice.</p><p>But it’s not perfect. The ANC system isn't quite up to scratch with the best in the biz, although that’s my only major issue. I found it a little clampy, but that’s really an anatomical roll of the dice, and my headset smelled rather weird, which is likely an isolated manufacturing issue. Given this headset comes in at a cool $50 cheaper than its chief rival, the Nova Pro Omni, they’re definitely things I can forgive.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Audeze just gave the Maxwell 2 ANC, but there’s some stuff you need to know before buying ]]></title>
                                                                                                <dc:content><![CDATA[ <p>At last! The delayed Audeze Maxwell 2 ANC cometh, following up the fantastic <a href="https://www.tomsguide.com/gaming/gaming-peripherals/audeze-maxwell-2-review">Audeze Maxwell 2</a> and, before that, the original <a href="https://www.tomsguide.com/gaming/gaming-peripherals/audeze-maxwell-review">Audeze Maxwell</a>. I’ve reviewed and extensively used both prior models, and believe me, it’s long been a winning formula.</p><p>The Maxwell 2 ANC packs the same 90mm planar magnetic drivers as the Maxwell 2, for super crisp audio (especially up high); the same SLAM plates for improved bass response down low; and, well, the same pretty much everything. Only now there’s ANC.</p><p>That level of similarity also has its cons. Just like its forebears, the Maxwell 2 ANC is heavy, and uses the same suspended headband that has minimal adjustment — complaints I’ve had with both previous iterations. It’s also a lot pricier than the non-ANC model, and battery life takes a major hit when using ANC.</p><p>So is this the <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">best gaming headset</a> for you? Find out in my full Audeze Maxwell 2 ANC review.</p><h2 class="article-body__section" id="section-audeze-maxwell-2-anc-review-cheat-sheet"><span>Audeze Maxwell 2 ANC review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>An elite-tier gaming headset from audiophile manufacturer, Audeze</li><li><strong>Who is it for? </strong>Gamers who want the absolute best sound quality for gaming and music</li><li><strong>What does it cost? </strong>A fair bit: <a href="https://www.amazon.com/Audeze-Maxwell-Gaming-Headset-PlayStation/dp/B0H8VW5LMW" target="_blank" rel="nofollow">$429</a> / <a href="https://www.amazon.co.uk/Audeze-Maxwell-Gaming-Headset-PlayStation-Silver-Gray/dp/B0H8VW5LMW" target="_blank" rel="nofollow">£429</a></li><li><strong>What do we like? </strong>The sound quality, strong ANC, excellent mic and solid build quality</li><li><strong>What don’t we like?</strong> The headband, weight, ANC battery life and cost</li></ul><h2 class="article-body__section" id="section-audeze-maxwell-2-anc-review-specs"><span>Audeze Maxwell 2 ANC review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/Audeze-Maxwell-Gaming-Headset-PlayStation/dp/B0H8VW5LMW" target="_blank" rel="nofollow">$429</a> / <a href="https://www.amazon.co.uk/Audeze-Maxwell-Gaming-Headset-PlayStation-Silver-Gray/dp/B0H8VW5LMW" target="_blank" rel="nofollow">£429</a></p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Gray/black</p></td></tr><tr><td class="firstcol " ><p><strong>Platforms</strong></p></td><td  ><p>PC, Mac, Xbox, PlayStation, Switch 2, iOS/iPadOS, Android</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Wired, 2.4Ghz, Bluetooth</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>1,800mAh rechargeable</p></td></tr><tr><td class="firstcol " ><p><strong>Battery life</strong></p></td><td  ><p>Up to 40 hours</p></td></tr><tr><td class="firstcol " ><p><strong>Frequency response</strong></p></td><td  ><p>10-50,000Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Drivers</strong></p></td><td  ><p>90mm planar magnetic</p></td></tr><tr><td class="firstcol " ><p><strong>Multipoint connectivity</strong></p></td><td  ><p>Yes</p></td></tr><tr><td class="firstcol " ><p><strong>Paired devices max</strong></p></td><td  ><p>3 (1x 2.4G, 1x BT, 1x Wired)</p></td></tr><tr><td class="firstcol " ><p><strong>Microphone</strong></p></td><td  ><p>Hypercardioid boom mic</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>1.2 lbs / 560 grams</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-audeze-maxwell-2-anc-review-the-ups"><span>Audeze Maxwell 2 ANC review: The ups</span></h2><p>The Maxwell 2 ANC sounds fantastic thanks to its Audeze pedigree, and boasts strong ANC, a fantastic mic and decent build quality.</p><h2 id="audiophile-pedigree">Audiophile pedigree</h2><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="QfiQTw5vpxgQ5r47njfrL6" name="Audeze_Maxwell_2_ANC-9.JPG" alt="The Audeze Maxwell 2 ANC on a wooden desk with a blue background" src="https://cdn.mos.cms.futurecdn.net/QfiQTw5vpxgQ5r47njfrL6.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Audeze, is well known in the audio industry for its high-end audiophile headphones. As such, the Maxwell headsets have some serious sound quality pedigree. </p><p>Like its predecessors, the Maxwell 2 ANC features 90mm planar magnetic drivers. Instead of the cone-shaped dynamic drivers typically used in headsets, planar drivers create sound using ultra-thin metal filaments that vibrate when electricity is passed through them. This means planar drivers can start and stop vibrating much faster than cones, giving much sharper response and greater tonal clarity, especially in the higher frequency range.</p><p>Connectivity-wise, there’s support for up to 24-bit/96kHz over the USB-C dongle, for wireless high-res. Or lossless via USB-C wired. Bluetooth-wise, this headset supports LDAC for hi-res(-ish) Bluetooth and Auracast for hooking up to a single audio source in tandem with other devices. </p><p><em>Note: The Maxwell 2 ANC Xbox/PC version supports Dolby Atmos. Audeze supplied me with the PlayStation/PC version, which doesn’t support Atmos.</em></p><h4 id="isonzo">Isonzo</h4><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1600px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qBZ898aa4mp6DwBuqT8A94" name="Audeze_Maxwell_2_ANC_Screenshots-4" alt="A screenshot of the Audeze app being used to customize the Audeze Maxwell 2 ANC" src="https://cdn.mos.cms.futurecdn.net/qBZ898aa4mp6DwBuqT8A94.jpg" mos="" align="middle" fullscreen="1" width="1600" height="900" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/qBZ898aa4mp6DwBuqT8A94.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: Audeze)</span></figcaption></figure><p>Planars are Audeze’s ‘<em>thing’</em>, and it’s very good at them. Response is super tight and fast, delivering extremely crisp sound, especially in the treble. That gives you excellent clarity for competitive gameplay. In the FPS <em>Isonzo</em>, using the ‘Footsteps’ EQ, enemy footsteps were easy to distinguish among the cacophony of WW1 noise, and effortless to pinpoint thanks to strong spatial imaging. As always with Audeze’s planars, though, the treble isn’t overdone and never becomes painful or fatiguing. There was plenty of mid-range clarity too, for satisfying, mechanical reloads, helping with immersion.</p><p>Planars typically lack the super thick, powerful bass of dynamics. Indeed, through the Maxwell 2 ANC, artillery explosions in Isonzo lacked the outright depth and impact of dynamic headsets like the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-elite-review">SteelSeries Arctis Nova Pro Elite</a>, Fractal Design Scape and <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-blackshark-v3-pro-review">Razer BlackShark V3 Pro</a>. </p><p>However, the Maxwell 2 ANC has the same SLAM plates as its predecessor — metal plates over the drivers which help keep bass frequencies cleaner and free of distortion at higher amplification. That means you can amp up the low end via EQ in the Audeze app, to better reproduce explosions and heavy rumbles. In general, I had to do a little work EQing this headset per-game, but that’s cool, as the Audeze app makes it easy.</p><h4 id="sniper-elite-resistance">Sniper Elite: Resistance</h4><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="Vkr4qjMVSaMaA4YuAwvNi5" name="Audeze_Maxwell_2_ANC-16.JPG" alt="The Audeze Maxwell 2 ANC on a wooden desk with a blue background" src="https://cdn.mos.cms.futurecdn.net/Vkr4qjMVSaMaA4YuAwvNi5.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>In quieter, more contemplative gaming, I really appreciated the Maxwell 2 ANC’s top end detail. In Sniper Elite: Resistance, enemy footsteps are often extremely soft, but I was able to detect them with relative ease, even using the Maxwell 2 ANC’s Immersive EQ rather than Footsteps preset.</p><p>Vocals also sounded great, with Harry Hawker’s cockney accent staying prominent and clear above the din of a misfiring engine. There was also a lovely, natural timbre to vocals — Hawker sounds like he’s smoked a 20-pack then swallowed a bag of gravel, and I could hear the subtle distortions and crackles in his hoarse, husky voice.</p><h2 id="total-war-rome-ii">Total War: Rome II</h2><p>In <em>Total War: Rome II</em>, the game’s magnificent, cinematic OST sounded absolutely fantastic. I could hear each orchestral instrument with pinpoint clarity, from the gentle flutes and panpipes through to the boisterous trumpets and huge percussive smashes. During battles, that stereo imaging came to the fore once again, and I felt myself immersed in the chaos of the fighting. </p><h4 id="music">Music</h4><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="HSeEVdnd7QhuvymKzCGtL6" name="Audeze_Maxwell_2_ANC-21.JPG" alt="The Audeze Maxwell 2 ANC being worn on a person's head" src="https://cdn.mos.cms.futurecdn.net/HSeEVdnd7QhuvymKzCGtL6.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I also listened to my fair share of music on the Maxwell 2 ANC, playing my usual audio testing playlist on <a href="https://www.tomsguide.com/audio/qobuz-review">Qobuz</a>, our favorite <a href="https://www.tomsguide.com/buying-guide/best-music-streaming-services">music streaming service</a> for audiophiles. Bass was, again, tight and enveloping, if not the punchiest or subbiest in electronica. Plenty of top-end detail and mid-range clarity provides strong instrument separation and lets vocals and delicate effects shine — even during busier productions and when EQ’d for bass.</p><p>There’s a respectably spacious sound for closed back cans, too. Sure, there’s not the same amount of width as with open backs like the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/sony-inzone-h6-air-review">Sony Inzone H6 Air</a>, but that’s the price you pay for isolation and noise cancellation.</p><p>Overall, if you want a dual-purpose headset for gaming and detailed music listening, it has to be a Maxwell.</p><p><em>Listen along to my audio testing playlist on Qobuz.</em></p><iframe allow="" height="390" width="400" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://widget.qobuz.com/playlist/59666746?zone=GB-en"></iframe><h2 id="genuinely-good-anc">Genuinely good ANC</h2><p>Audeze claims the Maxwell 2 ANC has the “best ANC in gaming”. It’s not the first brand to bring the hyperbolics to ANC marketing, with SteelSeries claiming its Arctis Nova Elite ($599) and <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-pro-omni-review">Arctis Nova Pro Omni</a> ($399) can block out the sound of a helicopter (spoiler: they couldn’t block the road noise outside my window).</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1600px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="SReEh6QZZWS6WFpXHSzmH4" name="Audeze_Maxwell_2_ANC_Screenshots-2" alt="A graph from Audeze showing the Audeze Maxwell 2 ANC noise cancelation response curve versus rivals" src="https://cdn.mos.cms.futurecdn.net/SReEh6QZZWS6WFpXHSzmH4.jpg" mos="" align="middle" fullscreen="1" width="1600" height="900" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/SReEh6QZZWS6WFpXHSzmH4.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: Audeze)</span></figcaption></figure><p>Audeze claims it has proof, though, touting a lab test graph showing the Maxwell 2 ANC’s superior noise reduction versus a <em>certain $599 competitor</em>. And yeah, I can believe it. Combined with redesigned earpad foam for increased passive noise reduction over its predecessor, the Maxwell’s ANC performed much better than the Nova Elite in my tests. Same room for gaming. Same road outside. Same keyboards on my and my wife’s desk. Same office when I tested at work. </p><p>The Maxwell 2 ANC cut road noise very effectively, keeping me immersed in the tense mood of <em>Sniper Elite: Resistance</em>, as well as the atmospheric OST and tumultuous battles of <em>Total War: Rome II</em>. It almost entirely cut the noise of my <a href="https://www.tomsguide.com/computing/peripherals/nuphy-halo-75-96-v2-review">NuPhy Halo75 V2</a>, and completely drowned out voices, so was great for working, too. On several occasions my wife had to come upstairs and tap me on the shoulder after shouting up to me had failed. I also tested the headset at the London launch event, playing <em>Star Wars Battlefront II</em> in a busy, noisy pub — I heard virtually no noise, and again someone had to tap my shoulder when my time was up.</p><p>Annoyingly, mouse clicks not only got through, but sounded piercing. My wife has a cheap, noisy mouse for work, and the sounds were really frustrating. This was mainly an issue when using Bluetooth, though. Over 2.4G, higher frequencies were a little more muffled.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1600px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="G5LyKwtBFRqHoFpgrVFMF4" name="Audeze_Maxwell_2_ANC_Screenshots-1" alt="A graph from Audeze showing the Audeze Maxwell 2 ANC noise cancelation response curve versus the ANC off curve" src="https://cdn.mos.cms.futurecdn.net/G5LyKwtBFRqHoFpgrVFMF4.jpg" mos="" align="middle" fullscreen="1" width="1600" height="900" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/G5LyKwtBFRqHoFpgrVFMF4.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: Audeze)</span></figcaption></figure><p>I didn’t notice an appreciable drop in sound quality with ANC on, either. There was a slight contracting of the soundstage — the radio vocal effects in Sniper Elite: Resistance cutscenes sounded a little less reverby, for instance — but nothing serious. This ties up with Audeze’s frequency response curves, which show marginal differences between ANC on and off.</p><h2 id="warm-clear-mic">Warm, clear mic</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1405px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="deGUSyCb6cEJxaoze29CK6" name="Audeze_Maxwell_2_ANC-18.JPG" alt="The Audeze Maxwell 2 ANC on a wooden desk with a blue background" src="https://cdn.mos.cms.futurecdn.net/v2/t:212,l:115,cw:1405,ch:790,q:80/deGUSyCb6cEJxaoze29CK6.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Maxwell 2 already boasted the best performing headset boom mic I’ve tested, so it’s no surprise that the ANC version, which uses the same mic, sounds great too. On test calls with colleagues, they reported that my voice sounded clear and warm, and surprisingly high quality for a headset mic. </p><p>The Maxwell 2 ANC uses two mics — a hypercardioid boom mic and a beamforming mic in the headset. The combination works well for reducing environmental noise. The hypercardioid mic pattern cuts out most noise from the side and peripheries, focusing only on your voice, while the beamforming mic uses noise reduction to cut ambient sounds. On test calls, I left my window open to let in noise from the busy road outside. My colleagues heard no distracting sound whatsoever.</p><h2 id="same-old-maxwell-build-plus-extras">Same old Maxwell build, plus extras</h2><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="j4vsULkjtZ6FSoDqQdoEM6" name="Audeze_Maxwell_2_ANC-12.JPG" alt="The Audeze Maxwell 2 ANC on a wooden desk with a blue background" src="https://cdn.mos.cms.futurecdn.net/j4vsULkjtZ6FSoDqQdoEM6.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Weight-gain aside, the Maxwell 2 ANC’s design is more or less the same as the Maxwell 2. It looks pretty much the same, is built just as nicely and also features removable earcup plates to allow for customization.</p><p>The build isn’t on par with the exquisite (and cheaper) <a href="https://www.tomsguide.com/gaming/gaming-peripherals/fractal-design-scape-review">Fractal Design Scape</a> or Razer BlackShark V3 Pro, but the Maxwell 2 ANC doesn’t feel cheap (which is good, because it isn’t).</p><h2 class="article-body__section" id="section-audeze-maxwell-2-anc-review-the-downs"><span>Audeze Maxwell 2 ANC review: The downs</span></h2><p>Unfortunately, the Maxwell 2 ANC maintains its predecessor’s frustrating strap and is very heavy at 1.2 lbs. Battery life with ANC on takes a big hit over 2.4G, plus it’s rather pricey.</p><h2 id="strap-still-lacks-adjustment">Strap still lacks adjustment</h2><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="RRBjs2REXxiJ6MMZRKS2R6" name="Audeze_Maxwell_2_ANC-10.JPG" alt="The Audeze Maxwell 2 ANC headband" src="https://cdn.mos.cms.futurecdn.net/RRBjs2REXxiJ6MMZRKS2R6.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>My biggest gripe with the Maxwell 2 ANC is the same that I had with the OG Maxwell and Maxwell 2: the headband. The only adjustment is via three fixed levels on the suspended inner headband. If, like me, you fall between one of those, you have to fit one side lower than the other, resulting in a lopsided headset.</p><p>I wish Audeze would just add some adjustment to the earcups sliders like literally every other headset. I actually spoke to Audeze’s design team about this at the Maxwell 2 ANC press event. They're aware it can be an issue, but it hasn't been a priority to change thus far. Hopefully we see improvements next time.</p><h2 id="huge-hot-n-heavy">Huge, hot ‘n’ heavy</h2><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="jrgsuhJjQfhVEouf9SimJ6" name="Audeze_Maxwell_2_ANC-6.JPG" alt="The Audeze Maxwell 2 ANC on a wooden desk with a blue background" src="https://cdn.mos.cms.futurecdn.net/jrgsuhJjQfhVEouf9SimJ6.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Like its predecessors, the Maxwell 2 ANC is a beast, thanks to those big drivers and large batteries needed to drive them. The size doesn’t bother me too much, but the weight does. Thanks to the ANC system, the new model weighs 2.5 ounces/70g more than the already weighty non-ANC version. The new model weighs a whopping 1.2lbs, and I found my neck getting pretty tired after longer stints.</p><p>I also found the earcups getting pretty hot and sticky, although I was testing in unseasonable hot conditions during a string of U.K. summer heatwaves, where temperatures pushed to 100F/38C.</p><p>If you regularly game for longer stints and think this would be an issue, I would advise a lighter and more breathable headset, like the Arctis Nova Pro Omni, Fractal Design Scape or Razer BlackShark V3 Pro. All three were incredibly comfortable during our testing.</p><h2 id="anc-battery-life-suffers">ANC battery life suffers</h2><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="bofemXJDyGrRSasB9Jaoz5" name="Audeze_Maxwell_2_ANC-15.JPG" alt="The Audeze Maxwell 2 ANC on a wooden desk with a blue background" src="https://cdn.mos.cms.futurecdn.net/bofemXJDyGrRSasB9Jaoz5.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Obviously, with ANC, battery life is gonna take a hit. Audeze claims 35 hours with ANC, down from 40 with it off. That’s over Bluetooth, though. Over Wi-Fi, my headset was dropping 20% every couple of hours, meaning around 10 hours of playback, extrapolated.</p><p>Audeze just can’t compete with SteelSeries here — the Nova Pro Omni and Nova Elite both come with second batteries that charge in their USB hubs/DACs, meaning up to 60 hours of playback, but zero downtime as long as you’re near the USB hub.</p><h2 id="really-rather-pricey">Really rather pricey</h2><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="Sq8tJABSCo4Ay4zQY4R8a5" name="Audeze_Maxwell_2_ANC-20.JPG" alt="The Audeze Maxwell 2 ANC USB-C dongle, placed on a wooden desk" src="https://cdn.mos.cms.futurecdn.net/Sq8tJABSCo4Ay4zQY4R8a5.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Maxwell 2 ANC costs <a href="https://www.amazon.com/Audeze-Maxwell-Gaming-Headset-PlayStation/dp/B0H8VW5LMW" target="_blank" rel="nofollow">$429</a> / <a href="https://www.amazon.co.uk/Audeze-Maxwell-Gaming-Headset-PlayStation-Silver-Gray/dp/B0H8VW5LMW" target="_blank" rel="nofollow">£429</a>, so up a sizable $100 from the Maxwell 2’s launch price. While it sucks, I’m not surprised by it. Flagship/ultra-premium headsets are regularly pushing into silly money now, with the Nova Elite having set the precedent at $599. The Nova Pro Omni costs $499 and packs similar features to the Maxwell 2 ANC.</p><p>If you want the best sound in gaming, the Maxwell 2 is still my suggestion and costs much less, although obviously doesn’t pack ANC — if you have a noisy road nearby, like me, that could be a dealbreaker. For even less, you can pick up the Razer BlackShark V3 Pro for $249, which features powerful ANC, but its strong sound quality still won’t match that of Audeze’s planars. The Nova Pro Omni is even pricier and way more comfortable, although its ANC isn’t quite as good, and the sound quality, again, just can’t quite compete with the finesse of those planars.</p><h2 class="article-body__section" id="section-audeze-maxwell-2-anc-review-verdict"><span>Audeze Maxwell 2 ANC review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="D9ta59DDMxBFaDDv7ZYRJ6" name="Audeze_Maxwell_2_ANC-3.JPG" alt="The Audeze Maxwell 2 ANC on a wooden desk with a blue background" src="https://cdn.mos.cms.futurecdn.net/D9ta59DDMxBFaDDv7ZYRJ6.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>As so often is the case in life, if you want everything, you gotta pay for it. If sound quality is the only priority you have and you want a headset for gaming <em>and</em> music, there’s really no reason to buy the Maxwell 2 ANC over the Maxwell 2 — the cheaper headset uses the same drivers and puts out equally excellent sound. Unfortunately, if you want or need ANC for work, or simply a noisier home environment, you’ll need to cough up the dough… <strong>if</strong> you also want those lovely planar drivers.</p><p>Our 3.5-star score is defined as very good, but with enough caveats to prevent a 4-star award and our outright recommendation to buy. The Maxwell 2 ANC sounds fantastic, but there are cheaper alternatives that give you ANC without sacrificing comfort. If it has to be the planars, though, and you need ANC, then this is pretty much the only headset to shortlist.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/audeze-maxwell-2-anc-review</link>
                                                                            <description>
                            <![CDATA[ The Audeze Maxwell 2 ANC packs noise cancelation and typically stellar Audeze sound, but costs (and weighs) rather a lot. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">wcFnHxgQSL7Coa4ULTkFCS</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/YDdg92hHG6xTwkNyQUxVN6-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 28 Aug 2026 08:21:39 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                <author><![CDATA[ peter.wolinski@futurenet.com (Peter Wolinski) ]]></author>                    <dc:creator><![CDATA[ Peter Wolinski ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/stgPfXWY7ukw8J8rfC7vjg.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Peter is a Senior Editor at Tom&#039;s Guide, heading up the site&#039;s Reviews team and Cameras section. Having built gaming PCs since he was 10 (that&#039;s a while ago now) he&#039;s a bit of a nerd about components and hardware. He&#039;s also been an iPhone user since the classic iPhone 4, and a Mac user for well over a decade. Experienced in using and testing all kinds of technology — from phones through to tablets, computers, games consoles, cameras and smart home tech — helping people find the best tech for them (at the best prices) is what Peter does best. A photographer since he bought his first camera (a Fujifilm) in 2015, Peter was previously an Editor for Canon-Europe.com. He then edited the Cameras and How To sections of Tom&#039;s Guide. When he&#039;s not crafting helpful, in-depth reviews, Peter can usually be found out and about honing his architectural photography skills, riding his motorcycle around Welsh mountain roads, telling everyone about his two greyhounds, squeezing a few extra FPS out of PC games or perfecting his espresso shots.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/YDdg92hHG6xTwkNyQUxVN6-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Audeze Maxwell 2 ANC on a wooden desk with a blue background]]></media:description>                                                            <media:text><![CDATA[The Audeze Maxwell 2 ANC on a wooden desk with a blue background]]></media:text>
                                <media:title type="plain"><![CDATA[The Audeze Maxwell 2 ANC on a wooden desk with a blue background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/YDdg92hHG6xTwkNyQUxVN6-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>At last! The delayed Audeze Maxwell 2 ANC cometh, following up the fantastic <a href="https://www.tomsguide.com/gaming/gaming-peripherals/audeze-maxwell-2-review">Audeze Maxwell 2</a> and, before that, the original <a href="https://www.tomsguide.com/gaming/gaming-peripherals/audeze-maxwell-review">Audeze Maxwell</a>. I’ve reviewed and extensively used both prior models, and believe me, it’s long been a winning formula.</p><p>The Maxwell 2 ANC packs the same 90mm planar magnetic drivers as the Maxwell 2, for super crisp audio (especially up high); the same SLAM plates for improved bass response down low; and, well, the same pretty much everything. Only now there’s ANC.</p><p>That level of similarity also has its cons. Just like its forebears, the Maxwell 2 ANC is heavy, and uses the same suspended headband that has minimal adjustment — complaints I’ve had with both previous iterations. It’s also a lot pricier than the non-ANC model, and battery life takes a major hit when using ANC.</p><p>So is this the <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">best gaming headset</a> for you? Find out in my full Audeze Maxwell 2 ANC review.</p><h2 class="article-body__section" id="section-audeze-maxwell-2-anc-review-cheat-sheet"><span>Audeze Maxwell 2 ANC review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>An elite-tier gaming headset from audiophile manufacturer, Audeze</li><li><strong>Who is it for? </strong>Gamers who want the absolute best sound quality for gaming and music</li><li><strong>What does it cost? </strong>A fair bit: <a href="https://www.amazon.com/Audeze-Maxwell-Gaming-Headset-PlayStation/dp/B0H8VW5LMW" target="_blank" rel="nofollow">$429</a> / <a href="https://www.amazon.co.uk/Audeze-Maxwell-Gaming-Headset-PlayStation-Silver-Gray/dp/B0H8VW5LMW" target="_blank" rel="nofollow">£429</a></li><li><strong>What do we like? </strong>The sound quality, strong ANC, excellent mic and solid build quality</li><li><strong>What don’t we like?</strong> The headband, weight, ANC battery life and cost</li></ul><h2 class="article-body__section" id="section-audeze-maxwell-2-anc-review-specs"><span>Audeze Maxwell 2 ANC review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/Audeze-Maxwell-Gaming-Headset-PlayStation/dp/B0H8VW5LMW" target="_blank" rel="nofollow">$429</a> / <a href="https://www.amazon.co.uk/Audeze-Maxwell-Gaming-Headset-PlayStation-Silver-Gray/dp/B0H8VW5LMW" target="_blank" rel="nofollow">£429</a></p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Gray/black</p></td></tr><tr><td class="firstcol " ><p><strong>Platforms</strong></p></td><td  ><p>PC, Mac, Xbox, PlayStation, Switch 2, iOS/iPadOS, Android</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Wired, 2.4Ghz, Bluetooth</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>1,800mAh rechargeable</p></td></tr><tr><td class="firstcol " ><p><strong>Battery life</strong></p></td><td  ><p>Up to 40 hours</p></td></tr><tr><td class="firstcol " ><p><strong>Frequency response</strong></p></td><td  ><p>10-50,000Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Drivers</strong></p></td><td  ><p>90mm planar magnetic</p></td></tr><tr><td class="firstcol " ><p><strong>Multipoint connectivity</strong></p></td><td  ><p>Yes</p></td></tr><tr><td class="firstcol " ><p><strong>Paired devices max</strong></p></td><td  ><p>3 (1x 2.4G, 1x BT, 1x Wired)</p></td></tr><tr><td class="firstcol " ><p><strong>Microphone</strong></p></td><td  ><p>Hypercardioid boom mic</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>1.2 lbs / 560 grams</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-audeze-maxwell-2-anc-review-the-ups"><span>Audeze Maxwell 2 ANC review: The ups</span></h2><p>The Maxwell 2 ANC sounds fantastic thanks to its Audeze pedigree, and boasts strong ANC, a fantastic mic and decent build quality.</p><h2 id="audiophile-pedigree">Audiophile pedigree</h2><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="QfiQTw5vpxgQ5r47njfrL6" name="Audeze_Maxwell_2_ANC-9.JPG" alt="The Audeze Maxwell 2 ANC on a wooden desk with a blue background" src="https://cdn.mos.cms.futurecdn.net/QfiQTw5vpxgQ5r47njfrL6.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Audeze, is well known in the audio industry for its high-end audiophile headphones. As such, the Maxwell headsets have some serious sound quality pedigree. </p><p>Like its predecessors, the Maxwell 2 ANC features 90mm planar magnetic drivers. Instead of the cone-shaped dynamic drivers typically used in headsets, planar drivers create sound using ultra-thin metal filaments that vibrate when electricity is passed through them. This means planar drivers can start and stop vibrating much faster than cones, giving much sharper response and greater tonal clarity, especially in the higher frequency range.</p><p>Connectivity-wise, there’s support for up to 24-bit/96kHz over the USB-C dongle, for wireless high-res. Or lossless via USB-C wired. Bluetooth-wise, this headset supports LDAC for hi-res(-ish) Bluetooth and Auracast for hooking up to a single audio source in tandem with other devices. </p><p><em>Note: The Maxwell 2 ANC Xbox/PC version supports Dolby Atmos. Audeze supplied me with the PlayStation/PC version, which doesn’t support Atmos.</em></p><h4 id="isonzo">Isonzo</h4><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1600px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qBZ898aa4mp6DwBuqT8A94" name="Audeze_Maxwell_2_ANC_Screenshots-4" alt="A screenshot of the Audeze app being used to customize the Audeze Maxwell 2 ANC" src="https://cdn.mos.cms.futurecdn.net/qBZ898aa4mp6DwBuqT8A94.jpg" mos="" align="middle" fullscreen="1" width="1600" height="900" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/qBZ898aa4mp6DwBuqT8A94.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: Audeze)</span></figcaption></figure><p>Planars are Audeze’s ‘<em>thing’</em>, and it’s very good at them. Response is super tight and fast, delivering extremely crisp sound, especially in the treble. That gives you excellent clarity for competitive gameplay. In the FPS <em>Isonzo</em>, using the ‘Footsteps’ EQ, enemy footsteps were easy to distinguish among the cacophony of WW1 noise, and effortless to pinpoint thanks to strong spatial imaging. As always with Audeze’s planars, though, the treble isn’t overdone and never becomes painful or fatiguing. There was plenty of mid-range clarity too, for satisfying, mechanical reloads, helping with immersion.</p><p>Planars typically lack the super thick, powerful bass of dynamics. Indeed, through the Maxwell 2 ANC, artillery explosions in Isonzo lacked the outright depth and impact of dynamic headsets like the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-elite-review">SteelSeries Arctis Nova Pro Elite</a>, Fractal Design Scape and <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-blackshark-v3-pro-review">Razer BlackShark V3 Pro</a>. </p><p>However, the Maxwell 2 ANC has the same SLAM plates as its predecessor — metal plates over the drivers which help keep bass frequencies cleaner and free of distortion at higher amplification. That means you can amp up the low end via EQ in the Audeze app, to better reproduce explosions and heavy rumbles. In general, I had to do a little work EQing this headset per-game, but that’s cool, as the Audeze app makes it easy.</p><h4 id="sniper-elite-resistance">Sniper Elite: Resistance</h4><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="Vkr4qjMVSaMaA4YuAwvNi5" name="Audeze_Maxwell_2_ANC-16.JPG" alt="The Audeze Maxwell 2 ANC on a wooden desk with a blue background" src="https://cdn.mos.cms.futurecdn.net/Vkr4qjMVSaMaA4YuAwvNi5.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>In quieter, more contemplative gaming, I really appreciated the Maxwell 2 ANC’s top end detail. In Sniper Elite: Resistance, enemy footsteps are often extremely soft, but I was able to detect them with relative ease, even using the Maxwell 2 ANC’s Immersive EQ rather than Footsteps preset.</p><p>Vocals also sounded great, with Harry Hawker’s cockney accent staying prominent and clear above the din of a misfiring engine. There was also a lovely, natural timbre to vocals — Hawker sounds like he’s smoked a 20-pack then swallowed a bag of gravel, and I could hear the subtle distortions and crackles in his hoarse, husky voice.</p><h2 id="total-war-rome-ii">Total War: Rome II</h2><p>In <em>Total War: Rome II</em>, the game’s magnificent, cinematic OST sounded absolutely fantastic. I could hear each orchestral instrument with pinpoint clarity, from the gentle flutes and panpipes through to the boisterous trumpets and huge percussive smashes. During battles, that stereo imaging came to the fore once again, and I felt myself immersed in the chaos of the fighting. </p><h4 id="music">Music</h4><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="HSeEVdnd7QhuvymKzCGtL6" name="Audeze_Maxwell_2_ANC-21.JPG" alt="The Audeze Maxwell 2 ANC being worn on a person's head" src="https://cdn.mos.cms.futurecdn.net/HSeEVdnd7QhuvymKzCGtL6.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I also listened to my fair share of music on the Maxwell 2 ANC, playing my usual audio testing playlist on <a href="https://www.tomsguide.com/audio/qobuz-review">Qobuz</a>, our favorite <a href="https://www.tomsguide.com/buying-guide/best-music-streaming-services">music streaming service</a> for audiophiles. Bass was, again, tight and enveloping, if not the punchiest or subbiest in electronica. Plenty of top-end detail and mid-range clarity provides strong instrument separation and lets vocals and delicate effects shine — even during busier productions and when EQ’d for bass.</p><p>There’s a respectably spacious sound for closed back cans, too. Sure, there’s not the same amount of width as with open backs like the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/sony-inzone-h6-air-review">Sony Inzone H6 Air</a>, but that’s the price you pay for isolation and noise cancellation.</p><p>Overall, if you want a dual-purpose headset for gaming and detailed music listening, it has to be a Maxwell.</p><p><em>Listen along to my audio testing playlist on Qobuz.</em></p><iframe allow="" height="390" width="400" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://widget.qobuz.com/playlist/59666746?zone=GB-en"></iframe><h2 id="genuinely-good-anc">Genuinely good ANC</h2><p>Audeze claims the Maxwell 2 ANC has the “best ANC in gaming”. It’s not the first brand to bring the hyperbolics to ANC marketing, with SteelSeries claiming its Arctis Nova Elite ($599) and <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-pro-omni-review">Arctis Nova Pro Omni</a> ($399) can block out the sound of a helicopter (spoiler: they couldn’t block the road noise outside my window).</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1600px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="SReEh6QZZWS6WFpXHSzmH4" name="Audeze_Maxwell_2_ANC_Screenshots-2" alt="A graph from Audeze showing the Audeze Maxwell 2 ANC noise cancelation response curve versus rivals" src="https://cdn.mos.cms.futurecdn.net/SReEh6QZZWS6WFpXHSzmH4.jpg" mos="" align="middle" fullscreen="1" width="1600" height="900" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/SReEh6QZZWS6WFpXHSzmH4.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: Audeze)</span></figcaption></figure><p>Audeze claims it has proof, though, touting a lab test graph showing the Maxwell 2 ANC’s superior noise reduction versus a <em>certain $599 competitor</em>. And yeah, I can believe it. Combined with redesigned earpad foam for increased passive noise reduction over its predecessor, the Maxwell’s ANC performed much better than the Nova Elite in my tests. Same room for gaming. Same road outside. Same keyboards on my and my wife’s desk. Same office when I tested at work. </p><p>The Maxwell 2 ANC cut road noise very effectively, keeping me immersed in the tense mood of <em>Sniper Elite: Resistance</em>, as well as the atmospheric OST and tumultuous battles of <em>Total War: Rome II</em>. It almost entirely cut the noise of my <a href="https://www.tomsguide.com/computing/peripherals/nuphy-halo-75-96-v2-review">NuPhy Halo75 V2</a>, and completely drowned out voices, so was great for working, too. On several occasions my wife had to come upstairs and tap me on the shoulder after shouting up to me had failed. I also tested the headset at the London launch event, playing <em>Star Wars Battlefront II</em> in a busy, noisy pub — I heard virtually no noise, and again someone had to tap my shoulder when my time was up.</p><p>Annoyingly, mouse clicks not only got through, but sounded piercing. My wife has a cheap, noisy mouse for work, and the sounds were really frustrating. This was mainly an issue when using Bluetooth, though. Over 2.4G, higher frequencies were a little more muffled.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1600px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="G5LyKwtBFRqHoFpgrVFMF4" name="Audeze_Maxwell_2_ANC_Screenshots-1" alt="A graph from Audeze showing the Audeze Maxwell 2 ANC noise cancelation response curve versus the ANC off curve" src="https://cdn.mos.cms.futurecdn.net/G5LyKwtBFRqHoFpgrVFMF4.jpg" mos="" align="middle" fullscreen="1" width="1600" height="900" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/G5LyKwtBFRqHoFpgrVFMF4.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: Audeze)</span></figcaption></figure><p>I didn’t notice an appreciable drop in sound quality with ANC on, either. There was a slight contracting of the soundstage — the radio vocal effects in Sniper Elite: Resistance cutscenes sounded a little less reverby, for instance — but nothing serious. This ties up with Audeze’s frequency response curves, which show marginal differences between ANC on and off.</p><h2 id="warm-clear-mic">Warm, clear mic</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1405px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="deGUSyCb6cEJxaoze29CK6" name="Audeze_Maxwell_2_ANC-18.JPG" alt="The Audeze Maxwell 2 ANC on a wooden desk with a blue background" src="https://cdn.mos.cms.futurecdn.net/v2/t:212,l:115,cw:1405,ch:790,q:80/deGUSyCb6cEJxaoze29CK6.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Maxwell 2 already boasted the best performing headset boom mic I’ve tested, so it’s no surprise that the ANC version, which uses the same mic, sounds great too. On test calls with colleagues, they reported that my voice sounded clear and warm, and surprisingly high quality for a headset mic. </p><p>The Maxwell 2 ANC uses two mics — a hypercardioid boom mic and a beamforming mic in the headset. The combination works well for reducing environmental noise. The hypercardioid mic pattern cuts out most noise from the side and peripheries, focusing only on your voice, while the beamforming mic uses noise reduction to cut ambient sounds. On test calls, I left my window open to let in noise from the busy road outside. My colleagues heard no distracting sound whatsoever.</p><h2 id="same-old-maxwell-build-plus-extras">Same old Maxwell build, plus extras</h2><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="j4vsULkjtZ6FSoDqQdoEM6" name="Audeze_Maxwell_2_ANC-12.JPG" alt="The Audeze Maxwell 2 ANC on a wooden desk with a blue background" src="https://cdn.mos.cms.futurecdn.net/j4vsULkjtZ6FSoDqQdoEM6.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Weight-gain aside, the Maxwell 2 ANC’s design is more or less the same as the Maxwell 2. It looks pretty much the same, is built just as nicely and also features removable earcup plates to allow for customization.</p><p>The build isn’t on par with the exquisite (and cheaper) <a href="https://www.tomsguide.com/gaming/gaming-peripherals/fractal-design-scape-review">Fractal Design Scape</a> or Razer BlackShark V3 Pro, but the Maxwell 2 ANC doesn’t feel cheap (which is good, because it isn’t).</p><h2 class="article-body__section" id="section-audeze-maxwell-2-anc-review-the-downs"><span>Audeze Maxwell 2 ANC review: The downs</span></h2><p>Unfortunately, the Maxwell 2 ANC maintains its predecessor’s frustrating strap and is very heavy at 1.2 lbs. Battery life with ANC on takes a big hit over 2.4G, plus it’s rather pricey.</p><h2 id="strap-still-lacks-adjustment">Strap still lacks adjustment</h2><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="RRBjs2REXxiJ6MMZRKS2R6" name="Audeze_Maxwell_2_ANC-10.JPG" alt="The Audeze Maxwell 2 ANC headband" src="https://cdn.mos.cms.futurecdn.net/RRBjs2REXxiJ6MMZRKS2R6.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>My biggest gripe with the Maxwell 2 ANC is the same that I had with the OG Maxwell and Maxwell 2: the headband. The only adjustment is via three fixed levels on the suspended inner headband. If, like me, you fall between one of those, you have to fit one side lower than the other, resulting in a lopsided headset.</p><p>I wish Audeze would just add some adjustment to the earcups sliders like literally every other headset. I actually spoke to Audeze’s design team about this at the Maxwell 2 ANC press event. They're aware it can be an issue, but it hasn't been a priority to change thus far. Hopefully we see improvements next time.</p><h2 id="huge-hot-n-heavy">Huge, hot ‘n’ heavy</h2><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="jrgsuhJjQfhVEouf9SimJ6" name="Audeze_Maxwell_2_ANC-6.JPG" alt="The Audeze Maxwell 2 ANC on a wooden desk with a blue background" src="https://cdn.mos.cms.futurecdn.net/jrgsuhJjQfhVEouf9SimJ6.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Like its predecessors, the Maxwell 2 ANC is a beast, thanks to those big drivers and large batteries needed to drive them. The size doesn’t bother me too much, but the weight does. Thanks to the ANC system, the new model weighs 2.5 ounces/70g more than the already weighty non-ANC version. The new model weighs a whopping 1.2lbs, and I found my neck getting pretty tired after longer stints.</p><p>I also found the earcups getting pretty hot and sticky, although I was testing in unseasonable hot conditions during a string of U.K. summer heatwaves, where temperatures pushed to 100F/38C.</p><p>If you regularly game for longer stints and think this would be an issue, I would advise a lighter and more breathable headset, like the Arctis Nova Pro Omni, Fractal Design Scape or Razer BlackShark V3 Pro. All three were incredibly comfortable during our testing.</p><h2 id="anc-battery-life-suffers">ANC battery life suffers</h2><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="bofemXJDyGrRSasB9Jaoz5" name="Audeze_Maxwell_2_ANC-15.JPG" alt="The Audeze Maxwell 2 ANC on a wooden desk with a blue background" src="https://cdn.mos.cms.futurecdn.net/bofemXJDyGrRSasB9Jaoz5.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Obviously, with ANC, battery life is gonna take a hit. Audeze claims 35 hours with ANC, down from 40 with it off. That’s over Bluetooth, though. Over Wi-Fi, my headset was dropping 20% every couple of hours, meaning around 10 hours of playback, extrapolated.</p><p>Audeze just can’t compete with SteelSeries here — the Nova Pro Omni and Nova Elite both come with second batteries that charge in their USB hubs/DACs, meaning up to 60 hours of playback, but zero downtime as long as you’re near the USB hub.</p><h2 id="really-rather-pricey">Really rather pricey</h2><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="Sq8tJABSCo4Ay4zQY4R8a5" name="Audeze_Maxwell_2_ANC-20.JPG" alt="The Audeze Maxwell 2 ANC USB-C dongle, placed on a wooden desk" src="https://cdn.mos.cms.futurecdn.net/Sq8tJABSCo4Ay4zQY4R8a5.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Maxwell 2 ANC costs <a href="https://www.amazon.com/Audeze-Maxwell-Gaming-Headset-PlayStation/dp/B0H8VW5LMW" target="_blank" rel="nofollow">$429</a> / <a href="https://www.amazon.co.uk/Audeze-Maxwell-Gaming-Headset-PlayStation-Silver-Gray/dp/B0H8VW5LMW" target="_blank" rel="nofollow">£429</a>, so up a sizable $100 from the Maxwell 2’s launch price. While it sucks, I’m not surprised by it. Flagship/ultra-premium headsets are regularly pushing into silly money now, with the Nova Elite having set the precedent at $599. The Nova Pro Omni costs $499 and packs similar features to the Maxwell 2 ANC.</p><p>If you want the best sound in gaming, the Maxwell 2 is still my suggestion and costs much less, although obviously doesn’t pack ANC — if you have a noisy road nearby, like me, that could be a dealbreaker. For even less, you can pick up the Razer BlackShark V3 Pro for $249, which features powerful ANC, but its strong sound quality still won’t match that of Audeze’s planars. The Nova Pro Omni is even pricier and way more comfortable, although its ANC isn’t quite as good, and the sound quality, again, just can’t quite compete with the finesse of those planars.</p><h2 class="article-body__section" id="section-audeze-maxwell-2-anc-review-verdict"><span>Audeze Maxwell 2 ANC review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="D9ta59DDMxBFaDDv7ZYRJ6" name="Audeze_Maxwell_2_ANC-3.JPG" alt="The Audeze Maxwell 2 ANC on a wooden desk with a blue background" src="https://cdn.mos.cms.futurecdn.net/D9ta59DDMxBFaDDv7ZYRJ6.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>As so often is the case in life, if you want everything, you gotta pay for it. If sound quality is the only priority you have and you want a headset for gaming <em>and</em> music, there’s really no reason to buy the Maxwell 2 ANC over the Maxwell 2 — the cheaper headset uses the same drivers and puts out equally excellent sound. Unfortunately, if you want or need ANC for work, or simply a noisier home environment, you’ll need to cough up the dough… <strong>if</strong> you also want those lovely planar drivers.</p><p>Our 3.5-star score is defined as very good, but with enough caveats to prevent a 4-star award and our outright recommendation to buy. The Maxwell 2 ANC sounds fantastic, but there are cheaper alternatives that give you ANC without sacrificing comfort. If it has to be the planars, though, and you need ANC, then this is pretty much the only headset to shortlist.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tried this MagSafe game controller and it puts other Bluetooth gamepads to shame — plus it’s $20 off right now ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Call me old school, but I much prefer playing retro games from classic consoles like the Genesis, SNES, PlayStation 1, and Neo Geo. That’s the main reason I bought a <a href="https://www.tomsguide.com/phones/i-bought-this-magsafe-power-bank-to-charge-my-iphone-anywhere-and-it-doubles-as-a-retro-gaming-handheld">power bank that doubles as a retro handheld</a> over the holidays, but now I’m back to gaming on my phone thanks to MCON.</p><p>The company behind it makes some sweet iPhone accessories, like the <a href="https://www.tomsguide.com/phones/iphones/ive-tried-dozens-of-wallet-cases-but-this-magsafe-wallet-does-one-thing-i-havent-seen-before">Snap Grip Wallet</a>, but the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/the-mcon-gaming-controller-lets-you-turn-your-phone-into-a-modern-psp-go-heres-how">MCON Bluetooth Controller</a> is truly in a league of its own compared to other mobile gamepads. Not only does it sport an ingenious, ultra-compact design, but it also differentiates itself by leveraging MagSafe to keep my phone securely mounted. Best of all, it packs all the buttons, triggers, joysticks, and grips needed to feel remarkably like a standard console controller — and you can snag one for $20 off today.</p><div class="product"><a data-dimension112="5e455a4c-9ff5-11f1-bd91-8d35938d9ec9" data-action="Deal Block" data-label="Bluetooth Controller" data-dimension48="Bluetooth Controller" data-dimension25="$129.99" href="https://www.bestbuy.com/product/mcon-bluetooth-controller/J3GW23L8SF/sku/6664808" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:600px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="36Eh7Vr5AXpUNPfmvWQz5R" name="MCON Bluetooth Controller deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/36Eh7Vr5AXpUNPfmvWQz5R.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.bestbuy.com/product/mcon-bluetooth-controller/J3GW23L8SF/sku/6664808" target="_blank" rel="nofollow" data-dimension112="5e455a4c-9ff5-11f1-bd91-8d35938d9ec9" data-action="Deal Block" data-label="Bluetooth Controller" data-dimension48="Bluetooth Controller" data-dimension25="$129.99">Bluetooth Controller: was $149.99 now $129.99</a></strong><br>The Ohsnap MCON Bluetooth Gaming Controller ditches bulky phone holders and attachments for an ultra-compact, MagSafe-compatible design that snaps onto your phone and slips easily into your pocket. It packs console-grade controls, extendable grips, and a detachable magnetic mount that even doubles as a tabletop kickstand.<br><strong>Price check: </strong><a href="https://ohsnap.com/products/mcon-magnetic-controller" target="_blank" rel="nofollow"><strong>$129 @ Ohsnap</strong></a><a class="view-deal button" href="https://www.bestbuy.com/product/mcon-bluetooth-controller/J3GW23L8SF/sku/6664808" target="_blank" rel="nofollow" data-dimension112="5e455a4c-9ff5-11f1-bd91-8d35938d9ec9" data-action="Deal Block" data-label="Bluetooth Controller" data-dimension48="Bluetooth Controller" data-dimension25="$129.99">View Deal</a></p></div><h2 id="compact-design-easy-to-stow-away">Compact design, easy to stow away</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/GM4xPB9mx4BFqC6rgDQzCK.jpg" alt="MCON Bluetooth Controller used with an iPhone." /><figcaption><small role="credit">John Velasco / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Ewyzz58HF3xofYJT8MhHqJ.jpg" alt="MCON Bluetooth Controller used with an iPhone." /><figcaption><small role="credit">John Velasco / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/xvSAEAow8CLu2pNkmL4LAK.jpg" alt="MCON Bluetooth Controller used with an iPhone." /><figcaption><small role="credit">John Velasco / Tom's Guide</small></figcaption></figure></figure><p>One of my biggest gripes with many Bluetooth gamepads is that they simply aren't designed with mobile in mind. Most look a lot like standard console controllers with clunky phone clips tacked onto them. The MCON Bluetooth Controller, on the other hand, is built from the ground up for on-the-go gaming.</p><p>Portability has always been the main bottleneck for mobile setups, but the MCON solves this by folding down into a sleek, self-contained rectangular slab that effortlessly slips into a pocket or the sleeve of a backpack. Looking at the photo above with my iPhone 17 Pro beside it, it shares a nearly identical footprint, just with a slightly thicker chassis.</p><p>What makes the design truly clever is its versatility. Rather than locking you into a single configuration, the magnetic MagSafe holder slides out and fully detaches to double as an adjustable kickstand for tabletop play. This magnetic system eliminates the constraints of rigid clamp widths, pairing just as seamlessly with my <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-17-pro-review">iPhone 17 Pro</a> as it does with wider, notebook-style foldables like the <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-11-pro-fold-review">Pixel 11 Pro Fold</a>.</p><h2 id="small-details-go-a-long-way">Small details go a long way</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/SEfitFZo3BS4qjQezuS37K.jpg" alt="MCON Bluetooth Controller used with an iPhone." /><figcaption><small role="credit">John Velasco / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/hug9ZTZ7pCS2JtZKDjt49K.jpg" alt="MCON Bluetooth Controller used with an iPhone." /><figcaption><small role="credit">John Velasco / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/r5nVSxuBsbm9prJ7ShuwAK.jpg" alt="MCON Bluetooth Controller used with an iPhone." /><figcaption><small role="credit">John Velasco / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/DKPXQxqP9mbHrA9K6z7pGK.jpg" alt="MCON Bluetooth Controller used with an iPhone." /><figcaption><small role="credit">John Velasco / Tom's Guide</small></figcaption></figure></figure><p>Beyond its compact form factor, the MCON Bluetooth Controller packs several subtle design choices that solves many more of the issues I have about mobile controllers. First and foremost, I really dig how the extendable side grips can change the way it feels. When I keep them collapsed, its flat profile channels that nostalgic-feel squared-off NES gamepad, while sliding them out instantly provides the deeper grip support and ergonomic contours of a modern controller.</p><p>On the connectivity front, multi-device Bluetooth pairing lets me switch smoothly between my devices without constantly unpairing and re-syncing them. And as much as I appreciate the wireless connection, there are just some games — like Resident Evil Village — that are better suited with a direct connection. I can eliminate any worry about latency by just connecting it via USB-C.</p><h2 id="the-most-versatile-mobile-gaming-controller">The most versatile mobile gaming controller</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:6035px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="i8S7pByvS9HHfNmtdj6gHK" name="MCON Bluetooth Controller" alt="MCON Bluetooth Controller used with an iPhone." src="https://cdn.mos.cms.futurecdn.net/i8S7pByvS9HHfNmtdj6gHK.jpg" mos="" align="middle" fullscreen="" width="6035" height="3395" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: John Velasco / Tom's Guide)</span></figcaption></figure><p>Whether you’re playing classic retro titles like Castlevania: Symphony of the Night or diving into modern mobile games like Diablo Immortal, the MCON Bluetooth Controller solves the portability headache without sacrificing the ergonomics of a dedicated console gamepad. I think the photo above really sums how much I've enjoyed using it to play classic titles on my phone.</p><p>Between its slick MagSafe mounting, adaptable fold-out grips, and reliable wired mode, I’ve quickly retired my dedicated retro gaming handheld and now keep this with me at all times. If you've been waiting for a mobile controller that doesn't feel like an afterthought, you can save $20 on the MCON Bluetooth Controller right now — making it an even easier recommendation.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Xpo9AO"></div>                            </div>                            <script src="https://kwizly.com/embed/Xpo9AO.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/best-picks/best-samsung-phone">The best Samsung phone might not be the best for you — take our quiz to find out which you should buy</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/ive-been-training-with-the-galaxy-watch-9-for-a-month-3-things-i-like-and-3-i-dont">I've been training with the Galaxy Watch 9 for a month — 3 things I like (and 3 I don't)</a></li><li><a href="http://tomsguide.com/us/best-android-phones,review-6051.html">We've tested the best Android phones available right now from Samsung, Google and Motorola</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/iphones/i-tried-this-magsafe-game-controller-and-it-puts-other-bluetooth-gamepads-to-shame-plus-its-usd20-off-right-now</link>
                                                                            <description>
                            <![CDATA[ The Ohsnap MCON Bluetooth Gaming Controller is the most versatile Bluetooth gaming pad I've used, featuring an ingenious MagSafe magnetic mount. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Ro7E25Pu5R7aQ5ZsVKQ7nJ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/WWoYLLCoc8pvrLfWJhZW6K-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 25 Aug 2026 11:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                <author><![CDATA[ john.velasco@futurenet.com (John Velasco) ]]></author>                    <dc:creator><![CDATA[ John Velasco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/TSj224oX8d5ERXaDs8pDGd.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/WWoYLLCoc8pvrLfWJhZW6K-1280-80.jpg">
                                                            <media:credit><![CDATA[John Velasco / Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[MCON Bluetooth Controller used with an iPhone.]]></media:description>                                                            <media:text><![CDATA[MCON Bluetooth Controller used with an iPhone.]]></media:text>
                                <media:title type="plain"><![CDATA[MCON Bluetooth Controller used with an iPhone.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/WWoYLLCoc8pvrLfWJhZW6K-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Call me old school, but I much prefer playing retro games from classic consoles like the Genesis, SNES, PlayStation 1, and Neo Geo. That’s the main reason I bought a <a href="https://www.tomsguide.com/phones/i-bought-this-magsafe-power-bank-to-charge-my-iphone-anywhere-and-it-doubles-as-a-retro-gaming-handheld">power bank that doubles as a retro handheld</a> over the holidays, but now I’m back to gaming on my phone thanks to MCON.</p><p>The company behind it makes some sweet iPhone accessories, like the <a href="https://www.tomsguide.com/phones/iphones/ive-tried-dozens-of-wallet-cases-but-this-magsafe-wallet-does-one-thing-i-havent-seen-before">Snap Grip Wallet</a>, but the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/the-mcon-gaming-controller-lets-you-turn-your-phone-into-a-modern-psp-go-heres-how">MCON Bluetooth Controller</a> is truly in a league of its own compared to other mobile gamepads. Not only does it sport an ingenious, ultra-compact design, but it also differentiates itself by leveraging MagSafe to keep my phone securely mounted. Best of all, it packs all the buttons, triggers, joysticks, and grips needed to feel remarkably like a standard console controller — and you can snag one for $20 off today.</p><div class="product"><a data-dimension112="5e455a4c-9ff5-11f1-bd91-8d35938d9ec9" data-action="Deal Block" data-label="Bluetooth Controller" data-dimension48="Bluetooth Controller" data-dimension25="$129.99" href="https://www.bestbuy.com/product/mcon-bluetooth-controller/J3GW23L8SF/sku/6664808" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:600px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="36Eh7Vr5AXpUNPfmvWQz5R" name="MCON Bluetooth Controller deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/36Eh7Vr5AXpUNPfmvWQz5R.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.bestbuy.com/product/mcon-bluetooth-controller/J3GW23L8SF/sku/6664808" target="_blank" rel="nofollow" data-dimension112="5e455a4c-9ff5-11f1-bd91-8d35938d9ec9" data-action="Deal Block" data-label="Bluetooth Controller" data-dimension48="Bluetooth Controller" data-dimension25="$129.99">Bluetooth Controller: was $149.99 now $129.99</a></strong><br>The Ohsnap MCON Bluetooth Gaming Controller ditches bulky phone holders and attachments for an ultra-compact, MagSafe-compatible design that snaps onto your phone and slips easily into your pocket. It packs console-grade controls, extendable grips, and a detachable magnetic mount that even doubles as a tabletop kickstand.<br><strong>Price check: </strong><a href="https://ohsnap.com/products/mcon-magnetic-controller" target="_blank" rel="nofollow"><strong>$129 @ Ohsnap</strong></a><a class="view-deal button" href="https://www.bestbuy.com/product/mcon-bluetooth-controller/J3GW23L8SF/sku/6664808" target="_blank" rel="nofollow" data-dimension112="5e455a4c-9ff5-11f1-bd91-8d35938d9ec9" data-action="Deal Block" data-label="Bluetooth Controller" data-dimension48="Bluetooth Controller" data-dimension25="$129.99">View Deal</a></p></div><h2 id="compact-design-easy-to-stow-away">Compact design, easy to stow away</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/GM4xPB9mx4BFqC6rgDQzCK.jpg" alt="MCON Bluetooth Controller used with an iPhone." /><figcaption><small role="credit">John Velasco / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Ewyzz58HF3xofYJT8MhHqJ.jpg" alt="MCON Bluetooth Controller used with an iPhone." /><figcaption><small role="credit">John Velasco / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/xvSAEAow8CLu2pNkmL4LAK.jpg" alt="MCON Bluetooth Controller used with an iPhone." /><figcaption><small role="credit">John Velasco / Tom's Guide</small></figcaption></figure></figure><p>One of my biggest gripes with many Bluetooth gamepads is that they simply aren't designed with mobile in mind. Most look a lot like standard console controllers with clunky phone clips tacked onto them. The MCON Bluetooth Controller, on the other hand, is built from the ground up for on-the-go gaming.</p><p>Portability has always been the main bottleneck for mobile setups, but the MCON solves this by folding down into a sleek, self-contained rectangular slab that effortlessly slips into a pocket or the sleeve of a backpack. Looking at the photo above with my iPhone 17 Pro beside it, it shares a nearly identical footprint, just with a slightly thicker chassis.</p><p>What makes the design truly clever is its versatility. Rather than locking you into a single configuration, the magnetic MagSafe holder slides out and fully detaches to double as an adjustable kickstand for tabletop play. This magnetic system eliminates the constraints of rigid clamp widths, pairing just as seamlessly with my <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-17-pro-review">iPhone 17 Pro</a> as it does with wider, notebook-style foldables like the <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-11-pro-fold-review">Pixel 11 Pro Fold</a>.</p><h2 id="small-details-go-a-long-way">Small details go a long way</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/SEfitFZo3BS4qjQezuS37K.jpg" alt="MCON Bluetooth Controller used with an iPhone." /><figcaption><small role="credit">John Velasco / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/hug9ZTZ7pCS2JtZKDjt49K.jpg" alt="MCON Bluetooth Controller used with an iPhone." /><figcaption><small role="credit">John Velasco / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/r5nVSxuBsbm9prJ7ShuwAK.jpg" alt="MCON Bluetooth Controller used with an iPhone." /><figcaption><small role="credit">John Velasco / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/DKPXQxqP9mbHrA9K6z7pGK.jpg" alt="MCON Bluetooth Controller used with an iPhone." /><figcaption><small role="credit">John Velasco / Tom's Guide</small></figcaption></figure></figure><p>Beyond its compact form factor, the MCON Bluetooth Controller packs several subtle design choices that solves many more of the issues I have about mobile controllers. First and foremost, I really dig how the extendable side grips can change the way it feels. When I keep them collapsed, its flat profile channels that nostalgic-feel squared-off NES gamepad, while sliding them out instantly provides the deeper grip support and ergonomic contours of a modern controller.</p><p>On the connectivity front, multi-device Bluetooth pairing lets me switch smoothly between my devices without constantly unpairing and re-syncing them. And as much as I appreciate the wireless connection, there are just some games — like Resident Evil Village — that are better suited with a direct connection. I can eliminate any worry about latency by just connecting it via USB-C.</p><h2 id="the-most-versatile-mobile-gaming-controller">The most versatile mobile gaming controller</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:6035px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="i8S7pByvS9HHfNmtdj6gHK" name="MCON Bluetooth Controller" alt="MCON Bluetooth Controller used with an iPhone." src="https://cdn.mos.cms.futurecdn.net/i8S7pByvS9HHfNmtdj6gHK.jpg" mos="" align="middle" fullscreen="" width="6035" height="3395" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: John Velasco / Tom's Guide)</span></figcaption></figure><p>Whether you’re playing classic retro titles like Castlevania: Symphony of the Night or diving into modern mobile games like Diablo Immortal, the MCON Bluetooth Controller solves the portability headache without sacrificing the ergonomics of a dedicated console gamepad. I think the photo above really sums how much I've enjoyed using it to play classic titles on my phone.</p><p>Between its slick MagSafe mounting, adaptable fold-out grips, and reliable wired mode, I’ve quickly retired my dedicated retro gaming handheld and now keep this with me at all times. If you've been waiting for a mobile controller that doesn't feel like an afterthought, you can save $20 on the MCON Bluetooth Controller right now — making it an even easier recommendation.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Xpo9AO"></div>                            </div>                            <script src="https://kwizly.com/embed/Xpo9AO.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/best-picks/best-samsung-phone">The best Samsung phone might not be the best for you — take our quiz to find out which you should buy</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/ive-been-training-with-the-galaxy-watch-9-for-a-month-3-things-i-like-and-3-i-dont">I've been training with the Galaxy Watch 9 for a month — 3 things I like (and 3 I don't)</a></li><li><a href="http://tomsguide.com/us/best-android-phones,review-6051.html">We've tested the best Android phones available right now from Samsung, Google and Motorola</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tested Herman Miller’s new Coyl gaming desk and it’s a sleek upgrade for a subtler battlestation — but its best features cost extra ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Herman Miller Coyl Gaming Desk is a sophisticated, dual-motor electric standing desk built for gamers that feels right at home in a high-end home office. While not overly flashy, the subtle red accents on its signature coiled cable and cable management tray give away its gaming DNA.</p><p>Much like the <a href="https://www.tomsguide.com/home/home-office/herman-miller-x-logitech-g-vantum-gaming-chair-review">Herman Miller Vantum</a> gaming chair, the Coyl is the brand's first desk engineered specifically for gamers. It features a customizable modular setup, and while you can buy the base desk on its own, adding the optional cable tray and metal shroud completes its signature aesthetic. The shroud also opens up a pegboard-style ecosystem for extra accessories like controller mounts.</p><p>I’ve been using the Coyl Gaming Desk as my daily driver for a month for both work and play. It offers a spacious work surface, rock-solid three-stage legs, and replaces standard height-adjustment buttons with a slick rotary dial. However, it only comes in a single size, and installing the shroud prevents you from clamping a monitor arm to the back.</p><p>My Herman Miller Coyl Gaming Desk review will help you decide if it deserves a spot among the <a href="https://www.tomsguide.com/best-picks/best-gaming-desks">best gaming desks</a> as well as the <a href="https://www.tomsguide.com/home/home-office/best-standing-desks">best standing desks</a> — and whether its unique features justify its premium price.</p><h3 class="article-body__section" id="section-coyl-gaming-desk-cheat-sheet"><span>Coyl Gaming Desk: 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:5071px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="HEFTHWu7J6sP28yxy9Y6GP" name="Herman Miller Coyl Gaming Desk-19" alt="The Herman Miller Coyl Gaming Desk in black up against a wall" src="https://cdn.mos.cms.futurecdn.net/HEFTHWu7J6sP28yxy9Y6GP.jpg" mos="" align="middle" fullscreen="" width="5071" height="2853" attribution="" endorsement="" class="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 premium, dual-motor electric standing desk.</li><li><strong>Who is it for? </strong>It’s designed for gamers but works just as well in a home office setup.</li><li><strong>What does it cost? </strong>The Herman Miller Coyl Gaming Desk <a href="https://store.hermanmiller.com/gaming-desks/coyl-gaming-desk/100755245.html?lang=en_US&sku=100755245" target="_blank" rel="nofollow">costs $1,095</a>, but you can also get it <a href="https://store.hermanmiller.com/gaming-desks/coyl-gaming-desk/100755246.html?lang=en_US&sku=100755246" target="_blank" rel="nofollow">with a cable trough for $1,475</a> or <a href="https://store.hermanmiller.com/gaming-desks/coyl-gaming-desk/100755247.html?lang=en_US&sku=100755247" target="_blank" rel="nofollow">with a cable trough and a shroud for $1,635</a>. It’s worth noting that the desk is currently 25% off, which brings the price down significantly.</li><li><strong>What do we like? </strong>Using the rotary dial to adjust the desk’s height, the included surge protector’s coiled cable, the wide and easy-to-access cable management tray, and the three-stage legs.</li><li><strong>What don’t we like? </strong>The premium price, that the cable trough isn’t included with the base desk, that you can’t use a monitor arm with the shroud installed, that the desk only comes in one size, and how overpriced the accessories for the shroud are.</li></ul><h3 class="article-body__section" id="section-coyl-gaming-desk-specs"><span>Coyl Gaming Desk: Specs</span></h3><div ><table><tbody><tr><td class="firstcol " ><p><strong>Desktop size</strong></p></td><td  ><p>60 x 28.5 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Desktop style</strong></p></td><td  ><p>Black, white, walnut or ash laminate tabletop</p></td></tr><tr><td class="firstcol " ><p><strong>Leg colors</strong></p></td><td  ><p>Black, white</p></td></tr><tr><td class="firstcol " ><p><strong>Min/max height</strong></p></td><td  ><p>22.5 to 48.5 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Max supported weight</strong></p></td><td  ><p>200 pounds</p></td></tr><tr><td class="firstcol " ><p><strong>Electric</strong></p></td><td  ><p>Yes (dual-motor)</p></td></tr><tr><td class="firstcol " ><p><strong>Noise level</strong></p></td><td  ><p>53.4 dB</p></td></tr><tr><td class="firstcol " ><p><strong>Memory presets</strong></p></td><td  ><p>3</p></td></tr><tr><td class="firstcol " ><p><strong>Grommets</strong></p></td><td  ><p>No</p></td></tr><tr><td class="firstcol " ><p><strong>Cable management</strong></p></td><td  ><p>Felt-lined cable management trough (optional), Laser-cut steel shroud (optional)</p></td></tr><tr><td class="firstcol " ><p><strong>Warranty</strong></p></td><td  ><p>Tabletop (12-year), Base (7-year), Electrical components (5-year)</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-coyl-gaming-desk-the-ups"><span>Coyl Gaming Desk: The Ups</span></h3><p>From its modular design to its unique control scheme, the Coyl Gaming Desk has a lot going for it. However, it’s how these separate systems come together that really makes this desk shine.</p><h2 id="just-a-splash-of-red">Just a splash of red</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4762px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="EVrSu54N55XsrdardTzi6U" name="Herman Miller Coyl Gaming Desk-17" alt="An angled shot showing the Herman Miller Coyl Gaming Desk in black in a corner" src="https://cdn.mos.cms.futurecdn.net/EVrSu54N55XsrdardTzi6U.jpg" mos="" align="middle" fullscreen="" width="4762" height="2679" attribution="" endorsement="" class="inline"></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 60 x 28.5 inches, the Coyl Gaming Desk offers more than enough room for one of the best gaming PCs, a giant monitor or 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">multi-display setup</a>, and all of your accessories. While it’s also available in white, walnut, and ash, most gamers — myself included — will likely opt for the all-black version.</p><p>Even if you go with the base desk without any of Herman Miller’s optional accessories, you still get an under-desk surge protector to plug in all your devices, complete with that iconic red cable true to the desk’s namesake. It adds just a splash of color to let you know that yes, this is in fact a gaming desk. Plus, no matter which desktop finish you pick, that coiled cord always comes in red.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4883px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="pXptHL2LHNhdoijSozdGLZ" name="Herman Miller Coyl Gaming Desk-12" alt="The Herman Miller Coyl Gaming Desk raised up showing off its red coiled cable and the red straps on its cable management tray" src="https://cdn.mos.cms.futurecdn.net/pXptHL2LHNhdoijSozdGLZ.jpg" mos="" align="middle" fullscreen="" width="4883" height="2747" attribution="" endorsement="" class="inline"></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 optional cable trough, the felt front is either dark or light gray, depending on the finish, and its handles match the power cable’s shade of red. It’s a small but welcome touch, though you won’t notice it much while seated. When the desk is raised to its max height of 48.5 inches, though, those red accents really pop. </p><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.25%;"><img id="zkj2yxEVcY6Bqv55Ut7tVd" name="Herman Miller Coyl Gaming Desk-15" alt="The Herman Miller Vantum gaming chair in front of the Herman Miller Coyl Gaming Desk" src="https://cdn.mos.cms.futurecdn.net/zkj2yxEVcY6Bqv55Ut7tVd.jpg" mos="" align="middle" fullscreen="" width="6000" height="3375" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>It’s also worth noting that the Coyl’s red accents, while slightly darker, are a close match to those on Herman Miller’s Vantum gaming chair — perfect if you’re thinking of pairing the two as a set. </p><p>On its own, the Coyl looks fairly similar to many of the other standing desks I’ve reviewed. Adding the cable trough and shroud is what really elevates the desk’s aesthetic. They aren’t strictly necessary, but without them, the only extra hardware features you’re getting are the inward-facing cable hooks on either side and the rotary dial.</p><p>Speaking of which...</p><h2 id="dialed-in">Dialed in</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5018px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="UkMxXa8f4n2Ta8rT3CkiMh" name="Herman Miller Coyl Gaming Desk-9" alt="A person using the rotary dial on the Herman Miller Coyl Gaming Desk to adjust its height" src="https://cdn.mos.cms.futurecdn.net/UkMxXa8f4n2Ta8rT3CkiMh.jpg" mos="" align="middle" fullscreen="" width="5018" height="2823" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Most electric standing desks feature an edge-mounted control pad with up and down buttons alongside several preset keys, though I’ve tested some desks that opt for touch panels instead, like the <a href="https://www.tomsguide.com/home/home-office/branch-four-leg-standing-desk-review">Branch Four Leg Desk</a>. With the Coyl Gaming Desk, Herman Miller’s Devin Tran went in an entirely different direction.</p><p>To adjust this desk’s height, you place a finger inside the designated groove of its spring-loaded rotary dial and turn it. When you hit your preferred height, you simply let go, and the desk does the rest.</p><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="ahjXuGLXCXHgUtH2DuYpik" name="Herman Miller Coyl Gaming Desk-18" alt="A close-up shot of the rotary dial used to control the Herman Miller Coyl Gaming Desk" src="https://cdn.mos.cms.futurecdn.net/ahjXuGLXCXHgUtH2DuYpik.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>A small black-and-white OLED screen displays the desk’s current height in inches. Pressing in on the dial acts as a button to bring up the menu. From there, you can save up to three height presets, switch measurement units, lock the desk’s height, or set custom upper and lower height limits.</p><p>If you’ve been using a standing desk as long as I have, you start to memorize your exact sitting and standing preferences. What I really like about the Coyl’s dial is how effortless it makes those tiny micro-adjustments. On other desks, I often struggle to lock in precisely 28.5 inches — but with the Coyl, fine-tuning down to a tenth of an inch comes much more naturally.</p><h2 id="soft-front-industrial-back">Soft front, industrial back </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5090px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="jfR5SQKAxD77aHjjjtgfE3" name="Herman Miller Coyl Gaming Desk-11" alt="A person pulling on the strap that serves as a handle to open the cable trough underneath the Herman Miller Coyl Gaming Desk" src="https://cdn.mos.cms.futurecdn.net/jfR5SQKAxD77aHjjjtgfE3.jpg" mos="" align="middle" fullscreen="" width="5090" height="2864" attribution="" endorsement="" class="inline"></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 there’s one accessory I consider an absolute must when using an electric standing desk, it’s a <a href="https://www.tomsguide.com/opinion/i-spent-a-year-reviewing-standing-desks-and-this-is-the-one-accessory-i-cant-live-without">cable management tray</a>. That way, you don’t have to worry about your computer or monitor coming unplugged if their cords get snagged when the desk moves up or down. While I would have liked to see a basic cable tray included with the base desk, Herman Miller went above and beyond with the design of its optional cable trough.</p><p>From the front, it’s very inviting with soft-touch felt and red fabric straps — which serve as handles — that attach magnetically. Inside, however, the cable trough’s frame is constructed from sturdy metal, making it exceptionally solid.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5746px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="dTAKzokTMTiZgSNn8wdfm7" name="Herman Miller Coyl Gaming Desk-10" alt="An angled shot showing the the cable trough under the Herman Miller Coyl Gaming Desk filled with power adapters and a surge protector" src="https://cdn.mos.cms.futurecdn.net/dTAKzokTMTiZgSNn8wdfm7.jpg" mos="" align="middle" fullscreen="" width="5746" height="3232" attribution="" endorsement="" class="inline"></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 thing I really like about the cable trough is that it spans the entire width of the Coyl Gaming Desk. This gives you more than enough room for the included surge protector and several bulky power bricks. There are also cutouts on either side and in the middle, allowing that coiled red cable to route down cleanly and stay as close as possible to your nearest wall outlet.</p><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="C645sXNpPgYyqmbVs6jbPB" name="Herman Miller Coyl Gaming Desk-6" alt="A desk setup built around the Herman Miller Coyl Gaming Desk" src="https://cdn.mos.cms.futurecdn.net/C645sXNpPgYyqmbVs6jbPB.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>Given how easy it is to open and close, along with all of the space it provides, you could even use the cable trough for extra storage. With a mini PC, a soundbar, a Nintendo Switch 2, and a monitor on top of the desk, I only used about a third of the cable trough’s total capacity for the surge protector and their power adapters. I could easily put that extra space to good use storing items I occasionally use, like a spare mechanical keyboard.</p><p>Just like the rest of the optional accessories for the Coyl, the cable trough comes at a premium. However, compared to the metal shroud at the back of the desk, I found it to be far more functional and less purely aesthetic.</p><h3 class="article-body__section" id="section-coyl-gaming-desk-the-downs"><span>Coyl Gaming Desk: The Downs</span></h3><p>The Coyl is certainly well-designed, and a lot of thought went into making it a more subtle gaming desk. However, it’s not without its faults — which include having to drill a few extra holes during assembly and the shroud’s functional shortcomings.</p><h2 id="not-entirely-pre-drilled">Not entirely pre-drilled </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4569px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="H9SLSXukqkoh5784oX5nXE" name="Herman Miller Coyl Gaming Desk-25" alt="The multiple boxes the Herman Miller Coyl Gaming Desk arrives in stacked against a wall" src="https://cdn.mos.cms.futurecdn.net/H9SLSXukqkoh5784oX5nXE.jpg" mos="" align="middle" fullscreen="" width="4569" height="2570" attribution="" endorsement="" class="inline"></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 Coyl Gaming Desk arrived in three large boxes alongside a few smaller ones because I tested the desk alongside all of its optional accessories. Everything was exceptionally well-packaged.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5836px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="M2UMBzGA7UwxSj3QAGzuKJ" name="Herman Miller Coyl Gaming Desk-24" alt="All of the parts that make up the Herman Miller Coyl Gaming Desk unboxed and laid out against a wall" src="https://cdn.mos.cms.futurecdn.net/M2UMBzGA7UwxSj3QAGzuKJ.jpg" mos="" align="middle" fullscreen="" width="5836" height="3283" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Unboxing left me with the desktop, cable trough, metal shroud, two motorized legs, and all the hardware required for assembly. Building the desk was fairly straightforward — right up until I needed to route the cables connecting the rotary dial and leg motors to the control box at the center.</p><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="XjnQDo44wcxDKK8JRffwYP" name="Herman Miller Coyl Gaming Desk-23" alt="The instruction manual for the Herman Miller Coyl Gaming Desk with a plastic cable management hook on top of it with the desk's control box in the background" src="https://cdn.mos.cms.futurecdn.net/XjnQDo44wcxDKK8JRffwYP.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>Herman Miller pre-drills most of the holes on the underside of the Coyl. However, I noticed there weren't any pilot holes for the plastic cable management clips. On a budget desk, this is par for the course — but on a setup that can reach over $1,600 fully loaded, I expected every single screw location to be pre-drilled.</p><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="T8hLqh8CVNVMYbyh7Bm7hT" name="Herman Miller Coyl Gaming Desk-22" alt="A person drilling pilot holes into the Herman Miller Coyl Gaming Desk to install cable management clips" src="https://cdn.mos.cms.futurecdn.net/T8hLqh8CVNVMYbyh7Bm7hT.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>After mapping out my cable paths, I grabbed my power drill to drill a few pilot holes before screwing the clips in. Given Coyl’s price tag, I was also surprised to find a standard laminate desktop rather than solid wood or a premium veneer. In this case, though, the laminate worked in my favor — it’s one of the easiest materials to drill into, even if nobody buying a luxury desk expects to need power tools to finish the build.</p><h2 id="a-few-pegs-short">A few pegs 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:5544px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="3rTgh4VM8CUDWP2BzuCfwY" name="Herman Miller Coyl Gaming Desk-21" alt="The Herman Miller Coyl Gaming Desk seen from behind showing off its optional metal shroud" src="https://cdn.mos.cms.futurecdn.net/3rTgh4VM8CUDWP2BzuCfwY.jpg" mos="" align="middle" fullscreen="" width="5544" height="3119" attribution="" endorsement="" class="inline"></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 trend gaining traction across both office and gaming desks is integrated pegboards for modular storage. However, unlike the <a href="https://www.tomsguide.com/home/home-office/corsair-platform-4-elevate-review">Corsair Platform 4: Elevate</a> — which features a tall, full-sized pegboard that extends well above your display — the Coyl’s metal shroud stops short. Very short.</p><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="WXZBRWzWZJQ8kH7DNsaH5d" name="Herman Miller Coyl Gaming Desk-20" alt="An overhead shot showing the bolts you have to hand-tighten to install the optional shroud on the Herman Miller Coyl Gaming Desk" src="https://cdn.mos.cms.futurecdn.net/WXZBRWzWZJQ8kH7DNsaH5d.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 will give Herman Miller credit: installing the shroud is completely tool-free and ridiculously simple. You slide it over two metal mounting posts at the back of the desk and hand-tighten two bolts on either side. Once installed, however, it rises a mere three inches above the desk’s surface.</p><p>Beyond hiding cable clutter and serving as an aesthetic backdrop, the shroud is designed to host a line of proprietary plastic accessories that mount directly to its top edge. Herman Miller offers four options, ranging from a display stand to a round planter bowl.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5351px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wTFxvRrbEjk9A7ngHGgyuh" name="Herman Miller Coyl Gaming Desk-5" alt="A person reaching across the Herman Miller Coyl Gaming Desk to get their phone from the optional stand installed on the shroud at the back of the desk" src="https://cdn.mos.cms.futurecdn.net/wTFxvRrbEjk9A7ngHGgyuh.jpg" mos="" align="middle" fullscreen="" width="5351" height="3010" attribution="" endorsement="" class="inline"></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 accessories function as advertised — I used one for the controller for my <a href="https://www.tomsguide.com/computing/i-added-this-dollar50-monitor-light-bar-to-my-desk-setup-and-its-a-game-changer-for-how-i-work">monitor light bar</a>, one for my phone, and another for a gamepad. The issue is that on a 28.5-inch-deep desk, you really have to reach to access them while seated. Worse, they aren't included with the shroud; they're sold individually at a steep premium given their basic plastic construction.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5456px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="dWzMEGHd6w4Pvy2Zb6mZ6o" name="Herman Miller Coyl Gaming Desk-8" alt="A close-up shot showing a cable attached to the Herman Miller Coyl Gaming Desk's optional shroud using a magnetic clip" src="https://cdn.mos.cms.futurecdn.net/dWzMEGHd6w4Pvy2Zb6mZ6o.jpg" mos="" align="middle" fullscreen="" width="5456" height="3070" attribution="" endorsement="" class="inline"></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 the shroud on its own, though, and I found its steel construction great for magnetic cable clips to keep charging cords within reach.</p><p>Then there's the Coyl's biggest dealbreaker: the shroud completely blocks rear-mounted monitor arms. Using one of the <a href="https://www.tomsguide.com/best-picks/best-monitor-arms">best monitor arms</a> instead of the stand that comes in the box is standard practice for gamers and WFH professionals looking to free up desk space and give their screens that floating look.</p><p>While you can technically clamp an arm to the left or right side of the desk, doing so makes it almost impossible to center your monitor, as most arms lack the reach to extend all the way to the middle.</p><h3 class="article-body__section" id="section-coyl-gaming-desk-verdict"><span>Coyl Gaming Desk: 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:6000px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="mSbKyxnTP48EhMZtDiyzX6" name="Herman Miller Coyl Gaming Desk-3" alt="A person sitting in the Herman Miller Vantum gaming chair playing games at a desk setup built on top of the Herman Miller Coyl Gaming Desk" src="https://cdn.mos.cms.futurecdn.net/mSbKyxnTP48EhMZtDiyzX6.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>The Coyl Gaming Desk is an exceptionally well-crafted piece of home office furniture with just the right amount of gamer flair for a subdued, modern battlestation. It offers rock-solid motor stability, sturdy three-stage legs, and a unique rotary control mechanism that makes fine-tuning your sitting or standing height effortless. While a single desktop size limits its appeal for smaller spaces, the finish options let it fit seamlessly into almost any room decor.</p><p>Where the Coyl falters is in its optional accessory ecosystem. The cable trough and shroud — alongside the signature coiled cable — are what give this desk its iconic look, robust cable management, and modular expansion. At a baseline price exceeding $1,000, it’s a tough pill to swallow that the cable tray isn't included standard, and that adding the shroud prevents you from clamping a monitor arm to the back.</p><p>If you have the budget and want a luxury, design-forward standing desk that elevates your space, the Coyl is an impressive performer — especially if you already own a Herman Miller chair to match. However, if you rely heavily on monitor arms or want a fully feature-packed modular desk out of the box without paying extra for basic add-ons, you may be better served by more versatile alternatives like the Corsair Platform 4 or 6.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/home/home-office/herman-miller-gaming-coyl-desk-review</link>
                                                                            <description>
                            <![CDATA[ Herman Miller’s Coyl gaming desk is sleek on its own, but the full look and extra features rely on pricey add-ons. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">j2yCnctW4oSjwhFNVMmX4d</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/GBJj4j3iCKmKGL9fQFowJJ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 22 Aug 2026 07:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Home Office]]></category>
                                                    <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Home]]></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;Before joining the team, he spent three years covering cybersecurity and B2B tech for ITProPortal while living in South Korea. After moving back to the US. Anthony joined the TechRadar Pro team where he covered these topics along with VPNs, web hosting, online collaboration software and video conferencing for four years. Anthony also has his ears to the ground and is on the lookout for the next major cyberattack or data breach.&lt;/p&gt;&lt;p&gt;Based in Houston, Texas, Anthony also handles VPN testing for both Tom’s Guide and TechRadar. As someone who has worked from home exclusively since 2018, he has reviewed dozens of standing desks as well as office chairs and has taken a closer look at other essential remote working accessories. As part of these reviews, Anthony frequently builds intricate desk setups which is why he’s such a big advocate for cable management and keeping things organized. When he’s not writing, he can be found tinkering with PCs and game consoles, managing cables and making upgrades to his smart home.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/GBJj4j3iCKmKGL9fQFowJJ-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Herman Miller Coyl Gaming Desk set up in a corner with a PC, monitor and other accessories on top]]></media:description>                                                            <media:text><![CDATA[The Herman Miller Coyl Gaming Desk set up in a corner with a PC, monitor and other accessories on top]]></media:text>
                                <media:title type="plain"><![CDATA[The Herman Miller Coyl Gaming Desk set up in a corner with a PC, monitor and other accessories on top]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/GBJj4j3iCKmKGL9fQFowJJ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Herman Miller Coyl Gaming Desk is a sophisticated, dual-motor electric standing desk built for gamers that feels right at home in a high-end home office. While not overly flashy, the subtle red accents on its signature coiled cable and cable management tray give away its gaming DNA.</p><p>Much like the <a href="https://www.tomsguide.com/home/home-office/herman-miller-x-logitech-g-vantum-gaming-chair-review">Herman Miller Vantum</a> gaming chair, the Coyl is the brand's first desk engineered specifically for gamers. It features a customizable modular setup, and while you can buy the base desk on its own, adding the optional cable tray and metal shroud completes its signature aesthetic. The shroud also opens up a pegboard-style ecosystem for extra accessories like controller mounts.</p><p>I’ve been using the Coyl Gaming Desk as my daily driver for a month for both work and play. It offers a spacious work surface, rock-solid three-stage legs, and replaces standard height-adjustment buttons with a slick rotary dial. However, it only comes in a single size, and installing the shroud prevents you from clamping a monitor arm to the back.</p><p>My Herman Miller Coyl Gaming Desk review will help you decide if it deserves a spot among the <a href="https://www.tomsguide.com/best-picks/best-gaming-desks">best gaming desks</a> as well as the <a href="https://www.tomsguide.com/home/home-office/best-standing-desks">best standing desks</a> — and whether its unique features justify its premium price.</p><h3 class="article-body__section" id="section-coyl-gaming-desk-cheat-sheet"><span>Coyl Gaming Desk: 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:5071px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="HEFTHWu7J6sP28yxy9Y6GP" name="Herman Miller Coyl Gaming Desk-19" alt="The Herman Miller Coyl Gaming Desk in black up against a wall" src="https://cdn.mos.cms.futurecdn.net/HEFTHWu7J6sP28yxy9Y6GP.jpg" mos="" align="middle" fullscreen="" width="5071" height="2853" attribution="" endorsement="" class="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 premium, dual-motor electric standing desk.</li><li><strong>Who is it for? </strong>It’s designed for gamers but works just as well in a home office setup.</li><li><strong>What does it cost? </strong>The Herman Miller Coyl Gaming Desk <a href="https://store.hermanmiller.com/gaming-desks/coyl-gaming-desk/100755245.html?lang=en_US&sku=100755245" target="_blank" rel="nofollow">costs $1,095</a>, but you can also get it <a href="https://store.hermanmiller.com/gaming-desks/coyl-gaming-desk/100755246.html?lang=en_US&sku=100755246" target="_blank" rel="nofollow">with a cable trough for $1,475</a> or <a href="https://store.hermanmiller.com/gaming-desks/coyl-gaming-desk/100755247.html?lang=en_US&sku=100755247" target="_blank" rel="nofollow">with a cable trough and a shroud for $1,635</a>. It’s worth noting that the desk is currently 25% off, which brings the price down significantly.</li><li><strong>What do we like? </strong>Using the rotary dial to adjust the desk’s height, the included surge protector’s coiled cable, the wide and easy-to-access cable management tray, and the three-stage legs.</li><li><strong>What don’t we like? </strong>The premium price, that the cable trough isn’t included with the base desk, that you can’t use a monitor arm with the shroud installed, that the desk only comes in one size, and how overpriced the accessories for the shroud are.</li></ul><h3 class="article-body__section" id="section-coyl-gaming-desk-specs"><span>Coyl Gaming Desk: Specs</span></h3><div ><table><tbody><tr><td class="firstcol " ><p><strong>Desktop size</strong></p></td><td  ><p>60 x 28.5 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Desktop style</strong></p></td><td  ><p>Black, white, walnut or ash laminate tabletop</p></td></tr><tr><td class="firstcol " ><p><strong>Leg colors</strong></p></td><td  ><p>Black, white</p></td></tr><tr><td class="firstcol " ><p><strong>Min/max height</strong></p></td><td  ><p>22.5 to 48.5 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Max supported weight</strong></p></td><td  ><p>200 pounds</p></td></tr><tr><td class="firstcol " ><p><strong>Electric</strong></p></td><td  ><p>Yes (dual-motor)</p></td></tr><tr><td class="firstcol " ><p><strong>Noise level</strong></p></td><td  ><p>53.4 dB</p></td></tr><tr><td class="firstcol " ><p><strong>Memory presets</strong></p></td><td  ><p>3</p></td></tr><tr><td class="firstcol " ><p><strong>Grommets</strong></p></td><td  ><p>No</p></td></tr><tr><td class="firstcol " ><p><strong>Cable management</strong></p></td><td  ><p>Felt-lined cable management trough (optional), Laser-cut steel shroud (optional)</p></td></tr><tr><td class="firstcol " ><p><strong>Warranty</strong></p></td><td  ><p>Tabletop (12-year), Base (7-year), Electrical components (5-year)</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-coyl-gaming-desk-the-ups"><span>Coyl Gaming Desk: The Ups</span></h3><p>From its modular design to its unique control scheme, the Coyl Gaming Desk has a lot going for it. However, it’s how these separate systems come together that really makes this desk shine.</p><h2 id="just-a-splash-of-red">Just a splash of red</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4762px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="EVrSu54N55XsrdardTzi6U" name="Herman Miller Coyl Gaming Desk-17" alt="An angled shot showing the Herman Miller Coyl Gaming Desk in black in a corner" src="https://cdn.mos.cms.futurecdn.net/EVrSu54N55XsrdardTzi6U.jpg" mos="" align="middle" fullscreen="" width="4762" height="2679" attribution="" endorsement="" class="inline"></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 60 x 28.5 inches, the Coyl Gaming Desk offers more than enough room for one of the best gaming PCs, a giant monitor or 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">multi-display setup</a>, and all of your accessories. While it’s also available in white, walnut, and ash, most gamers — myself included — will likely opt for the all-black version.</p><p>Even if you go with the base desk without any of Herman Miller’s optional accessories, you still get an under-desk surge protector to plug in all your devices, complete with that iconic red cable true to the desk’s namesake. It adds just a splash of color to let you know that yes, this is in fact a gaming desk. Plus, no matter which desktop finish you pick, that coiled cord always comes in red.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4883px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="pXptHL2LHNhdoijSozdGLZ" name="Herman Miller Coyl Gaming Desk-12" alt="The Herman Miller Coyl Gaming Desk raised up showing off its red coiled cable and the red straps on its cable management tray" src="https://cdn.mos.cms.futurecdn.net/pXptHL2LHNhdoijSozdGLZ.jpg" mos="" align="middle" fullscreen="" width="4883" height="2747" attribution="" endorsement="" class="inline"></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 optional cable trough, the felt front is either dark or light gray, depending on the finish, and its handles match the power cable’s shade of red. It’s a small but welcome touch, though you won’t notice it much while seated. When the desk is raised to its max height of 48.5 inches, though, those red accents really pop. </p><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.25%;"><img id="zkj2yxEVcY6Bqv55Ut7tVd" name="Herman Miller Coyl Gaming Desk-15" alt="The Herman Miller Vantum gaming chair in front of the Herman Miller Coyl Gaming Desk" src="https://cdn.mos.cms.futurecdn.net/zkj2yxEVcY6Bqv55Ut7tVd.jpg" mos="" align="middle" fullscreen="" width="6000" height="3375" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>It’s also worth noting that the Coyl’s red accents, while slightly darker, are a close match to those on Herman Miller’s Vantum gaming chair — perfect if you’re thinking of pairing the two as a set. </p><p>On its own, the Coyl looks fairly similar to many of the other standing desks I’ve reviewed. Adding the cable trough and shroud is what really elevates the desk’s aesthetic. They aren’t strictly necessary, but without them, the only extra hardware features you’re getting are the inward-facing cable hooks on either side and the rotary dial.</p><p>Speaking of which...</p><h2 id="dialed-in">Dialed in</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5018px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="UkMxXa8f4n2Ta8rT3CkiMh" name="Herman Miller Coyl Gaming Desk-9" alt="A person using the rotary dial on the Herman Miller Coyl Gaming Desk to adjust its height" src="https://cdn.mos.cms.futurecdn.net/UkMxXa8f4n2Ta8rT3CkiMh.jpg" mos="" align="middle" fullscreen="" width="5018" height="2823" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Most electric standing desks feature an edge-mounted control pad with up and down buttons alongside several preset keys, though I’ve tested some desks that opt for touch panels instead, like the <a href="https://www.tomsguide.com/home/home-office/branch-four-leg-standing-desk-review">Branch Four Leg Desk</a>. With the Coyl Gaming Desk, Herman Miller’s Devin Tran went in an entirely different direction.</p><p>To adjust this desk’s height, you place a finger inside the designated groove of its spring-loaded rotary dial and turn it. When you hit your preferred height, you simply let go, and the desk does the rest.</p><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="ahjXuGLXCXHgUtH2DuYpik" name="Herman Miller Coyl Gaming Desk-18" alt="A close-up shot of the rotary dial used to control the Herman Miller Coyl Gaming Desk" src="https://cdn.mos.cms.futurecdn.net/ahjXuGLXCXHgUtH2DuYpik.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>A small black-and-white OLED screen displays the desk’s current height in inches. Pressing in on the dial acts as a button to bring up the menu. From there, you can save up to three height presets, switch measurement units, lock the desk’s height, or set custom upper and lower height limits.</p><p>If you’ve been using a standing desk as long as I have, you start to memorize your exact sitting and standing preferences. What I really like about the Coyl’s dial is how effortless it makes those tiny micro-adjustments. On other desks, I often struggle to lock in precisely 28.5 inches — but with the Coyl, fine-tuning down to a tenth of an inch comes much more naturally.</p><h2 id="soft-front-industrial-back">Soft front, industrial back </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5090px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="jfR5SQKAxD77aHjjjtgfE3" name="Herman Miller Coyl Gaming Desk-11" alt="A person pulling on the strap that serves as a handle to open the cable trough underneath the Herman Miller Coyl Gaming Desk" src="https://cdn.mos.cms.futurecdn.net/jfR5SQKAxD77aHjjjtgfE3.jpg" mos="" align="middle" fullscreen="" width="5090" height="2864" attribution="" endorsement="" class="inline"></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 there’s one accessory I consider an absolute must when using an electric standing desk, it’s a <a href="https://www.tomsguide.com/opinion/i-spent-a-year-reviewing-standing-desks-and-this-is-the-one-accessory-i-cant-live-without">cable management tray</a>. That way, you don’t have to worry about your computer or monitor coming unplugged if their cords get snagged when the desk moves up or down. While I would have liked to see a basic cable tray included with the base desk, Herman Miller went above and beyond with the design of its optional cable trough.</p><p>From the front, it’s very inviting with soft-touch felt and red fabric straps — which serve as handles — that attach magnetically. Inside, however, the cable trough’s frame is constructed from sturdy metal, making it exceptionally solid.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5746px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="dTAKzokTMTiZgSNn8wdfm7" name="Herman Miller Coyl Gaming Desk-10" alt="An angled shot showing the the cable trough under the Herman Miller Coyl Gaming Desk filled with power adapters and a surge protector" src="https://cdn.mos.cms.futurecdn.net/dTAKzokTMTiZgSNn8wdfm7.jpg" mos="" align="middle" fullscreen="" width="5746" height="3232" attribution="" endorsement="" class="inline"></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 thing I really like about the cable trough is that it spans the entire width of the Coyl Gaming Desk. This gives you more than enough room for the included surge protector and several bulky power bricks. There are also cutouts on either side and in the middle, allowing that coiled red cable to route down cleanly and stay as close as possible to your nearest wall outlet.</p><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="C645sXNpPgYyqmbVs6jbPB" name="Herman Miller Coyl Gaming Desk-6" alt="A desk setup built around the Herman Miller Coyl Gaming Desk" src="https://cdn.mos.cms.futurecdn.net/C645sXNpPgYyqmbVs6jbPB.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>Given how easy it is to open and close, along with all of the space it provides, you could even use the cable trough for extra storage. With a mini PC, a soundbar, a Nintendo Switch 2, and a monitor on top of the desk, I only used about a third of the cable trough’s total capacity for the surge protector and their power adapters. I could easily put that extra space to good use storing items I occasionally use, like a spare mechanical keyboard.</p><p>Just like the rest of the optional accessories for the Coyl, the cable trough comes at a premium. However, compared to the metal shroud at the back of the desk, I found it to be far more functional and less purely aesthetic.</p><h3 class="article-body__section" id="section-coyl-gaming-desk-the-downs"><span>Coyl Gaming Desk: The Downs</span></h3><p>The Coyl is certainly well-designed, and a lot of thought went into making it a more subtle gaming desk. However, it’s not without its faults — which include having to drill a few extra holes during assembly and the shroud’s functional shortcomings.</p><h2 id="not-entirely-pre-drilled">Not entirely pre-drilled </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4569px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="H9SLSXukqkoh5784oX5nXE" name="Herman Miller Coyl Gaming Desk-25" alt="The multiple boxes the Herman Miller Coyl Gaming Desk arrives in stacked against a wall" src="https://cdn.mos.cms.futurecdn.net/H9SLSXukqkoh5784oX5nXE.jpg" mos="" align="middle" fullscreen="" width="4569" height="2570" attribution="" endorsement="" class="inline"></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 Coyl Gaming Desk arrived in three large boxes alongside a few smaller ones because I tested the desk alongside all of its optional accessories. Everything was exceptionally well-packaged.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5836px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="M2UMBzGA7UwxSj3QAGzuKJ" name="Herman Miller Coyl Gaming Desk-24" alt="All of the parts that make up the Herman Miller Coyl Gaming Desk unboxed and laid out against a wall" src="https://cdn.mos.cms.futurecdn.net/M2UMBzGA7UwxSj3QAGzuKJ.jpg" mos="" align="middle" fullscreen="" width="5836" height="3283" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Unboxing left me with the desktop, cable trough, metal shroud, two motorized legs, and all the hardware required for assembly. Building the desk was fairly straightforward — right up until I needed to route the cables connecting the rotary dial and leg motors to the control box at the center.</p><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="XjnQDo44wcxDKK8JRffwYP" name="Herman Miller Coyl Gaming Desk-23" alt="The instruction manual for the Herman Miller Coyl Gaming Desk with a plastic cable management hook on top of it with the desk's control box in the background" src="https://cdn.mos.cms.futurecdn.net/XjnQDo44wcxDKK8JRffwYP.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>Herman Miller pre-drills most of the holes on the underside of the Coyl. However, I noticed there weren't any pilot holes for the plastic cable management clips. On a budget desk, this is par for the course — but on a setup that can reach over $1,600 fully loaded, I expected every single screw location to be pre-drilled.</p><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="T8hLqh8CVNVMYbyh7Bm7hT" name="Herman Miller Coyl Gaming Desk-22" alt="A person drilling pilot holes into the Herman Miller Coyl Gaming Desk to install cable management clips" src="https://cdn.mos.cms.futurecdn.net/T8hLqh8CVNVMYbyh7Bm7hT.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>After mapping out my cable paths, I grabbed my power drill to drill a few pilot holes before screwing the clips in. Given Coyl’s price tag, I was also surprised to find a standard laminate desktop rather than solid wood or a premium veneer. In this case, though, the laminate worked in my favor — it’s one of the easiest materials to drill into, even if nobody buying a luxury desk expects to need power tools to finish the build.</p><h2 id="a-few-pegs-short">A few pegs 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:5544px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="3rTgh4VM8CUDWP2BzuCfwY" name="Herman Miller Coyl Gaming Desk-21" alt="The Herman Miller Coyl Gaming Desk seen from behind showing off its optional metal shroud" src="https://cdn.mos.cms.futurecdn.net/3rTgh4VM8CUDWP2BzuCfwY.jpg" mos="" align="middle" fullscreen="" width="5544" height="3119" attribution="" endorsement="" class="inline"></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 trend gaining traction across both office and gaming desks is integrated pegboards for modular storage. However, unlike the <a href="https://www.tomsguide.com/home/home-office/corsair-platform-4-elevate-review">Corsair Platform 4: Elevate</a> — which features a tall, full-sized pegboard that extends well above your display — the Coyl’s metal shroud stops short. Very short.</p><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="WXZBRWzWZJQ8kH7DNsaH5d" name="Herman Miller Coyl Gaming Desk-20" alt="An overhead shot showing the bolts you have to hand-tighten to install the optional shroud on the Herman Miller Coyl Gaming Desk" src="https://cdn.mos.cms.futurecdn.net/WXZBRWzWZJQ8kH7DNsaH5d.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 will give Herman Miller credit: installing the shroud is completely tool-free and ridiculously simple. You slide it over two metal mounting posts at the back of the desk and hand-tighten two bolts on either side. Once installed, however, it rises a mere three inches above the desk’s surface.</p><p>Beyond hiding cable clutter and serving as an aesthetic backdrop, the shroud is designed to host a line of proprietary plastic accessories that mount directly to its top edge. Herman Miller offers four options, ranging from a display stand to a round planter bowl.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5351px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wTFxvRrbEjk9A7ngHGgyuh" name="Herman Miller Coyl Gaming Desk-5" alt="A person reaching across the Herman Miller Coyl Gaming Desk to get their phone from the optional stand installed on the shroud at the back of the desk" src="https://cdn.mos.cms.futurecdn.net/wTFxvRrbEjk9A7ngHGgyuh.jpg" mos="" align="middle" fullscreen="" width="5351" height="3010" attribution="" endorsement="" class="inline"></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 accessories function as advertised — I used one for the controller for my <a href="https://www.tomsguide.com/computing/i-added-this-dollar50-monitor-light-bar-to-my-desk-setup-and-its-a-game-changer-for-how-i-work">monitor light bar</a>, one for my phone, and another for a gamepad. The issue is that on a 28.5-inch-deep desk, you really have to reach to access them while seated. Worse, they aren't included with the shroud; they're sold individually at a steep premium given their basic plastic construction.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5456px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="dWzMEGHd6w4Pvy2Zb6mZ6o" name="Herman Miller Coyl Gaming Desk-8" alt="A close-up shot showing a cable attached to the Herman Miller Coyl Gaming Desk's optional shroud using a magnetic clip" src="https://cdn.mos.cms.futurecdn.net/dWzMEGHd6w4Pvy2Zb6mZ6o.jpg" mos="" align="middle" fullscreen="" width="5456" height="3070" attribution="" endorsement="" class="inline"></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 the shroud on its own, though, and I found its steel construction great for magnetic cable clips to keep charging cords within reach.</p><p>Then there's the Coyl's biggest dealbreaker: the shroud completely blocks rear-mounted monitor arms. Using one of the <a href="https://www.tomsguide.com/best-picks/best-monitor-arms">best monitor arms</a> instead of the stand that comes in the box is standard practice for gamers and WFH professionals looking to free up desk space and give their screens that floating look.</p><p>While you can technically clamp an arm to the left or right side of the desk, doing so makes it almost impossible to center your monitor, as most arms lack the reach to extend all the way to the middle.</p><h3 class="article-body__section" id="section-coyl-gaming-desk-verdict"><span>Coyl Gaming Desk: 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:6000px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="mSbKyxnTP48EhMZtDiyzX6" name="Herman Miller Coyl Gaming Desk-3" alt="A person sitting in the Herman Miller Vantum gaming chair playing games at a desk setup built on top of the Herman Miller Coyl Gaming Desk" src="https://cdn.mos.cms.futurecdn.net/mSbKyxnTP48EhMZtDiyzX6.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>The Coyl Gaming Desk is an exceptionally well-crafted piece of home office furniture with just the right amount of gamer flair for a subdued, modern battlestation. It offers rock-solid motor stability, sturdy three-stage legs, and a unique rotary control mechanism that makes fine-tuning your sitting or standing height effortless. While a single desktop size limits its appeal for smaller spaces, the finish options let it fit seamlessly into almost any room decor.</p><p>Where the Coyl falters is in its optional accessory ecosystem. The cable trough and shroud — alongside the signature coiled cable — are what give this desk its iconic look, robust cable management, and modular expansion. At a baseline price exceeding $1,000, it’s a tough pill to swallow that the cable tray isn't included standard, and that adding the shroud prevents you from clamping a monitor arm to the back.</p><p>If you have the budget and want a luxury, design-forward standing desk that elevates your space, the Coyl is an impressive performer — especially if you already own a Herman Miller chair to match. However, if you rely heavily on monitor arms or want a fully feature-packed modular desk out of the box without paying extra for basic add-ons, you may be better served by more versatile alternatives like the Corsair Platform 4 or 6.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Gamer dad? I've found 11 winning Father's Day gaming ideas to level up your gifting ]]></title>
                                                                                                <dc:content><![CDATA[ <p>It's almost <a href="https://www.tomsguide.com/sales-events/fathers-day-gift-ideas-au">Father's Day 2026</a>, with the big day arriving on Sunday, September 6 in Australia.</p><p>If you've got a gamer-obsessed father (or father figure), it's an ideal time to help upgrade any ageing consoles (if you have the means) or add some fun accessories to dad's existing set-up. Whether he's a staunch keyboard warrior or has been obsessed with his PlayStation or Xbox his entire life, I've gathered 10 of the best gaming-specific deals for Father's Day below. </p><p>It is worth noting, though, I haven't included specific games in the list, largely because all gamer dads are different — and their playing preferences reflect that. Instead, I've selected some fun consoles, peripherals and accessories to make every dad's gaming experience better. </p><p>All of these items come from top-rated retailers, like Amazon, JB Hi-Fi and The Good Guys, with each claiming fast delivery in time for the big day. It's also <a href="https://www.amazon.com.au/b/?_encoding=UTF8&node=221080127051&pd_rd_w=5mj5c&content-id=amzn1.sym.3d08badd-4ec6-4c8d-8b19-6f0b265690a1&pf_rd_p=3d08badd-4ec6-4c8d-8b19-6f0b265690a1&pf_rd_r=J6JXD6R3F0RKYRZR2SDE&pd_rd_wg=TNehv&pd_rd_r=4bd5449a-5ad9-483f-b6a2-d6018ece60f0&ref_=pd_hp_d_r_atf_unk" target="_blank">Gaming Week on Amazon</a>, so now is the best time to shop and save big on the latest (and greatest) gaming consoles, PC peripherals and accessories. </p><p>I'll stop with the waffling now — here are the best Father's Day gaming gifts I've found this year. </p><h3 class="article-body__section" id="section-11-best-father-s-day-gaming-deals"><span>11 best Father's Day gaming deals</span></h3><div class="product"><a data-dimension112="08f20b6c-9c3a-11f1-94d5-6344a3195dbd" data-action="Deal Block" data-label="Switch 2 Console" data-dimension48="Switch 2 Console" data-dimension25="$699" href="https://www.jbhifi.com.au/products/nintendo-switch-2-console" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="63dGPyBNH73xm2BYnLsoJP" name="Nintendo Switch 2 deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/63dGPyBNH73xm2BYnLsoJP.jpg" mos="" align="middle" fullscreen="" width="2000" height="2000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.jbhifi.com.au/products/nintendo-switch-2-console" target="_blank" rel="nofollow" data-dimension112="08f20b6c-9c3a-11f1-94d5-6344a3195dbd" data-action="Deal Block" data-label="Switch 2 Console" data-dimension48="Switch 2 Console" data-dimension25="$699">Switch 2 Console: $699</a></strong><br>Nintendo Switch 2 takes what worked about its best-selling predecessor and makes impactful upgrades across the board. From the excellent, noticeably larger, 7.9-inch display to the more powerful internal specs, the Switch 2 is a full leap forward and the best hybrid console you can buy. <a class="view-deal button" href="https://www.jbhifi.com.au/products/nintendo-switch-2-console" target="_blank" rel="nofollow" data-dimension112="08f20b6c-9c3a-11f1-94d5-6344a3195dbd" data-action="Deal Block" data-label="Switch 2 Console" data-dimension48="Switch 2 Console" data-dimension25="$699">View Deal</a></p></div><div class="product"><a data-dimension112="08f20bee-9c3a-11f1-b168-1dc7d62f6b88" data-action="Deal Block" data-label="PlayStation 5 Digital Slim Console (825GB)" data-dimension48="PlayStation 5 Digital Slim Console (825GB)" data-dimension25="$919" href="https://www.jbhifi.com.au/products/ps5-playstation-5-slim-digital-console-825gb" 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="PFZzmTD26fsVB8AzmQ9JXm" name="ps5-slim-deal.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/PFZzmTD26fsVB8AzmQ9JXm.png" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.jbhifi.com.au/products/ps5-playstation-5-slim-digital-console-825gb" target="_blank" rel="nofollow" data-dimension112="08f20bee-9c3a-11f1-b168-1dc7d62f6b88" data-action="Deal Block" data-label="PlayStation 5 Digital Slim Console (825GB)" data-dimension48="PlayStation 5 Digital Slim Console (825GB)" data-dimension25="$919">PlayStation 5 Digital Slim Console (825GB): $919</a></strong><br>Got a gamer dad who needs an upgrade? The PS5 console unleashes new gaming possibilities with ultrafast loading thanks to a high-speed SSD, deeper immersion support for haptic feedback, adaptive triggers and 3D audio. Not only that, the latest console is home to a suite of great games and exclusives that'll provide entertainment for hours on end.<a class="view-deal button" href="https://www.jbhifi.com.au/products/ps5-playstation-5-slim-digital-console-825gb" target="_blank" rel="nofollow" data-dimension112="08f20bee-9c3a-11f1-b168-1dc7d62f6b88" data-action="Deal Block" data-label="PlayStation 5 Digital Slim Console (825GB)" data-dimension48="PlayStation 5 Digital Slim Console (825GB)" data-dimension25="$919">View Deal</a></p></div><div class="product"><a data-dimension112="08f20c52-9c3a-11f1-86a3-95c3c96ca8ec" data-action="Deal Block" data-label="G29 Driving Force Racing Wheel and Floor Pedals" data-dimension48="G29 Driving Force Racing Wheel and Floor Pedals" data-dimension25="$307.5" href="https://www.amazon.com.au/Logitech-Driving-Force-Feedback-Racing/dp/B076P3QK6K" 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="BZ2PGFNptgo9YMzJSKuNmA" name="logitech-g29-driving-force-racing-wheel--b019993a-fc9a-4479-b76a-5525c2af290e.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/BZ2PGFNptgo9YMzJSKuNmA.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com.au/Logitech-Driving-Force-Feedback-Racing/dp/B076P3QK6K" target="_blank" rel="nofollow" data-dimension112="08f20c52-9c3a-11f1-86a3-95c3c96ca8ec" data-action="Deal Block" data-label="G29 Driving Force Racing Wheel and Floor Pedals" data-dimension48="G29 Driving Force Racing Wheel and Floor Pedals" data-dimension25="$307.5">G29 Driving Force Racing Wheel and Floor Pedals: was $549.95 now $307.5</a></strong><br>Get dad's heart racing with this Driving Force wheel from Logitech. Compatible with PlayStation 4 and 5 consoles and PC gaming, this wheel will take dad's sim racing to the next level, thanks to its comfortable pedals and precision force feedback wheel action. <a class="view-deal button" href="https://www.amazon.com.au/Logitech-Driving-Force-Feedback-Racing/dp/B076P3QK6K" target="_blank" rel="nofollow" data-dimension112="08f20c52-9c3a-11f1-86a3-95c3c96ca8ec" data-action="Deal Block" data-label="G29 Driving Force Racing Wheel and Floor Pedals" data-dimension48="G29 Driving Force Racing Wheel and Floor Pedals" data-dimension25="$307.5">View Deal</a></p></div><div class="product"><a data-dimension112="08f20cb6-9c3a-11f1-a07c-ef7b42d9ce99" data-action="Deal Block" data-label="Eero 7 Dual-Band Mesh Wi-Fi 7 Router" data-dimension48="Eero 7 Dual-Band Mesh Wi-Fi 7 Router" data-dimension25="$299.99" href="https://www.amazon.com.au/Introducing-Amazon-eero-dual-band-router/dp/B0DB6GQFRV" 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="JCkfumrwwbtMEmC8WQpTfA" name="amazon-eero-7-dualband-mesh-wifi-7-route-d45138b4-5445-4850-a2f8-75b64ecd44e6.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/JCkfumrwwbtMEmC8WQpTfA.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com.au/Introducing-Amazon-eero-dual-band-router/dp/B0DB6GQFRV" target="_blank" rel="nofollow" data-dimension112="08f20cb6-9c3a-11f1-a07c-ef7b42d9ce99" data-action="Deal Block" data-label="Eero 7 Dual-Band Mesh Wi-Fi 7 Router" data-dimension48="Eero 7 Dual-Band Mesh Wi-Fi 7 Router" data-dimension25="$299.99">Eero 7 Dual-Band Mesh Wi-Fi 7 Router: $299.99</a></strong><br>If dad already has his ultimate gaming set up sorted, it might be worth checking his Wi-Fi router. This eero 7 is compatible with 2Gbps internet plans and will easily support 120+ connected devices, so no matter what game he's downloading, the whole family shouldn't have many (if any) interruptions. <a class="view-deal button" href="https://www.amazon.com.au/Introducing-Amazon-eero-dual-band-router/dp/B0DB6GQFRV" target="_blank" rel="nofollow" data-dimension112="08f20cb6-9c3a-11f1-a07c-ef7b42d9ce99" data-action="Deal Block" data-label="Eero 7 Dual-Band Mesh Wi-Fi 7 Router" data-dimension48="Eero 7 Dual-Band Mesh Wi-Fi 7 Router" data-dimension25="$299.99">View Deal</a></p></div><div class="product"><a data-dimension112="08f20d2e-9c3a-11f1-bdae-57ad213bfe50" data-action="Deal Block" data-label="Mercury V75 Pro" data-dimension48="Mercury V75 Pro" data-dimension25="$429.99" href="https://www.amazon.com.au/Mercury-V75-Pro-Competitive-Compatible/dp/B0G1MS9B7M/" 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="D42Qmq2i8vVnXkQEEf2QZi" name="gravastar-mercury-v75-pro-hall-effect-ma-0911b538-6cef-4bed-8085-3894d308b115.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/D42Qmq2i8vVnXkQEEf2QZi.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If dad's a fan of what looks like a concoction of graffiti and cyberpunk, then he'll be happy with what the GravaStar Mercury V75 Pro puts on the table. With high customisability and magnetic switches, this is a powerful gaming keyboard. Do note, though, that this one is wired-only, the keycaps have a paint-like texture, and it comes at a high price at full RRP. <a class="view-deal button" href="https://www.amazon.com.au/Mercury-V75-Pro-Competitive-Compatible/dp/B0G1MS9B7M/" target="_blank" rel="nofollow" data-dimension112="08f20d2e-9c3a-11f1-bdae-57ad213bfe50" data-action="Deal Block" data-label="Mercury V75 Pro" data-dimension48="Mercury V75 Pro" data-dimension25="$429.99">View Deal</a></p></div><div class="product"><a data-dimension112="08f20d9c-9c3a-11f1-be72-c98f3d309094" data-action="Deal Block" data-label="Nintendo Switch 2 Charging Case" data-dimension48="Nintendo Switch 2 Charging Case" data-dimension25="$149" href="https://www.amazon.com.au/Belkin-Nintendo-Charging-10000mAh-Charcoal/dp/B0GN7ZQRX9" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:400px;"><p class="vanilla-image-block" style="padding-top:125.00%;"><img id="yUyunv86ArynbBPkpn7BdA" name="belkin-nintendo-switch-2-charging-case-p-d65c8621-95b4-4879-95aa-058b6f19dc21.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yUyunv86ArynbBPkpn7BdA.jpg" mos="" align="middle" fullscreen="" width="400" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com.au/Belkin-Nintendo-Charging-10000mAh-Charcoal/dp/B0GN7ZQRX9" target="_blank" rel="nofollow" data-dimension112="08f20d9c-9c3a-11f1-be72-c98f3d309094" data-action="Deal Block" data-label="Nintendo Switch 2 Charging Case" data-dimension48="Nintendo Switch 2 Charging Case" data-dimension25="$149">Nintendo Switch 2 Charging Case: $149</a></strong><br>Let dad take his Switch 2 on-the-go with this portable charging case from Belkin. With enough juice for 1.5 recharges, dad can easily extend his playtime no matter where he is. <a class="view-deal button" href="https://www.amazon.com.au/Belkin-Nintendo-Charging-10000mAh-Charcoal/dp/B0GN7ZQRX9" target="_blank" rel="nofollow" data-dimension112="08f20d9c-9c3a-11f1-be72-c98f3d309094" data-action="Deal Block" data-label="Nintendo Switch 2 Charging Case" data-dimension48="Nintendo Switch 2 Charging Case" data-dimension25="$149">View Deal</a></p></div><div class="product"><a data-dimension112="08f20e00-9c3a-11f1-835e-2b1ea4e9956c" data-action="Deal Block" data-label="Gaming Grip for Nintendo Switch 2" data-dimension48="Gaming Grip for Nintendo Switch 2" data-dimension25="$49.95" href="https://www.amazon.com.au/Belkin-Gaming-Nintendo-Kickstand-Lavander/dp/B0GYD85GNR" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:400px;"><p class="vanilla-image-block" style="padding-top:125.00%;"><img id="wwAEas3BooiBjEv8ngQUpA" name="belkin-gaming-grip-for-nintendo-switch-2-ce5210f5-8899-4dad-b566-739ce7776469.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/wwAEas3BooiBjEv8ngQUpA.jpg" mos="" align="middle" fullscreen="" width="400" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com.au/Belkin-Gaming-Nintendo-Kickstand-Lavander/dp/B0GYD85GNR" target="_blank" rel="nofollow" data-dimension112="08f20e00-9c3a-11f1-835e-2b1ea4e9956c" data-action="Deal Block" data-label="Gaming Grip for Nintendo Switch 2" data-dimension48="Gaming Grip for Nintendo Switch 2" data-dimension25="$49.95">Gaming Grip for Nintendo Switch 2: $49.95</a></strong><br>Much like the case above, Belkin's gaming grip is perfect for dads on the move. With a built-in kickstand, comfortable grip handles, and slim fit, handheld gaming has never been this easy. <a class="view-deal button" href="https://www.amazon.com.au/Belkin-Gaming-Nintendo-Kickstand-Lavander/dp/B0GYD85GNR" target="_blank" rel="nofollow" data-dimension112="08f20e00-9c3a-11f1-835e-2b1ea4e9956c" data-action="Deal Block" data-label="Gaming Grip for Nintendo Switch 2" data-dimension48="Gaming Grip for Nintendo Switch 2" data-dimension25="$49.95">View Deal</a></p></div><div class="product"><a data-dimension112="79db7098-9c3f-11f1-a814-d36acef55be3" data-action="Deal Block" data-label="G7 Pro Wireless Controller" data-dimension48="G7 Pro Wireless Controller" data-dimension25="$159" href="https://www.amazon.com.au/GameSir-Pro-Controller-Wireless-Triggers/dp/B0FD41XC3P/" 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="n7XshsTYrVrDYeB54AU8hn" name="gamesir-g7-pro-wired-controller-for-xbox-b7e44032-478b-4029-bd7a-7848ccd189c3.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/n7XshsTYrVrDYeB54AU8hn.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com.au/GameSir-Pro-Controller-Wireless-Triggers/dp/B0FD41XC3P/" target="_blank" rel="nofollow" data-dimension112="79db7098-9c3f-11f1-a814-d36acef55be3" data-action="Deal Block" data-label="G7 Pro Wireless Controller" data-dimension48="G7 Pro Wireless Controller" data-dimension25="$159">G7 Pro Wireless Controller: $159</a></strong><br>Portable controllers are a gamer's best friend, and this one from GameSir is no exception. Compatible with Xbox, PlayStation and PC, this G7 Pro is comfortable to hold, convenient, and offers precise control. <a class="view-deal button" href="https://www.amazon.com.au/GameSir-Pro-Controller-Wireless-Triggers/dp/B0FD41XC3P/" target="_blank" rel="nofollow" data-dimension112="79db7098-9c3f-11f1-a814-d36acef55be3" data-action="Deal Block" data-label="G7 Pro Wireless Controller" data-dimension48="G7 Pro Wireless Controller" data-dimension25="$159">View Deal</a></p></div><div class="product"><a data-dimension112="79db711a-9c3f-11f1-b2d1-0384625a559c" data-action="Deal Block" data-label="Deathadder Essential Gaming Mouse" data-dimension48="Deathadder Essential Gaming Mouse" data-dimension25="$29.56" href="https://www.amazon.com.au/Razer-DeathAdder-Essential-Ergonomic-Gaming/dp/B092R5MCB3/?th=1" 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="ANoYRWen4gzw8MrFBt5Xfn" name="razer-deathadder-essential-gaming-mouse--66af781e-a0b1-444e-a5f8-8fed2fb6d505.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ANoYRWen4gzw8MrFBt5Xfn.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com.au/Razer-DeathAdder-Essential-Ergonomic-Gaming/dp/B092R5MCB3/?th=1" target="_blank" rel="nofollow" data-dimension112="79db711a-9c3f-11f1-b2d1-0384625a559c" data-action="Deal Block" data-label="Deathadder Essential Gaming Mouse" data-dimension48="Deathadder Essential Gaming Mouse" data-dimension25="$29.56">Deathadder Essential Gaming Mouse: was $34.99 now $29.56</a></strong><br>Razer's bestselling gaming mouse is hard to beat, and it should be at the top of the shopping list for any game-enthused dad. With a rigid scroll wheel, reprogrammable switches and a comfy grip, dad will be clicking away in no time. <a class="view-deal button" href="https://www.amazon.com.au/Razer-DeathAdder-Essential-Ergonomic-Gaming/dp/B092R5MCB3/?th=1" target="_blank" rel="nofollow" data-dimension112="79db711a-9c3f-11f1-b2d1-0384625a559c" data-action="Deal Block" data-label="Deathadder Essential Gaming Mouse" data-dimension48="Deathadder Essential Gaming Mouse" data-dimension25="$29.56">View Deal</a></p></div><div class="product"><a data-dimension112="08f20eb4-9c3a-11f1-b719-e37f2c2a3166" data-action="Deal Block" data-label="Viper V3 Pro mouse" data-dimension48="Viper V3 Pro mouse" data-dimension25="$226.95" href="https://www.razer.com/au-en/gaming-mice/razer-viper-v3-pro/RZ01-05120100-R3A1" 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="wfj8YnoZZVRhNn6d83Unxn" name="razer-viper-pro-v3-mouse-deal.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/wfj8YnoZZVRhNn6d83Unxn.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.razer.com/au-en/gaming-mice/razer-viper-v3-pro/RZ01-05120100-R3A1" target="_blank" rel="nofollow" data-dimension112="08f20eb4-9c3a-11f1-b719-e37f2c2a3166" data-action="Deal Block" data-label="Viper V3 Pro mouse" data-dimension48="Viper V3 Pro mouse" data-dimension25="$226.95">Viper V3 Pro mouse: was $279 now $226.95</a></strong><br>Razer's Viper V3 Pro is nothing short of an exceptional gaming mouse, especially if dad is an amateur esports gamer. This mouse is lightweight, offers superb tracking and a nice symmetrical design. Available in a range of fun colours and designs, this wireless pointer would make an excellent addition to dad's PC setup. <a class="view-deal button" href="https://www.razer.com/au-en/gaming-mice/razer-viper-v3-pro/RZ01-05120100-R3A1" target="_blank" rel="nofollow" data-dimension112="08f20eb4-9c3a-11f1-b719-e37f2c2a3166" data-action="Deal Block" data-label="Viper V3 Pro mouse" data-dimension48="Viper V3 Pro mouse" data-dimension25="$226.95">View Deal</a></p></div><div class="product"><a data-dimension112="08f20f0e-9c3a-11f1-bebd-e90e1ac3e91c" data-action="Deal Block" data-label="HDMI Sync Box With TV Backlight" data-dimension48="HDMI Sync Box With TV Backlight" data-dimension25="$189" href="https://www.thegoodguys.com.au/wiz-hdmi-sync-box-with-tv-backlight-for-55-inches-65-inches-tvs-wizsync5565" 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:82.40%;"><img id="XiCWdv7g9wGewQJMDTJsiE" name="wiz-hdmi-sync-box-with-tv-backlight-for--cf269982-b51b-4fba-b8e0-57ecaef66e7f.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/XiCWdv7g9wGewQJMDTJsiE.png" mos="" align="middle" fullscreen="" width="1500" height="1236" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.thegoodguys.com.au/wiz-hdmi-sync-box-with-tv-backlight-for-55-inches-65-inches-tvs-wizsync5565" target="_blank" rel="nofollow" data-dimension112="08f20f0e-9c3a-11f1-bebd-e90e1ac3e91c" data-action="Deal Block" data-label="HDMI Sync Box With TV Backlight" data-dimension48="HDMI Sync Box With TV Backlight" data-dimension25="$189">HDMI Sync Box With TV Backlight: $189</a></strong><br>Create an immersive gaming (or movie-watching) experience for dad with this Wiz Sync Box. Once you've plugged it in and set it up using the app, it will illuminate the room based on whatever is playing on the TV. <a class="view-deal button" href="https://www.thegoodguys.com.au/wiz-hdmi-sync-box-with-tv-backlight-for-55-inches-65-inches-tvs-wizsync5565" target="_blank" rel="nofollow" data-dimension112="08f20f0e-9c3a-11f1-bebd-e90e1ac3e91c" data-action="Deal Block" data-label="HDMI Sync Box With TV Backlight" data-dimension48="HDMI Sync Box With TV Backlight" data-dimension25="$189">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/wellness/forget-socks-shop-these-30-expert-picked-skincare-and-haircare-buys-for-dad-this-fathers-day">Forget socks — shop these 30 expert-picked skincare and haircare buys for dad this Father's Day</a></li><li><a href="https://www.tomsguide.com/tech/forget-a-new-tie-ive-found-15-of-the-best-fathers-day-tech-gifts-that-will-make-you-his-favourite-child">Forget a new tie — I've found 15 of the best Father's Day tech gifts that will make you his favourite child</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/gamer-dad-ive-found-11-winning-fathers-day-gaming-ideas-to-level-up-your-gifting</link>
                                                                            <description>
                            <![CDATA[ Shopping for your gamer-obsessed dad? Here are 10 console and accessory ideas worth considering. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">xYaRhmGssFbRfeJRTfqtb3</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/LMrD85Ykw6aoKDkaWAF3HP-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 20 Aug 2026 02:46:18 +0000</pubDate>                                                                                                                                <updated>Wed, 26 Aug 2026 06:32:05 +0000</updated>
                                                                                                                                            <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></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/LMrD85Ykw6aoKDkaWAF3HP-1280-80.jpg">
                                                            <media:credit><![CDATA[Future / Edited with Gemini]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Products on gradient background]]></media:description>                                                            <media:text><![CDATA[Products on gradient background]]></media:text>
                                <media:title type="plain"><![CDATA[Products on gradient background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/LMrD85Ykw6aoKDkaWAF3HP-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>It's almost <a href="https://www.tomsguide.com/sales-events/fathers-day-gift-ideas-au">Father's Day 2026</a>, with the big day arriving on Sunday, September 6 in Australia.</p><p>If you've got a gamer-obsessed father (or father figure), it's an ideal time to help upgrade any ageing consoles (if you have the means) or add some fun accessories to dad's existing set-up. Whether he's a staunch keyboard warrior or has been obsessed with his PlayStation or Xbox his entire life, I've gathered 10 of the best gaming-specific deals for Father's Day below. </p><p>It is worth noting, though, I haven't included specific games in the list, largely because all gamer dads are different — and their playing preferences reflect that. Instead, I've selected some fun consoles, peripherals and accessories to make every dad's gaming experience better. </p><p>All of these items come from top-rated retailers, like Amazon, JB Hi-Fi and The Good Guys, with each claiming fast delivery in time for the big day. It's also <a href="https://www.amazon.com.au/b/?_encoding=UTF8&node=221080127051&pd_rd_w=5mj5c&content-id=amzn1.sym.3d08badd-4ec6-4c8d-8b19-6f0b265690a1&pf_rd_p=3d08badd-4ec6-4c8d-8b19-6f0b265690a1&pf_rd_r=J6JXD6R3F0RKYRZR2SDE&pd_rd_wg=TNehv&pd_rd_r=4bd5449a-5ad9-483f-b6a2-d6018ece60f0&ref_=pd_hp_d_r_atf_unk" target="_blank">Gaming Week on Amazon</a>, so now is the best time to shop and save big on the latest (and greatest) gaming consoles, PC peripherals and accessories. </p><p>I'll stop with the waffling now — here are the best Father's Day gaming gifts I've found this year. </p><h3 class="article-body__section" id="section-11-best-father-s-day-gaming-deals"><span>11 best Father's Day gaming deals</span></h3><div class="product"><a data-dimension112="08f20b6c-9c3a-11f1-94d5-6344a3195dbd" data-action="Deal Block" data-label="Switch 2 Console" data-dimension48="Switch 2 Console" data-dimension25="$699" href="https://www.jbhifi.com.au/products/nintendo-switch-2-console" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="63dGPyBNH73xm2BYnLsoJP" name="Nintendo Switch 2 deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/63dGPyBNH73xm2BYnLsoJP.jpg" mos="" align="middle" fullscreen="" width="2000" height="2000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.jbhifi.com.au/products/nintendo-switch-2-console" target="_blank" rel="nofollow" data-dimension112="08f20b6c-9c3a-11f1-94d5-6344a3195dbd" data-action="Deal Block" data-label="Switch 2 Console" data-dimension48="Switch 2 Console" data-dimension25="$699">Switch 2 Console: $699</a></strong><br>Nintendo Switch 2 takes what worked about its best-selling predecessor and makes impactful upgrades across the board. From the excellent, noticeably larger, 7.9-inch display to the more powerful internal specs, the Switch 2 is a full leap forward and the best hybrid console you can buy. <a class="view-deal button" href="https://www.jbhifi.com.au/products/nintendo-switch-2-console" target="_blank" rel="nofollow" data-dimension112="08f20b6c-9c3a-11f1-94d5-6344a3195dbd" data-action="Deal Block" data-label="Switch 2 Console" data-dimension48="Switch 2 Console" data-dimension25="$699">View Deal</a></p></div><div class="product"><a data-dimension112="08f20bee-9c3a-11f1-b168-1dc7d62f6b88" data-action="Deal Block" data-label="PlayStation 5 Digital Slim Console (825GB)" data-dimension48="PlayStation 5 Digital Slim Console (825GB)" data-dimension25="$919" href="https://www.jbhifi.com.au/products/ps5-playstation-5-slim-digital-console-825gb" 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="PFZzmTD26fsVB8AzmQ9JXm" name="ps5-slim-deal.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/PFZzmTD26fsVB8AzmQ9JXm.png" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.jbhifi.com.au/products/ps5-playstation-5-slim-digital-console-825gb" target="_blank" rel="nofollow" data-dimension112="08f20bee-9c3a-11f1-b168-1dc7d62f6b88" data-action="Deal Block" data-label="PlayStation 5 Digital Slim Console (825GB)" data-dimension48="PlayStation 5 Digital Slim Console (825GB)" data-dimension25="$919">PlayStation 5 Digital Slim Console (825GB): $919</a></strong><br>Got a gamer dad who needs an upgrade? The PS5 console unleashes new gaming possibilities with ultrafast loading thanks to a high-speed SSD, deeper immersion support for haptic feedback, adaptive triggers and 3D audio. Not only that, the latest console is home to a suite of great games and exclusives that'll provide entertainment for hours on end.<a class="view-deal button" href="https://www.jbhifi.com.au/products/ps5-playstation-5-slim-digital-console-825gb" target="_blank" rel="nofollow" data-dimension112="08f20bee-9c3a-11f1-b168-1dc7d62f6b88" data-action="Deal Block" data-label="PlayStation 5 Digital Slim Console (825GB)" data-dimension48="PlayStation 5 Digital Slim Console (825GB)" data-dimension25="$919">View Deal</a></p></div><div class="product"><a data-dimension112="08f20c52-9c3a-11f1-86a3-95c3c96ca8ec" data-action="Deal Block" data-label="G29 Driving Force Racing Wheel and Floor Pedals" data-dimension48="G29 Driving Force Racing Wheel and Floor Pedals" data-dimension25="$307.5" href="https://www.amazon.com.au/Logitech-Driving-Force-Feedback-Racing/dp/B076P3QK6K" 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="BZ2PGFNptgo9YMzJSKuNmA" name="logitech-g29-driving-force-racing-wheel--b019993a-fc9a-4479-b76a-5525c2af290e.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/BZ2PGFNptgo9YMzJSKuNmA.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com.au/Logitech-Driving-Force-Feedback-Racing/dp/B076P3QK6K" target="_blank" rel="nofollow" data-dimension112="08f20c52-9c3a-11f1-86a3-95c3c96ca8ec" data-action="Deal Block" data-label="G29 Driving Force Racing Wheel and Floor Pedals" data-dimension48="G29 Driving Force Racing Wheel and Floor Pedals" data-dimension25="$307.5">G29 Driving Force Racing Wheel and Floor Pedals: was $549.95 now $307.5</a></strong><br>Get dad's heart racing with this Driving Force wheel from Logitech. Compatible with PlayStation 4 and 5 consoles and PC gaming, this wheel will take dad's sim racing to the next level, thanks to its comfortable pedals and precision force feedback wheel action. <a class="view-deal button" href="https://www.amazon.com.au/Logitech-Driving-Force-Feedback-Racing/dp/B076P3QK6K" target="_blank" rel="nofollow" data-dimension112="08f20c52-9c3a-11f1-86a3-95c3c96ca8ec" data-action="Deal Block" data-label="G29 Driving Force Racing Wheel and Floor Pedals" data-dimension48="G29 Driving Force Racing Wheel and Floor Pedals" data-dimension25="$307.5">View Deal</a></p></div><div class="product"><a data-dimension112="08f20cb6-9c3a-11f1-a07c-ef7b42d9ce99" data-action="Deal Block" data-label="Eero 7 Dual-Band Mesh Wi-Fi 7 Router" data-dimension48="Eero 7 Dual-Band Mesh Wi-Fi 7 Router" data-dimension25="$299.99" href="https://www.amazon.com.au/Introducing-Amazon-eero-dual-band-router/dp/B0DB6GQFRV" 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="JCkfumrwwbtMEmC8WQpTfA" name="amazon-eero-7-dualband-mesh-wifi-7-route-d45138b4-5445-4850-a2f8-75b64ecd44e6.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/JCkfumrwwbtMEmC8WQpTfA.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com.au/Introducing-Amazon-eero-dual-band-router/dp/B0DB6GQFRV" target="_blank" rel="nofollow" data-dimension112="08f20cb6-9c3a-11f1-a07c-ef7b42d9ce99" data-action="Deal Block" data-label="Eero 7 Dual-Band Mesh Wi-Fi 7 Router" data-dimension48="Eero 7 Dual-Band Mesh Wi-Fi 7 Router" data-dimension25="$299.99">Eero 7 Dual-Band Mesh Wi-Fi 7 Router: $299.99</a></strong><br>If dad already has his ultimate gaming set up sorted, it might be worth checking his Wi-Fi router. This eero 7 is compatible with 2Gbps internet plans and will easily support 120+ connected devices, so no matter what game he's downloading, the whole family shouldn't have many (if any) interruptions. <a class="view-deal button" href="https://www.amazon.com.au/Introducing-Amazon-eero-dual-band-router/dp/B0DB6GQFRV" target="_blank" rel="nofollow" data-dimension112="08f20cb6-9c3a-11f1-a07c-ef7b42d9ce99" data-action="Deal Block" data-label="Eero 7 Dual-Band Mesh Wi-Fi 7 Router" data-dimension48="Eero 7 Dual-Band Mesh Wi-Fi 7 Router" data-dimension25="$299.99">View Deal</a></p></div><div class="product"><a data-dimension112="08f20d2e-9c3a-11f1-bdae-57ad213bfe50" data-action="Deal Block" data-label="Mercury V75 Pro" data-dimension48="Mercury V75 Pro" data-dimension25="$429.99" href="https://www.amazon.com.au/Mercury-V75-Pro-Competitive-Compatible/dp/B0G1MS9B7M/" 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="D42Qmq2i8vVnXkQEEf2QZi" name="gravastar-mercury-v75-pro-hall-effect-ma-0911b538-6cef-4bed-8085-3894d308b115.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/D42Qmq2i8vVnXkQEEf2QZi.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If dad's a fan of what looks like a concoction of graffiti and cyberpunk, then he'll be happy with what the GravaStar Mercury V75 Pro puts on the table. With high customisability and magnetic switches, this is a powerful gaming keyboard. Do note, though, that this one is wired-only, the keycaps have a paint-like texture, and it comes at a high price at full RRP. <a class="view-deal button" href="https://www.amazon.com.au/Mercury-V75-Pro-Competitive-Compatible/dp/B0G1MS9B7M/" target="_blank" rel="nofollow" data-dimension112="08f20d2e-9c3a-11f1-bdae-57ad213bfe50" data-action="Deal Block" data-label="Mercury V75 Pro" data-dimension48="Mercury V75 Pro" data-dimension25="$429.99">View Deal</a></p></div><div class="product"><a data-dimension112="08f20d9c-9c3a-11f1-be72-c98f3d309094" data-action="Deal Block" data-label="Nintendo Switch 2 Charging Case" data-dimension48="Nintendo Switch 2 Charging Case" data-dimension25="$149" href="https://www.amazon.com.au/Belkin-Nintendo-Charging-10000mAh-Charcoal/dp/B0GN7ZQRX9" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:400px;"><p class="vanilla-image-block" style="padding-top:125.00%;"><img id="yUyunv86ArynbBPkpn7BdA" name="belkin-nintendo-switch-2-charging-case-p-d65c8621-95b4-4879-95aa-058b6f19dc21.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yUyunv86ArynbBPkpn7BdA.jpg" mos="" align="middle" fullscreen="" width="400" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com.au/Belkin-Nintendo-Charging-10000mAh-Charcoal/dp/B0GN7ZQRX9" target="_blank" rel="nofollow" data-dimension112="08f20d9c-9c3a-11f1-be72-c98f3d309094" data-action="Deal Block" data-label="Nintendo Switch 2 Charging Case" data-dimension48="Nintendo Switch 2 Charging Case" data-dimension25="$149">Nintendo Switch 2 Charging Case: $149</a></strong><br>Let dad take his Switch 2 on-the-go with this portable charging case from Belkin. With enough juice for 1.5 recharges, dad can easily extend his playtime no matter where he is. <a class="view-deal button" href="https://www.amazon.com.au/Belkin-Nintendo-Charging-10000mAh-Charcoal/dp/B0GN7ZQRX9" target="_blank" rel="nofollow" data-dimension112="08f20d9c-9c3a-11f1-be72-c98f3d309094" data-action="Deal Block" data-label="Nintendo Switch 2 Charging Case" data-dimension48="Nintendo Switch 2 Charging Case" data-dimension25="$149">View Deal</a></p></div><div class="product"><a data-dimension112="08f20e00-9c3a-11f1-835e-2b1ea4e9956c" data-action="Deal Block" data-label="Gaming Grip for Nintendo Switch 2" data-dimension48="Gaming Grip for Nintendo Switch 2" data-dimension25="$49.95" href="https://www.amazon.com.au/Belkin-Gaming-Nintendo-Kickstand-Lavander/dp/B0GYD85GNR" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:400px;"><p class="vanilla-image-block" style="padding-top:125.00%;"><img id="wwAEas3BooiBjEv8ngQUpA" name="belkin-gaming-grip-for-nintendo-switch-2-ce5210f5-8899-4dad-b566-739ce7776469.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/wwAEas3BooiBjEv8ngQUpA.jpg" mos="" align="middle" fullscreen="" width="400" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com.au/Belkin-Gaming-Nintendo-Kickstand-Lavander/dp/B0GYD85GNR" target="_blank" rel="nofollow" data-dimension112="08f20e00-9c3a-11f1-835e-2b1ea4e9956c" data-action="Deal Block" data-label="Gaming Grip for Nintendo Switch 2" data-dimension48="Gaming Grip for Nintendo Switch 2" data-dimension25="$49.95">Gaming Grip for Nintendo Switch 2: $49.95</a></strong><br>Much like the case above, Belkin's gaming grip is perfect for dads on the move. With a built-in kickstand, comfortable grip handles, and slim fit, handheld gaming has never been this easy. <a class="view-deal button" href="https://www.amazon.com.au/Belkin-Gaming-Nintendo-Kickstand-Lavander/dp/B0GYD85GNR" target="_blank" rel="nofollow" data-dimension112="08f20e00-9c3a-11f1-835e-2b1ea4e9956c" data-action="Deal Block" data-label="Gaming Grip for Nintendo Switch 2" data-dimension48="Gaming Grip for Nintendo Switch 2" data-dimension25="$49.95">View Deal</a></p></div><div class="product"><a data-dimension112="79db7098-9c3f-11f1-a814-d36acef55be3" data-action="Deal Block" data-label="G7 Pro Wireless Controller" data-dimension48="G7 Pro Wireless Controller" data-dimension25="$159" href="https://www.amazon.com.au/GameSir-Pro-Controller-Wireless-Triggers/dp/B0FD41XC3P/" 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="n7XshsTYrVrDYeB54AU8hn" name="gamesir-g7-pro-wired-controller-for-xbox-b7e44032-478b-4029-bd7a-7848ccd189c3.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/n7XshsTYrVrDYeB54AU8hn.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com.au/GameSir-Pro-Controller-Wireless-Triggers/dp/B0FD41XC3P/" target="_blank" rel="nofollow" data-dimension112="79db7098-9c3f-11f1-a814-d36acef55be3" data-action="Deal Block" data-label="G7 Pro Wireless Controller" data-dimension48="G7 Pro Wireless Controller" data-dimension25="$159">G7 Pro Wireless Controller: $159</a></strong><br>Portable controllers are a gamer's best friend, and this one from GameSir is no exception. Compatible with Xbox, PlayStation and PC, this G7 Pro is comfortable to hold, convenient, and offers precise control. <a class="view-deal button" href="https://www.amazon.com.au/GameSir-Pro-Controller-Wireless-Triggers/dp/B0FD41XC3P/" target="_blank" rel="nofollow" data-dimension112="79db7098-9c3f-11f1-a814-d36acef55be3" data-action="Deal Block" data-label="G7 Pro Wireless Controller" data-dimension48="G7 Pro Wireless Controller" data-dimension25="$159">View Deal</a></p></div><div class="product"><a data-dimension112="79db711a-9c3f-11f1-b2d1-0384625a559c" data-action="Deal Block" data-label="Deathadder Essential Gaming Mouse" data-dimension48="Deathadder Essential Gaming Mouse" data-dimension25="$29.56" href="https://www.amazon.com.au/Razer-DeathAdder-Essential-Ergonomic-Gaming/dp/B092R5MCB3/?th=1" 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="ANoYRWen4gzw8MrFBt5Xfn" name="razer-deathadder-essential-gaming-mouse--66af781e-a0b1-444e-a5f8-8fed2fb6d505.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ANoYRWen4gzw8MrFBt5Xfn.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com.au/Razer-DeathAdder-Essential-Ergonomic-Gaming/dp/B092R5MCB3/?th=1" target="_blank" rel="nofollow" data-dimension112="79db711a-9c3f-11f1-b2d1-0384625a559c" data-action="Deal Block" data-label="Deathadder Essential Gaming Mouse" data-dimension48="Deathadder Essential Gaming Mouse" data-dimension25="$29.56">Deathadder Essential Gaming Mouse: was $34.99 now $29.56</a></strong><br>Razer's bestselling gaming mouse is hard to beat, and it should be at the top of the shopping list for any game-enthused dad. With a rigid scroll wheel, reprogrammable switches and a comfy grip, dad will be clicking away in no time. <a class="view-deal button" href="https://www.amazon.com.au/Razer-DeathAdder-Essential-Ergonomic-Gaming/dp/B092R5MCB3/?th=1" target="_blank" rel="nofollow" data-dimension112="79db711a-9c3f-11f1-b2d1-0384625a559c" data-action="Deal Block" data-label="Deathadder Essential Gaming Mouse" data-dimension48="Deathadder Essential Gaming Mouse" data-dimension25="$29.56">View Deal</a></p></div><div class="product"><a data-dimension112="08f20eb4-9c3a-11f1-b719-e37f2c2a3166" data-action="Deal Block" data-label="Viper V3 Pro mouse" data-dimension48="Viper V3 Pro mouse" data-dimension25="$226.95" href="https://www.razer.com/au-en/gaming-mice/razer-viper-v3-pro/RZ01-05120100-R3A1" 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="wfj8YnoZZVRhNn6d83Unxn" name="razer-viper-pro-v3-mouse-deal.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/wfj8YnoZZVRhNn6d83Unxn.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.razer.com/au-en/gaming-mice/razer-viper-v3-pro/RZ01-05120100-R3A1" target="_blank" rel="nofollow" data-dimension112="08f20eb4-9c3a-11f1-b719-e37f2c2a3166" data-action="Deal Block" data-label="Viper V3 Pro mouse" data-dimension48="Viper V3 Pro mouse" data-dimension25="$226.95">Viper V3 Pro mouse: was $279 now $226.95</a></strong><br>Razer's Viper V3 Pro is nothing short of an exceptional gaming mouse, especially if dad is an amateur esports gamer. This mouse is lightweight, offers superb tracking and a nice symmetrical design. Available in a range of fun colours and designs, this wireless pointer would make an excellent addition to dad's PC setup. <a class="view-deal button" href="https://www.razer.com/au-en/gaming-mice/razer-viper-v3-pro/RZ01-05120100-R3A1" target="_blank" rel="nofollow" data-dimension112="08f20eb4-9c3a-11f1-b719-e37f2c2a3166" data-action="Deal Block" data-label="Viper V3 Pro mouse" data-dimension48="Viper V3 Pro mouse" data-dimension25="$226.95">View Deal</a></p></div><div class="product"><a data-dimension112="08f20f0e-9c3a-11f1-bebd-e90e1ac3e91c" data-action="Deal Block" data-label="HDMI Sync Box With TV Backlight" data-dimension48="HDMI Sync Box With TV Backlight" data-dimension25="$189" href="https://www.thegoodguys.com.au/wiz-hdmi-sync-box-with-tv-backlight-for-55-inches-65-inches-tvs-wizsync5565" 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:82.40%;"><img id="XiCWdv7g9wGewQJMDTJsiE" name="wiz-hdmi-sync-box-with-tv-backlight-for--cf269982-b51b-4fba-b8e0-57ecaef66e7f.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/XiCWdv7g9wGewQJMDTJsiE.png" mos="" align="middle" fullscreen="" width="1500" height="1236" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.thegoodguys.com.au/wiz-hdmi-sync-box-with-tv-backlight-for-55-inches-65-inches-tvs-wizsync5565" target="_blank" rel="nofollow" data-dimension112="08f20f0e-9c3a-11f1-bebd-e90e1ac3e91c" data-action="Deal Block" data-label="HDMI Sync Box With TV Backlight" data-dimension48="HDMI Sync Box With TV Backlight" data-dimension25="$189">HDMI Sync Box With TV Backlight: $189</a></strong><br>Create an immersive gaming (or movie-watching) experience for dad with this Wiz Sync Box. Once you've plugged it in and set it up using the app, it will illuminate the room based on whatever is playing on the TV. <a class="view-deal button" href="https://www.thegoodguys.com.au/wiz-hdmi-sync-box-with-tv-backlight-for-55-inches-65-inches-tvs-wizsync5565" target="_blank" rel="nofollow" data-dimension112="08f20f0e-9c3a-11f1-bebd-e90e1ac3e91c" data-action="Deal Block" data-label="HDMI Sync Box With TV Backlight" data-dimension48="HDMI Sync Box With TV Backlight" data-dimension25="$189">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/wellness/forget-socks-shop-these-30-expert-picked-skincare-and-haircare-buys-for-dad-this-fathers-day">Forget socks — shop these 30 expert-picked skincare and haircare buys for dad this Father's Day</a></li><li><a href="https://www.tomsguide.com/tech/forget-a-new-tie-ive-found-15-of-the-best-fathers-day-tech-gifts-that-will-make-you-his-favourite-child">Forget a new tie — I've found 15 of the best Father's Day tech gifts that will make you his favourite child</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I just tested audiophile brand FiiO’s first-ever gaming headset — and for just $69, it ticks almost all the boxes ]]></title>
                                                                                                <dc:content><![CDATA[ <p>It was only a matter of time before FiiO, known for making some of the <a href="https://www.tomsguide.com/us/best-headphones,review-1988.html">best headphones</a> for audiophiles on a budget, entered the gaming headset market — and the FiiO FG3 is almost a triumph. Priced at just $69, the FG3 is mighty cheap. It’s also comfortable, and its wired-only plug-and-play design makes it compatible with a range of consoles and devices. You also get extensive customization and finetuned EQ presets, too.</p><p>But there’s some room for improvement. Though it boasts good mic performance and it’s great for listening to music, the FG3’s default sound profile sounds muddy and needs tweaking. Build quality isn’t the best either, and the wired-only design might not be for everyone.</p><p>Is it still the <a href="https://www.tomsguide.com/best-picks/best-cheap-gaming-headsets">best cheap gaming headset </a>for you? Read my full FiiO FG3 review to find out.</p><h2 class="article-body__section" id="section-fiio-fg3-review-specs"><span>FiiO FG3 review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/FiiO-Headphones-Detachable-Microphone-Compatible/dp/B0H7BQ9RDR/" target="_blank" rel="nofollow">$69</a> / <a href="https://www.fiio.com/fg3" target="_blank" rel="nofollow">£69</a></p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Black</p></td></tr><tr><td class="firstcol " ><p><strong>Platforms</strong></p></td><td  ><p>PS5, PS4, Xbox Series X|S, Nintendo Switch 2, Nintendo Switch, PC, macOS, iOS, Android</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>USB-C / USB-A wired</p></td></tr><tr><td class="firstcol " ><p><strong>Frequency response</strong></p></td><td  ><p>10Hz-40KHz</p></td></tr><tr><td class="firstcol " ><p><strong>Drivers</strong></p></td><td  ><p>Coaxial dual-driver (50mm dynamic and 16mm dynamic)</p></td></tr><tr><td class="firstcol " ><p><strong>Multipoint connectivity</strong></p></td><td  ><p>No</p></td></tr><tr><td class="firstcol " ><p><strong>Paired devices max</strong></p></td><td  ><p>1</p></td></tr><tr><td class="firstcol " ><p><strong>Microphone</strong></p></td><td  ><p>Detachable boom mic</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>11.1oz</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-fiio-fg3-review-cheat-sheet"><span>FiiO FG3 review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>FiiO’s first-ever gaming headset with a wired-only design</li><li><strong>Who is it for?</strong> Gamers on a tight budget</li><li><strong>How much does it cost?</strong> The FiiO FG3 is available for <a href="https://www.amazon.com/FiiO-Headphones-Detachable-Microphone-Compatible/dp/B0H7BQ9RDR/" target="_blank" rel="nofollow">$69</a> / <a href="https://www.fiio.com/fg3" target="_blank" rel="nofollow">£69</a></li><li><strong>What do we like? </strong>The comfortable fit, EQ presets that work well, useful DAC with in-line controls, mic performance, and more</li><li><strong>What don’t we like?</strong> The default sound profile (it’s muddy) and the subpar build quality</li></ul><h2 class="article-body__section" id="section-fiio-fg3-review-the-ups"><span>FiiO FG3 review: The ups</span></h2><p>From its comfortable design and useful DAC with onboard controls, to the immersive in-game audio and Hi-Res Audio certification, the FiiO FG3 gives you almost everything you need.</p><h2 id="very-comfortable">Very comfortable</h2><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="bBq3KkWQEbcyyAyRskj5vL" name="FiiO_FG3" alt="A black FiiO FG3 gaming headset" src="https://cdn.mos.cms.futurecdn.net/bBq3KkWQEbcyyAyRskj5vL.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>FiiO has nailed it in the comfort department, as the FG3 is extremely comfortable for all-day wear. At just 11.1oz, the FG3 is lighter than the likes of the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/cherry-xtrfy-h3-gaming-headset-review">Cherry XTRFY H3</a> ($99, 11.46oz). While it’s slightly heavier than the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/powera-lucidsound-ls500-review">PowerA LucidSound LS500</a> ($69, 9.34oz) and the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/logitech-g325-lightspeed-review">Logitech G325 Lightspeed</a> ($79, 7.47oz), the FG3 doesn’t feel unwieldy. It hits the sweet spot.</p><p>Aiding the FG3’s comfort factor are its woven mesh fabric ear cushions which are highly breathable and sweat-resistant. Having worn the headset for seven consecutive hours, I can confirm that I haven’t felt any discomfort or pooling of sweat, and my ears haven’t overheated either. The earpads are swappable, too, in case they get damaged. I also love how spacious the earcups are, and the headset features spot-on clamp force without making it feel like there’s pressure on your temples or head.</p><p>Similar to the<a href="https://www.tomsguide.com/audio/headphones/fiio-jt7-review"> FiiO JT7</a> ($119), the FG3’s stainless steel headband features velvet-like padded cloth that helps relieve pressure you might otherwise feel on the top of your head.</p><h2 id="useful-dac-with-onboard-controls">Useful DAC with onboard controls</h2><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="A7qo9Nz2B8zrWSH3LxHHvL" name="FiiO_FG3" alt="A black FiiO FG3 gaming headset" src="https://cdn.mos.cms.futurecdn.net/A7qo9Nz2B8zrWSH3LxHHvL.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Alongside manufacturing some fantastic audiophile headphones, FiiO has a growing range of wallet-friendly DACs too, and it’s no surprise that the FG3 features a USB DAC. Featuring a USB-C connector and accompanied by a USB-A adapter for plugging into consoles or PCs, the FG3’s DAC connects to the headset’s 3.5mm plug. It supports up to 192KHz/24-bit sampling rates, powers the dual drivers (more on that shortly) cleanly, and drives the dual-core digital signal processing (DSP) chip for virtual 7.1 surround sound.</p><p>In addition to that, the USB DAC also stores custom equalizer settings and profiles, so it’s pretty much a necessity. It functions as the headset’s inline controls, too, so you can swap between profiles using the ‘M’ button, mute the mic, and adjust the FG3’s volume. An LED indicator on the DAC lights up in different colors to indicate the active EQ profile. Easy to understand, and just as straightforward to use.</p><h2 id="user-friendly-web-based-app">User-friendly web-based app</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/AQw2Ae26TaMDvZU4MvTCuC.jpg" alt="FiiO companion app screenshot" /><figcaption><small role="credit">FiiO / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/mYccawKNV7uiRF8pqFCPkC.jpg" alt="FiiO companion app screenshot" /><figcaption><small role="credit">FiiO / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/AJVLykd7t3jb6eEdZNN6pC.jpg" alt="FiiO companion app screenshot" /><figcaption><small role="credit">FiiO / Tom's Guide</small></figcaption></figure></figure><p>The FiiO FG3 offers extensive customization via <a href="https://fiiocontrol.fiio.com/" target="_blank" rel="nofollow">FiiO Control Web</a>, a web-based companion app with a clean, user-friendly interface. You get extensive control over the 10-band parametric equalizer, which you can adjust to your liking and then save as a custom profile onto the DAC. There are four EQ presets to choose from, too, such as Action, MOBA, FPS and MUG — the fourth is for rhythm games.</p><p>Virtual 7.1 surround sound is baked into the Action preset so you’ll need to switch to it if you want 360° sound. It’s also built into the Cinema mode, designed for watching movies. In addition to this, you can adjust the boom mic’s volume and sidetone, too.</p><h2 id="great-for-most-game-genres">Great for most game genres</h2><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="jiXcfr4zgUG8TxkbwughuL" name="FiiO_FG3" alt="A black FiiO FG3 gaming headset" src="https://cdn.mos.cms.futurecdn.net/jiXcfr4zgUG8TxkbwughuL.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 FiiO FG3 utilizes a coaxial dual-driver setup comprising a 50mm dynamic driver for lows and mids, and a 16mm driver for highs. The FG3 covers a frequency response range of 10Hz to 40KHz, so on paper, it reproduces the softest of footsteps and the loudest of explosions.</p><p>In practice? The sound quality is hit or miss, but let’s talk about the good things first. To test the FG3, I played <a href="https://www.tomsguide.com/gaming/assassins-creed-black-flag-resynced-review">Assassin’s Creed Black Flag Resynced</a> and <a href="https://www.tomsguide.com/gaming/clair-obscur-expedition-33-review">Clair Obscur: Expedition 33</a> on my <a href="https://www.tomsguide.com/gaming/playstation/ps5-slim">PS5 Slim</a>, and <a href="https://www.tomsguide.com/reviews/cyberpunk-2077-phantom-liberty">Cyberpunk 2077</a> on the <a href="https://www.tomsguide.com/computing/gaming-laptops/alienware-16x-aurora-review">Alienware 16X Aurora</a>. The FG3 does well to reproduce ambient and environmental sound effects, especially with the AAA-inspired Action EQ preset enabled.</p><p>In Black Flag Resynced, I felt fully immersed when sailing the seas as I could hear waves crashing against my ship’s sides, as well as my vessel’s creaking. Directional audio worked well here. I could hear my shipwright speaking to my left and my quartermaster answering to my right.</p><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="GvnhgLJVHJNY6BQkkEXsvL" name="FiiO_FG3" alt="A black FiiO FG3 gaming headset" src="https://cdn.mos.cms.futurecdn.net/GvnhgLJVHJNY6BQkkEXsvL.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>Similarly, in Expedition 33, my footsteps sounded textured, and the difference between walking on petals and in shallow water was apparent. Dialogues sounded loud and clear through the FG3 and the words didn’t bleed into one another. I also love that the headset remains distortion-free regardless of the volume you’re playing at. The operatic soundtrack in Expedition 33 didn’t sound scratchy at all when listening to it at the highest volume — though you shouldn’t as doing so can damage your hearing.</p><p>I also tested the FPS EQ preset which emphasizes footsteps by playing a couple hours of Cyberpunk 2077. I was impressed with the high-frequency tuning for positional cues, and I was able to accurately pinpoint the enemies’ locations when infiltrating their camps. The FG3, then, works best when using specific EQs for specific titles.</p><h2 id="good-for-listening-to-music-too">Good for listening to music, too</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="AYS5gmMZGp3cgeKFJSqTXL" name="FiiO_FG3" alt="A black FiiO FG3 gaming headset" src="https://cdn.mos.cms.futurecdn.net/AYS5gmMZGp3cgeKFJSqTXL.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Even though it’s a gaming headset, FiiO has added its HiFi expertise to the FG3 which is Hi-Res Audio certified. It can transmit and reproduce high-resolution digital audio formats with its 192KHz/24-bit sampling rate. With its HiFi and gaming chops, the FG3 is similar to the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/edifier-g5-max-review">Edifier G5 Max </a>($149) but costs a fraction of the price.</p><p>I tested the FG3’s streaming capabilities by listening to my favorite tunes on <a href="https://www.tomsguide.com/audio/qobuz-review">Qobuz</a>, the <a href="https://www.tomsguide.com/buying-guide/best-music-streaming-services">best music streaming service</a> for audiophiles. The intricate guitar work in Dire Straits’ ‘<a href="https://open.qobuz.com/track/161150239" target="_blank" rel="nofollow">Sultans of Swing’</a> sounded impressively clear, with every note having enough room to shine. Meanwhile, Lana Del Rey’s vocals in ‘<a href="https://open.qobuz.com/track/31887413" target="_blank" rel="nofollow">Born to Die</a>’ felt beautifully textured, and the treble sounded vibrant but never fatiguing. As for the lows, the bassline in ‘<a href="https://open.qobuz.com/track/2329144" target="_blank" rel="nofollow">The Intro</a>’ by The xx had plenty of warmth to it, and it felt tight and controlled throughout.</p><p>However, it’s worth noting that the default EQ for music — called ‘HiFi’ — makes music sound slightly muffled and distant. I switched to the flat profile through the web-based companion app (more on that shortly) and it made a world of difference.</p><p><em>Listen along to my review with the FiiO FG3 testing playlist:</em></p><iframe allow="" height="390" width="378" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://widget.qobuz.com/playlist/68498024?zone=GB-en"></iframe><h2 id="clear-boom-mic">Clear boom mic</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RWQLBFtFH8twsAJvQY6GuL" name="FiiO_FG3" alt="A black FiiO FG3 gaming headset" src="https://cdn.mos.cms.futurecdn.net/RWQLBFtFH8twsAJvQY6GuL.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 FiiO FG3 comes with a detachable boom mic which works well in real-world use. It features environmental noise cancelation (ENC), designed to eliminate ambient sounds and external disturbances — and it works as intended.</p><audio src="https://cdn.mos.cms.futurecdn.net/pBauJXYoaiomCKvHrJNMCg/New%20Recording%202.mp3"  controls="controls" preload="none"></audio><p><br>I recorded myself speaking with nothing else playing in the background, and you can hear the clip above. Sibilant — “t” and “s” sounds — are clear and don’t sound hissy, while plosives — “p” and “t” sounds — are clean and don’t pop.</p><audio src="https://cdn.mos.cms.futurecdn.net/rWpqnMmzUs88RMbNj6BuDg/New%20Recording%203.mp3"  controls="controls" preload="none"></audio><p><br>To test the mic’s ENC, I played a YouTube video at about 70% volume in the background, and you can’t really hear it in the clip above. My voice is front and center which is what you’d expect from a decent gaming headset. The FG3’s mic performance feels on par with the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/asus-rog-pelta-gaming-headset-review">Asus ROG Pelta</a>’s ($129).</p><h2 id="competitively-priced-2">Competitively priced</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9PRgtthcnm9kDG5w94Tx7L" name="FiiO_FG3" alt="A black FiiO FG3 gaming headset" src="https://cdn.mos.cms.futurecdn.net/9PRgtthcnm9kDG5w94Tx7L.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>Given everything I’ve mentioned so far, the FiiO FG3 feels like great value for money, as it’s priced competitively. The FG3 has a retail price of <a href="https://www.amazon.com/FiiO-Headphones-Detachable-Microphone-Compatible/dp/B0H7BQ9RDR/" target="_blank" rel="nofollow">$69 at Amazon U.S.</a> / <a href="https://www.fiio.com/fg3" target="_blank" rel="nofollow">£69 at FiiO U.K.</a> — so it costs the same as the PowerA LucidSound LS500 ($69) and is slightly cheaper than the Logitech G325 Lightspeed ($79) and the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/turtle-beach-stealth-600-gen-3-review">Turtle Beach Stealth 600 Gen 3</a> ($99).</p><p>While the FG3 is pricier than the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/asus-tuf-gaming-h1-gen-ii-headset-review">Asus TUF Gaming H1 Gen II </a>($49), it’s worth spending the extra $20 for Hi-Res Audio and low-key design.</p><h2 class="article-body__section" id="section-fiio-fg3-review-the-downs"><span>FiiO FG3 review: The downs</span></h2><p>Though it’s good, the FiiO FG3’s default sound profile sounds muddy, the headset has a plasticky build, and its wired-only design might not be for everyone.</p><h2 id="default-sound-profile-needs-tweaking">Default sound profile needs tweaking</h2><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="TKMdXiF2UAxPvv6rios2ML" name="FiiO_FG3" alt="A black FiiO FG3 gaming headset" src="https://cdn.mos.cms.futurecdn.net/TKMdXiF2UAxPvv6rios2ML.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 hallmark of a great headset is that it sounds fantastic straight out of the box. Unfortunately, that’s not true in the case of the FiiO FG3. Its default sound profile for video games sounds muddy at best. You need to play around with the equalizer to get the best possible sound as, without doing so, the bass lacks <em>oomph </em>and low-end impact, while treble sounds like it’s been toned down by a lot.</p><p>For instance, while I enjoyed exploring and sailing the seas in Assassin’s Creed Black Flag Resynced, combat effects left a lot to be desired. What are usually high-pitched sounds of swords clashing sounded muted through the FG3. The iconic <em>shing </em>of the protagonist’s hidden blade was also missing, which broke my immersion. Similarly, in Cyberpunk 2077, bullets didn’t sound as sharp and loud as they usually do through, say, the Cherry XTRFY H3.</p><p>As for bass, with the default sound profile active, my magical attacks sounded hollow on impact in Clair Obscur: Expedition 33. I eventually fixed these issues by adjusting the equalizer, but it’s disappointing that you can’t just plug in the FG3 and start enjoying all it has to offer.</p><h2 id="subpar-build-quality">Subpar build quality</h2><p>The FiiO FG3’s design and build are nothing to write home about. The build quality is subpar as the headset feels a little too plasticky and flimsy for my liking. There’s also a slight creaking sound when you swivel the earcups — but thankfully, it isn’t apparent when you simply move your head (unlike on the Logitech G325 Lightspeed).</p><p>Underwhelming build quality isn’t rare in this price range, and if you want a more premium-feeling headset, you’ll have to spend a little more on the likes of the Cherry XTRFY H3 or the Asus ROG Pelta. </p><h2 id="wired-only-design">Wired-only 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:704px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="z8o2kXH77NwHVQRkVfTyuL" name="FiiO_FG3" alt="A black FiiO FG3 gaming headset" src="https://cdn.mos.cms.futurecdn.net/v2/t:433,l:1126,cw:704,ch:396,q:80/z8o2kXH77NwHVQRkVfTyuL.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>This is more of a pre-purchase consideration rather than an outright drawback: the FiiO FG3 is a wired-only gaming headset. It can be plugged into your console or PC via either the 3.5mm jack (0.7m long) or using the USB-C DAC (which increases the length to approximately 2.2m). The wired-only plug-and-play design offers multi-platform compatibility with the <a href="https://www.tomsguide.com/reviews/ps5">PS5</a>, PS4, <a href="https://www.tomsguide.com/reviews/xbox-series-x">Xbox Series X</a> and S, <a href="https://www.tomsguide.com/gaming/nintendo/nintendo-switch-2-console-review">Nintendo Switch 2</a>, PC, macOS and smartphones.</p><p>As I mentioned earlier, I tested the FG3 with the headset plugged directly into my PS5 Slim using the included DAC. The distance between my couch and TV is over 2.5 metres, so I had to sit on a chair closer to the TV to use the FG3. While you can plug the headset into the DualSense’s controller’s 3.5mm port, you’ll lose out on EQ presets and your custom profile (which is saved onboard the DAC). You’ll also miss out on high-resolution decoding, therefore resulting in a narrower soundstage and weaker dynamics.</p><p>If you want a wireless headset that’s more versatile, I’d recommend the PowerA LucidSound LS500 ($69) or the Logitech G325 Lightspeed ($79). Neither are Hi-Res Audio certified, though, and usually you need to spend around $150 for it, like on the Edifier G5 Max ($149).</p><h2 class="article-body__section" id="section-fiio-fg3-review-verdict"><span>FiiO FG3 review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="z8o2kXH77NwHVQRkVfTyuL" name="FiiO_FG3" alt="A black FiiO FG3 gaming headset" src="https://cdn.mos.cms.futurecdn.net/z8o2kXH77NwHVQRkVfTyuL.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you need a gaming headset that’s affordable, comfortable and features extensive EQ customization, the FiiO FG3 could be right up your alley. Its EQ presets are finetuned and make games sound great, while its mic performance is solid. The headset is extremely comfortable for all-day wear, and I love the included DAC with its in-line controls, too.</p><p>But the FG3’s default sound profile — for both video games and music streaming — sounds muddy and needs tweaking, which means you can’t use it straight out of the box. Build quality is nothing to write home about either, and the wired-only design may not be everyone’s cup of tea.</p><p>For its first gaming headset, FiiO has done a respectable job, and it has priced the headset just right, too. The FG3 ticks almost all the boxes, and with some tweaks, I think the brand could make the next one even better.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/fiio-fg3-review</link>
                                                                            <description>
                            <![CDATA[ The FiiO FG3 is a great and comfortable gaming headset boasting good mic performance, and it features a useful DAC with onboard controls. But it has some flaws. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">ygdkoC8AGZfK9qMvP2zPgQ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/bBq3KkWQEbcyyAyRskj5vL-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 13 Aug 2026 12:42:49 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres.&lt;/p&gt;&lt;p&gt;A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/bBq3KkWQEbcyyAyRskj5vL-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A black FiiO FG3 gaming headset]]></media:description>                                                            <media:text><![CDATA[A black FiiO FG3 gaming headset]]></media:text>
                                <media:title type="plain"><![CDATA[A black FiiO FG3 gaming headset]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/bBq3KkWQEbcyyAyRskj5vL-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>It was only a matter of time before FiiO, known for making some of the <a href="https://www.tomsguide.com/us/best-headphones,review-1988.html">best headphones</a> for audiophiles on a budget, entered the gaming headset market — and the FiiO FG3 is almost a triumph. Priced at just $69, the FG3 is mighty cheap. It’s also comfortable, and its wired-only plug-and-play design makes it compatible with a range of consoles and devices. You also get extensive customization and finetuned EQ presets, too.</p><p>But there’s some room for improvement. Though it boasts good mic performance and it’s great for listening to music, the FG3’s default sound profile sounds muddy and needs tweaking. Build quality isn’t the best either, and the wired-only design might not be for everyone.</p><p>Is it still the <a href="https://www.tomsguide.com/best-picks/best-cheap-gaming-headsets">best cheap gaming headset </a>for you? Read my full FiiO FG3 review to find out.</p><h2 class="article-body__section" id="section-fiio-fg3-review-specs"><span>FiiO FG3 review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/FiiO-Headphones-Detachable-Microphone-Compatible/dp/B0H7BQ9RDR/" target="_blank" rel="nofollow">$69</a> / <a href="https://www.fiio.com/fg3" target="_blank" rel="nofollow">£69</a></p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Black</p></td></tr><tr><td class="firstcol " ><p><strong>Platforms</strong></p></td><td  ><p>PS5, PS4, Xbox Series X|S, Nintendo Switch 2, Nintendo Switch, PC, macOS, iOS, Android</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>USB-C / USB-A wired</p></td></tr><tr><td class="firstcol " ><p><strong>Frequency response</strong></p></td><td  ><p>10Hz-40KHz</p></td></tr><tr><td class="firstcol " ><p><strong>Drivers</strong></p></td><td  ><p>Coaxial dual-driver (50mm dynamic and 16mm dynamic)</p></td></tr><tr><td class="firstcol " ><p><strong>Multipoint connectivity</strong></p></td><td  ><p>No</p></td></tr><tr><td class="firstcol " ><p><strong>Paired devices max</strong></p></td><td  ><p>1</p></td></tr><tr><td class="firstcol " ><p><strong>Microphone</strong></p></td><td  ><p>Detachable boom mic</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>11.1oz</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-fiio-fg3-review-cheat-sheet"><span>FiiO FG3 review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>FiiO’s first-ever gaming headset with a wired-only design</li><li><strong>Who is it for?</strong> Gamers on a tight budget</li><li><strong>How much does it cost?</strong> The FiiO FG3 is available for <a href="https://www.amazon.com/FiiO-Headphones-Detachable-Microphone-Compatible/dp/B0H7BQ9RDR/" target="_blank" rel="nofollow">$69</a> / <a href="https://www.fiio.com/fg3" target="_blank" rel="nofollow">£69</a></li><li><strong>What do we like? </strong>The comfortable fit, EQ presets that work well, useful DAC with in-line controls, mic performance, and more</li><li><strong>What don’t we like?</strong> The default sound profile (it’s muddy) and the subpar build quality</li></ul><h2 class="article-body__section" id="section-fiio-fg3-review-the-ups"><span>FiiO FG3 review: The ups</span></h2><p>From its comfortable design and useful DAC with onboard controls, to the immersive in-game audio and Hi-Res Audio certification, the FiiO FG3 gives you almost everything you need.</p><h2 id="very-comfortable">Very comfortable</h2><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="bBq3KkWQEbcyyAyRskj5vL" name="FiiO_FG3" alt="A black FiiO FG3 gaming headset" src="https://cdn.mos.cms.futurecdn.net/bBq3KkWQEbcyyAyRskj5vL.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>FiiO has nailed it in the comfort department, as the FG3 is extremely comfortable for all-day wear. At just 11.1oz, the FG3 is lighter than the likes of the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/cherry-xtrfy-h3-gaming-headset-review">Cherry XTRFY H3</a> ($99, 11.46oz). While it’s slightly heavier than the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/powera-lucidsound-ls500-review">PowerA LucidSound LS500</a> ($69, 9.34oz) and the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/logitech-g325-lightspeed-review">Logitech G325 Lightspeed</a> ($79, 7.47oz), the FG3 doesn’t feel unwieldy. It hits the sweet spot.</p><p>Aiding the FG3’s comfort factor are its woven mesh fabric ear cushions which are highly breathable and sweat-resistant. Having worn the headset for seven consecutive hours, I can confirm that I haven’t felt any discomfort or pooling of sweat, and my ears haven’t overheated either. The earpads are swappable, too, in case they get damaged. I also love how spacious the earcups are, and the headset features spot-on clamp force without making it feel like there’s pressure on your temples or head.</p><p>Similar to the<a href="https://www.tomsguide.com/audio/headphones/fiio-jt7-review"> FiiO JT7</a> ($119), the FG3’s stainless steel headband features velvet-like padded cloth that helps relieve pressure you might otherwise feel on the top of your head.</p><h2 id="useful-dac-with-onboard-controls">Useful DAC with onboard controls</h2><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="A7qo9Nz2B8zrWSH3LxHHvL" name="FiiO_FG3" alt="A black FiiO FG3 gaming headset" src="https://cdn.mos.cms.futurecdn.net/A7qo9Nz2B8zrWSH3LxHHvL.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Alongside manufacturing some fantastic audiophile headphones, FiiO has a growing range of wallet-friendly DACs too, and it’s no surprise that the FG3 features a USB DAC. Featuring a USB-C connector and accompanied by a USB-A adapter for plugging into consoles or PCs, the FG3’s DAC connects to the headset’s 3.5mm plug. It supports up to 192KHz/24-bit sampling rates, powers the dual drivers (more on that shortly) cleanly, and drives the dual-core digital signal processing (DSP) chip for virtual 7.1 surround sound.</p><p>In addition to that, the USB DAC also stores custom equalizer settings and profiles, so it’s pretty much a necessity. It functions as the headset’s inline controls, too, so you can swap between profiles using the ‘M’ button, mute the mic, and adjust the FG3’s volume. An LED indicator on the DAC lights up in different colors to indicate the active EQ profile. Easy to understand, and just as straightforward to use.</p><h2 id="user-friendly-web-based-app">User-friendly web-based app</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/AQw2Ae26TaMDvZU4MvTCuC.jpg" alt="FiiO companion app screenshot" /><figcaption><small role="credit">FiiO / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/mYccawKNV7uiRF8pqFCPkC.jpg" alt="FiiO companion app screenshot" /><figcaption><small role="credit">FiiO / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/AJVLykd7t3jb6eEdZNN6pC.jpg" alt="FiiO companion app screenshot" /><figcaption><small role="credit">FiiO / Tom's Guide</small></figcaption></figure></figure><p>The FiiO FG3 offers extensive customization via <a href="https://fiiocontrol.fiio.com/" target="_blank" rel="nofollow">FiiO Control Web</a>, a web-based companion app with a clean, user-friendly interface. You get extensive control over the 10-band parametric equalizer, which you can adjust to your liking and then save as a custom profile onto the DAC. There are four EQ presets to choose from, too, such as Action, MOBA, FPS and MUG — the fourth is for rhythm games.</p><p>Virtual 7.1 surround sound is baked into the Action preset so you’ll need to switch to it if you want 360° sound. It’s also built into the Cinema mode, designed for watching movies. In addition to this, you can adjust the boom mic’s volume and sidetone, too.</p><h2 id="great-for-most-game-genres">Great for most game genres</h2><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="jiXcfr4zgUG8TxkbwughuL" name="FiiO_FG3" alt="A black FiiO FG3 gaming headset" src="https://cdn.mos.cms.futurecdn.net/jiXcfr4zgUG8TxkbwughuL.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 FiiO FG3 utilizes a coaxial dual-driver setup comprising a 50mm dynamic driver for lows and mids, and a 16mm driver for highs. The FG3 covers a frequency response range of 10Hz to 40KHz, so on paper, it reproduces the softest of footsteps and the loudest of explosions.</p><p>In practice? The sound quality is hit or miss, but let’s talk about the good things first. To test the FG3, I played <a href="https://www.tomsguide.com/gaming/assassins-creed-black-flag-resynced-review">Assassin’s Creed Black Flag Resynced</a> and <a href="https://www.tomsguide.com/gaming/clair-obscur-expedition-33-review">Clair Obscur: Expedition 33</a> on my <a href="https://www.tomsguide.com/gaming/playstation/ps5-slim">PS5 Slim</a>, and <a href="https://www.tomsguide.com/reviews/cyberpunk-2077-phantom-liberty">Cyberpunk 2077</a> on the <a href="https://www.tomsguide.com/computing/gaming-laptops/alienware-16x-aurora-review">Alienware 16X Aurora</a>. The FG3 does well to reproduce ambient and environmental sound effects, especially with the AAA-inspired Action EQ preset enabled.</p><p>In Black Flag Resynced, I felt fully immersed when sailing the seas as I could hear waves crashing against my ship’s sides, as well as my vessel’s creaking. Directional audio worked well here. I could hear my shipwright speaking to my left and my quartermaster answering to my right.</p><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="GvnhgLJVHJNY6BQkkEXsvL" name="FiiO_FG3" alt="A black FiiO FG3 gaming headset" src="https://cdn.mos.cms.futurecdn.net/GvnhgLJVHJNY6BQkkEXsvL.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>Similarly, in Expedition 33, my footsteps sounded textured, and the difference between walking on petals and in shallow water was apparent. Dialogues sounded loud and clear through the FG3 and the words didn’t bleed into one another. I also love that the headset remains distortion-free regardless of the volume you’re playing at. The operatic soundtrack in Expedition 33 didn’t sound scratchy at all when listening to it at the highest volume — though you shouldn’t as doing so can damage your hearing.</p><p>I also tested the FPS EQ preset which emphasizes footsteps by playing a couple hours of Cyberpunk 2077. I was impressed with the high-frequency tuning for positional cues, and I was able to accurately pinpoint the enemies’ locations when infiltrating their camps. The FG3, then, works best when using specific EQs for specific titles.</p><h2 id="good-for-listening-to-music-too">Good for listening to music, too</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="AYS5gmMZGp3cgeKFJSqTXL" name="FiiO_FG3" alt="A black FiiO FG3 gaming headset" src="https://cdn.mos.cms.futurecdn.net/AYS5gmMZGp3cgeKFJSqTXL.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Even though it’s a gaming headset, FiiO has added its HiFi expertise to the FG3 which is Hi-Res Audio certified. It can transmit and reproduce high-resolution digital audio formats with its 192KHz/24-bit sampling rate. With its HiFi and gaming chops, the FG3 is similar to the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/edifier-g5-max-review">Edifier G5 Max </a>($149) but costs a fraction of the price.</p><p>I tested the FG3’s streaming capabilities by listening to my favorite tunes on <a href="https://www.tomsguide.com/audio/qobuz-review">Qobuz</a>, the <a href="https://www.tomsguide.com/buying-guide/best-music-streaming-services">best music streaming service</a> for audiophiles. The intricate guitar work in Dire Straits’ ‘<a href="https://open.qobuz.com/track/161150239" target="_blank" rel="nofollow">Sultans of Swing’</a> sounded impressively clear, with every note having enough room to shine. Meanwhile, Lana Del Rey’s vocals in ‘<a href="https://open.qobuz.com/track/31887413" target="_blank" rel="nofollow">Born to Die</a>’ felt beautifully textured, and the treble sounded vibrant but never fatiguing. As for the lows, the bassline in ‘<a href="https://open.qobuz.com/track/2329144" target="_blank" rel="nofollow">The Intro</a>’ by The xx had plenty of warmth to it, and it felt tight and controlled throughout.</p><p>However, it’s worth noting that the default EQ for music — called ‘HiFi’ — makes music sound slightly muffled and distant. I switched to the flat profile through the web-based companion app (more on that shortly) and it made a world of difference.</p><p><em>Listen along to my review with the FiiO FG3 testing playlist:</em></p><iframe allow="" height="390" width="378" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://widget.qobuz.com/playlist/68498024?zone=GB-en"></iframe><h2 id="clear-boom-mic">Clear boom mic</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RWQLBFtFH8twsAJvQY6GuL" name="FiiO_FG3" alt="A black FiiO FG3 gaming headset" src="https://cdn.mos.cms.futurecdn.net/RWQLBFtFH8twsAJvQY6GuL.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 FiiO FG3 comes with a detachable boom mic which works well in real-world use. It features environmental noise cancelation (ENC), designed to eliminate ambient sounds and external disturbances — and it works as intended.</p><audio src="https://cdn.mos.cms.futurecdn.net/pBauJXYoaiomCKvHrJNMCg/New%20Recording%202.mp3"  controls="controls" preload="none"></audio><p><br>I recorded myself speaking with nothing else playing in the background, and you can hear the clip above. Sibilant — “t” and “s” sounds — are clear and don’t sound hissy, while plosives — “p” and “t” sounds — are clean and don’t pop.</p><audio src="https://cdn.mos.cms.futurecdn.net/rWpqnMmzUs88RMbNj6BuDg/New%20Recording%203.mp3"  controls="controls" preload="none"></audio><p><br>To test the mic’s ENC, I played a YouTube video at about 70% volume in the background, and you can’t really hear it in the clip above. My voice is front and center which is what you’d expect from a decent gaming headset. The FG3’s mic performance feels on par with the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/asus-rog-pelta-gaming-headset-review">Asus ROG Pelta</a>’s ($129).</p><h2 id="competitively-priced-2">Competitively priced</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9PRgtthcnm9kDG5w94Tx7L" name="FiiO_FG3" alt="A black FiiO FG3 gaming headset" src="https://cdn.mos.cms.futurecdn.net/9PRgtthcnm9kDG5w94Tx7L.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>Given everything I’ve mentioned so far, the FiiO FG3 feels like great value for money, as it’s priced competitively. The FG3 has a retail price of <a href="https://www.amazon.com/FiiO-Headphones-Detachable-Microphone-Compatible/dp/B0H7BQ9RDR/" target="_blank" rel="nofollow">$69 at Amazon U.S.</a> / <a href="https://www.fiio.com/fg3" target="_blank" rel="nofollow">£69 at FiiO U.K.</a> — so it costs the same as the PowerA LucidSound LS500 ($69) and is slightly cheaper than the Logitech G325 Lightspeed ($79) and the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/turtle-beach-stealth-600-gen-3-review">Turtle Beach Stealth 600 Gen 3</a> ($99).</p><p>While the FG3 is pricier than the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/asus-tuf-gaming-h1-gen-ii-headset-review">Asus TUF Gaming H1 Gen II </a>($49), it’s worth spending the extra $20 for Hi-Res Audio and low-key design.</p><h2 class="article-body__section" id="section-fiio-fg3-review-the-downs"><span>FiiO FG3 review: The downs</span></h2><p>Though it’s good, the FiiO FG3’s default sound profile sounds muddy, the headset has a plasticky build, and its wired-only design might not be for everyone.</p><h2 id="default-sound-profile-needs-tweaking">Default sound profile needs tweaking</h2><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="TKMdXiF2UAxPvv6rios2ML" name="FiiO_FG3" alt="A black FiiO FG3 gaming headset" src="https://cdn.mos.cms.futurecdn.net/TKMdXiF2UAxPvv6rios2ML.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 hallmark of a great headset is that it sounds fantastic straight out of the box. Unfortunately, that’s not true in the case of the FiiO FG3. Its default sound profile for video games sounds muddy at best. You need to play around with the equalizer to get the best possible sound as, without doing so, the bass lacks <em>oomph </em>and low-end impact, while treble sounds like it’s been toned down by a lot.</p><p>For instance, while I enjoyed exploring and sailing the seas in Assassin’s Creed Black Flag Resynced, combat effects left a lot to be desired. What are usually high-pitched sounds of swords clashing sounded muted through the FG3. The iconic <em>shing </em>of the protagonist’s hidden blade was also missing, which broke my immersion. Similarly, in Cyberpunk 2077, bullets didn’t sound as sharp and loud as they usually do through, say, the Cherry XTRFY H3.</p><p>As for bass, with the default sound profile active, my magical attacks sounded hollow on impact in Clair Obscur: Expedition 33. I eventually fixed these issues by adjusting the equalizer, but it’s disappointing that you can’t just plug in the FG3 and start enjoying all it has to offer.</p><h2 id="subpar-build-quality">Subpar build quality</h2><p>The FiiO FG3’s design and build are nothing to write home about. The build quality is subpar as the headset feels a little too plasticky and flimsy for my liking. There’s also a slight creaking sound when you swivel the earcups — but thankfully, it isn’t apparent when you simply move your head (unlike on the Logitech G325 Lightspeed).</p><p>Underwhelming build quality isn’t rare in this price range, and if you want a more premium-feeling headset, you’ll have to spend a little more on the likes of the Cherry XTRFY H3 or the Asus ROG Pelta. </p><h2 id="wired-only-design">Wired-only 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:704px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="z8o2kXH77NwHVQRkVfTyuL" name="FiiO_FG3" alt="A black FiiO FG3 gaming headset" src="https://cdn.mos.cms.futurecdn.net/v2/t:433,l:1126,cw:704,ch:396,q:80/z8o2kXH77NwHVQRkVfTyuL.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>This is more of a pre-purchase consideration rather than an outright drawback: the FiiO FG3 is a wired-only gaming headset. It can be plugged into your console or PC via either the 3.5mm jack (0.7m long) or using the USB-C DAC (which increases the length to approximately 2.2m). The wired-only plug-and-play design offers multi-platform compatibility with the <a href="https://www.tomsguide.com/reviews/ps5">PS5</a>, PS4, <a href="https://www.tomsguide.com/reviews/xbox-series-x">Xbox Series X</a> and S, <a href="https://www.tomsguide.com/gaming/nintendo/nintendo-switch-2-console-review">Nintendo Switch 2</a>, PC, macOS and smartphones.</p><p>As I mentioned earlier, I tested the FG3 with the headset plugged directly into my PS5 Slim using the included DAC. The distance between my couch and TV is over 2.5 metres, so I had to sit on a chair closer to the TV to use the FG3. While you can plug the headset into the DualSense’s controller’s 3.5mm port, you’ll lose out on EQ presets and your custom profile (which is saved onboard the DAC). You’ll also miss out on high-resolution decoding, therefore resulting in a narrower soundstage and weaker dynamics.</p><p>If you want a wireless headset that’s more versatile, I’d recommend the PowerA LucidSound LS500 ($69) or the Logitech G325 Lightspeed ($79). Neither are Hi-Res Audio certified, though, and usually you need to spend around $150 for it, like on the Edifier G5 Max ($149).</p><h2 class="article-body__section" id="section-fiio-fg3-review-verdict"><span>FiiO FG3 review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="z8o2kXH77NwHVQRkVfTyuL" name="FiiO_FG3" alt="A black FiiO FG3 gaming headset" src="https://cdn.mos.cms.futurecdn.net/z8o2kXH77NwHVQRkVfTyuL.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you need a gaming headset that’s affordable, comfortable and features extensive EQ customization, the FiiO FG3 could be right up your alley. Its EQ presets are finetuned and make games sound great, while its mic performance is solid. The headset is extremely comfortable for all-day wear, and I love the included DAC with its in-line controls, too.</p><p>But the FG3’s default sound profile — for both video games and music streaming — sounds muddy and needs tweaking, which means you can’t use it straight out of the box. Build quality is nothing to write home about either, and the wired-only design may not be everyone’s cup of tea.</p><p>For its first gaming headset, FiiO has done a respectable job, and it has priced the headset just right, too. The FG3 ticks almost all the boxes, and with some tweaks, I think the brand could make the next one even better.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Razer’s new RGB gaming chair kept my butt comfy but was a serious pain in the neck ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Razer Soma Chroma is the latest <a href="https://www.tomsguide.com/best-picks/best-gaming-chairs"><u>gaming chair</u></a> from Razer, taking up the mid-range mantle between the pricier Razer Iskur and slightly cheaper Razer Enki. The Soma Chroma has one major party trick: not satisfied with its usual black and green motif, Razer has added RGB lighting for maximum elite gamerness. The Soma Chroma also boasts Razer’s usual premium design and build quality, a super thick seat cushion and comfortable arm rests.</p><p>Unfortunately, it’s let down by a few glaring omissions. Razer seems to think a slight bend in the backrest constitutes lumbar support, and that neck support isn’t as important as RGB lighting. So while your butt might be comfy, your back and neck certainly won’t be without further purchases. There’s also very limited adjustments on offer. Oh, and the companion software, Synapse, is terrible.</p><p>All in all, if you want a gaming chair that’s all about looks, this could be the one. But if you’re planning on spending long hours in the hot seat, I’d advise you look for something with more support and adjustability.</p><p>Find out more in my full Razer Soma Chroma review.</p><h2 class="article-body__section" id="section-razer-soma-chroma-review-cheat-sheet"><span>Razer Soma Chroma review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>A mid-range gaming chair from Razer</li><li><strong>Who is it for? Gamers who want an RGB-clad chair</strong></li><li><strong>What does it cost?</strong> <a href="https://www.amazon.com/Razer-Chroma-Ergonomic-Reactive-Lighting/dp/B0H3XDND95/" target="_blank" rel="nofollow"><u>$499</u></a> / <a href="https://www.amazon.co.uk/Razer-Soma-Chroma-Built-Connection/dp/B0GX5QZ2TK" target="_blank" rel="nofollow"><u>£499</u></a></li><li><strong>What do we like? </strong>The comfy base and arm rests, premium build, attractive styling and ease of assembly</li><li><strong>What don’t we like? </strong>Virtually no lumbar support, no neck support, limited adjustability and an awful companion app</li></ul><h2 class="article-body__section" id="section-razer-soma-chroma-review-specs"><span>Razer Soma Chroma review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/Razer-Chroma-Ergonomic-Reactive-Lighting/dp/B0H3XDND95/" target="_blank" rel="nofollow"><u>$499</u></a> / <a href="https://www.amazon.co.uk/Razer-Soma-Chroma-Built-Connection/dp/B0GX5QZ2TK" target="_blank" rel="nofollow"><u>£499</u></a></p></td></tr><tr><td class="firstcol " ><p><strong>Maximum user height</strong></p></td><td  ><p>5.3-6.6 ft</p></td></tr><tr><td class="firstcol " ><p><strong>Maximum load</strong></p></td><td  ><p>331 lbs</p></td></tr><tr><td class="firstcol " ><p><strong>Seat height</strong></p></td><td  ><p>16-20 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Backrest height</strong></p></td><td  ><p>33 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Material</strong></p></td><td  ><p>Fabric (unspecified)</p></td></tr><tr><td class="firstcol " ><p><strong>Warranty</strong></p></td><td  ><p>3 years</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-razer-soma-chroma-review-the-ups"><span>Razer Soma Chroma review: The ups</span></h2><p>The Razer Soma Chroma has a few things in its favor, like premium build quality, a striking aesthetic, a comfy base and squidgy arm rests, plus a mostly cable-free design.</p><h2 id="premium-build">Premium build </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="5P4rzXDGgx8axhjcbznDTo" name="Razer_gamingchair_ 15.JPG" alt="The Razer Soma Chroma chair in an industrial setting head rest with the RGB on and the Razer logo showing, illuminated with a green glow" src="https://cdn.mos.cms.futurecdn.net/5P4rzXDGgx8axhjcbznDTo.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>There’s no denying the Soma Chroma is built well — unsurprising if you have any experience with Razer products. The fabric used is high quality and soft to the touch; there’s thick foam on the seat pad and arm rests; and there aren’t too many scratchy plastics (with the exception of the arm rest tubes. </p><p>The chair’s recline mechanism also operates with a very satisfying mechanical clunk — it feels like there’s some heavyweight machinery in there holding it together. It’s a far cry from the janky mechanism used on my <a href="https://www.tomsguide.com/home/home-office/boulies-ep460-review"><u>Boulies EP460</u></a>.</p><h2 id="easy-assembly">Easy assembly</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/4BL7SzUWji9ZfxXU8gFpVY.jpg" alt="The Razer Soma Chroma's components laid out on a concrete floor" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/NEhmYfwB3vB9LqVwFoj3PY.jpg" alt="The Razer Soma Chroma's instruction manual" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>The Soma Chroma was pretty easy to assemble. My team reviews lots of chairs, and I’m usually the one building them — even when my colleagues are the ones reviewing them (I guess that’s one disadvantage to being handy with a wrench).</p><p>The Soma Chroma was in the average difficulty range. It was nowhere near as simple to build as the <a href="https://www.tomsguide.com/home/home-office/boulies-op180-review"><u>Boulies OP180</u></a>, which only took me 10 minutes. There were also some heavier components, like the back rest, which may necessitate a second person to help. Other than that, it’s simply a case of putting the bolts where needed, all of which is detailed in the very thorough included instruction sheet. I built the Soma Chroma on my own in about half an hour. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ZD27FxbV4TQWCQBKQUhkLY" name="Razer Soma Chroma Build_1" alt="The Razer Soma Chroma's building gloves" src="https://cdn.mos.cms.futurecdn.net/ZD27FxbV4TQWCQBKQUhkLY.jpg" mos="" align="middle" fullscreen="" width="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 love that Razer supplies the Soma Chroma with a set of black gloves to  wear when building the chair. I've never seen that from other brands before, and it's a nice touch.</p><h2 id="dashing-design">Dashing design</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="T8QCq5RtAJUsoWoUPam7gn" name="Razer_gamingchair_.JPG" alt="The Razer Soma Chroma chair in an industrial setting, illuminated with a green glow and with a gaming setup in the background" src="https://cdn.mos.cms.futurecdn.net/T8QCq5RtAJUsoWoUPam7gn.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Soma Chroma looks rather fetching, too. It sports the typical streamlined gamer chair design — not a million miles away from the ubiquitous <a href="https://www.tomsguide.com/gaming/gaming-peripherals/secretlab-titan-evo-2022-review"><u>Secretlab Titan Evo</u></a>. A cutout near the neck and distinctive contouring on both the back rest and seat give it a sports-car-esque vibe. It looks straight out of an esports competition.</p><p>With the lighting disabled, The Soma Chroma boasts Razer’s usual sleek, blacked out aesthetic, with striking green accents. With the lighting turned on, it looks about as sophisticated as RGB lighting ever does. If you’re after that particular aesthetic, I’m sure you’ll think it looks great. It’s not for me, but that’s down to personal preference. And besides, Razer has applied the RGB fairly sparingly around the wings.</p><h2 id="comfy-base-and-arm-rests">Comfy base and arm rests</h2><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="dxbbgXU8sbtNfzaHPjAWVo" name="Razer_gamingchair_ 10.JPG" alt="The Razer Soma Chroma chair seat base, illuminated with a green glow" src="https://cdn.mos.cms.futurecdn.net/dxbbgXU8sbtNfzaHPjAWVo.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Sitting on the Soma Chroma for the first time, I was very pleasantly surprised at the seat base. I suffer from a type of immuno-arthritis that affects, among other areas, my coccyx. In short, butt comfiness is high on my agenda. </p><p>With other foam-cushioned chairs I’ve used, like the <a href="https://www.tomsguide.com/home/home-office/autonomous-ergochair-pro-review"><u>Autonomous ErgoChair Pro</u></a>, seat pad foam usually compresses, applying too much pressure up into my lower back — I often have to use a special coccyx relief cushion with a cutout to relieve coccyx pressure. It’s for this reason I usually choose full mesh chairs like the Boulies EP460, as mesh seat pads provide the best butt support.</p><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="sDdosCcQuscG26sXxUsppn" name="Razer_gamingchair_ 3.JPG" alt="The Razer Soma Chroma chair's armrests, illuminated with a green glow" src="https://cdn.mos.cms.futurecdn.net/sDdosCcQuscG26sXxUsppn.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Soma Chroma, though, has probably the comfiest foam base I’ve sat on. The foam is super thick and very squishy. I haven’t had to use my coccyx cushion at all. Also impressively squishy are the arm rests. So often, manufacturers leave arm rests hard and uncomfortable, causing elbow pain. Not so here. The Soma Chroma has about an inch of foam padding on each rest.</p><p>Overall, even after longer gaming/work stints of 8 hours, I’ve had no butt and no elbow pain. Unfortunately, as I’ll cover later, I had other types of pain from the lack of back and neck support.</p><h2 id="not-fully-wireless-but-tidy">Not fully wireless, but tidy</h2><p>If you choose to use its lighting, the Soma Chroma needs to be powered via USB-C as there’s no built-in battery. You can either plug it into a wall socket or your PC, or use one of the <a href="https://www.tomsguide.com/best-picks/best-portable-chargers"><u>best power banks</u></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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="q3muaNAyZUSzcNCin3YKwn" name="Razer_gamingchair_ 6.JPG" alt="The Razer Soma Chroma chair with a power bank in its back pocket and plugged into its USB-C cable" src="https://cdn.mos.cms.futurecdn.net/q3muaNAyZUSzcNCin3YKwn.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The latter is the tidiest method — there’s a zip pocket at the back of the base, which will fit a small-ish power bank like my <a href="https://www.amazon.com/INIU-Portable-10000mAh-Essentials-Powerbank/dp/B0FC6D44MT"><u>Iniu Ultra Mini</u></a> ($31). That means no power banks dangling down or cables getting snagged in the wheels as you move the chair.</p><p>The RGB lights aren’t too power hungry either. We ran the RGB for 2-3 hours on our product photoshoot and the charge on my 10,000mAh Iniu only dropped by 1%.</p><p>Once powered, the Soma Chroma <em>does</em> have wireless connectivity. It comes with a USB-A Wi-Fi dongle, so you can hook the chair up to your PC and control the RGB via Razer Synapse. There are controls on the chair itself, but these are a little clunky unless you keep the instructions with you. I’m not at all keen on Synapse either, which I’ll get onto below.</p><h2 class="article-body__section" id="section-razer-soma-chroma-review-the-downs"><span>Razer Soma Chroma review: The downs</span></h2><p>Unfortunately, without buying further accessories, the Soma Chroma is downright uncomfortable thanks to no neck support, minimal lumbar support, no included support accessories and limited adjustment. Then there’s Synapse…</p><h2 id="poor-neck-and-lumbar-support">Poor neck and lumbar support</h2><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="DMZ3G8X4QGvFWzNXvd7xUo" name="Razer_gamingchair_ 12.JPG" alt="The Razer Soma Chroma back rest padding and lumbar curve, illuminated with a green glow" src="https://cdn.mos.cms.futurecdn.net/DMZ3G8X4QGvFWzNXvd7xUo.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Razer claims the Soma Chroma has lumbar support. What it really means is that the Soma Chroma has a slight arch in the backrest. It provides about as much lumbar support as propping one’s self up against a plank of wood. There’s also no neck rest, and no additional neck cushion included — if you want one of those, you’ll need to pay an extra $50. </p><p>After my first testing session — about four hours of gaming — I started noticing a slight pain in my neck and upper shoulders. On day two, after another eight hours, I was experiencing full blown neck pain on both sides, up into the back of my head.</p><p>As I mentioned earlier, I have a form of immuno-arthritis, and there’s no way in hell I’d sit in this chair on a daily basis, at least not without some neck support. I have pretty good sitting posture (I have to make sure of it) but without anything to support your neck, it’s very hard to achieve that.</p><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="NupqQyh7cY8ASG52FDFWJo" name="Razer_gamingchair_ 13.JPG" alt="The Razer Soma Chroma headrest, with the RGB on, Razer logo showing and illuminated with a green glow" src="https://cdn.mos.cms.futurecdn.net/NupqQyh7cY8ASG52FDFWJo.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Admittedly, the Soma Chroma isn’t alone here. If you know anything about computing chairs, you’ll know that gaming chairs are usually designed for style over comfort. Most of them use the same flat back shaping, like the Secretlab Titan Evo and <a href="https://www.tomsguide.com/gaming/gaming-peripherals/dxracer-craft-review"><u>DXRacer Craft</u></a>, for instance — the thing is, those two chairs at least come with a neck pillow for support.</p><p>If you want proper support, though, you’re better off looking at the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-iskur-v2-newgen-review"><u>Razer Iskur V2 NewGen</u></a>, with its much better (i.e. existent) lumbar support and neck pillow. Or, a hybrid mesh chair like the <a href="https://www.tomsguide.com/home/home-office/herman-miller-x-logitech-g-vantum-gaming-chair-review"><u>Herman Miller Vantum</u></a>. Or consider an office chair as, believe it or not, gaming chairs are mostly marketing. You can game just fine and much more comfortably in a mid-range mesh office chair like my Boulies EP460.</p><h2 id="limited-adjustability">Limited adjustability</h2><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="AKuemiFQiNVu8cfge6nzNo" name="Razer_gamingchair_ 5.JPG" alt="The Razer Soma Chroma chair's recline mechanism." src="https://cdn.mos.cms.futurecdn.net/AKuemiFQiNVu8cfge6nzNo.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>On top of the discomfort, the Soma Chroma offers very limited adjustability. You can do the bare minimum: recline, seat height, arm rest height and swivel. But there’s no way to slide the seat forward or back; no forward or backward arm rest sliders, and no lumbar adjustment.</p><p>You <em>can</em> set the chair into a free recline mode, but the mechanism was so stiff on my chair that I had to push off from a wall to get it to actually recline.</p><p>The Soma Chroma is also a little low, with the seat height maxing out at 16-20 inches. My Boulies EP460 maxes out at 23 inches, for comparison. A taller maximum seat height is more comfortable for those with long legs.</p><h2 id="synapse-really-really-sucks">Synapse really, really sucks</h2><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="f9xSiLKC4VNRjhxjkLCDTo" name="Razer_gamingchair_ 8.JPG" alt="The Razer Soma Chroma chair top controls, illuminated by a green glow" src="https://cdn.mos.cms.futurecdn.net/f9xSiLKC4VNRjhxjkLCDTo.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Razer’s Synapse software is one of two ways to control the Soma Chroma’s RGB, in addition to the onboard button controls, which are a little basic. Given the RGB is such a major feature of the chair, Synapse is therefore a pretty important element. </p><p>Now, I’ve used Synapse before, so my expectations were tempered. But man oh man, I’d forgotten quite how much Synapse sucks — like, more than any other mainstream companion software I’ve ever used after testing and using dozens of peripherals. I’d honestly prefer Asus’ Armoury Crate, which is seriously saying something.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/gZPtVosuGphsNEK73352ph.jpg" alt="A screenshot of the Razer Synapse app being used to customize the Razer Soma Chroma" /><figcaption><small role="credit">Razer / Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/VFkeCdp2orV3TobZmSE839.jpg" alt="A screenshot of the Razer Synapse app being used to customize the Razer Soma Chroma" /><figcaption>As you can see in the pink highlighted area (top left), the Soma Chroma was often simply not recognized by Synapse, forcing me to remove the USB dongle and plug it back in each time I rebooted.<small role="credit">Razer / Future</small></figcaption></figure></figure><p>Firstly, Synapse is incredibly annoying to set up: you have to download the installer; then download Synapse (fighting off the extra bloatware it tries to download at the same time); then install Synapse; then fire up the installed app… and then <em>download Synapse again</em>. Like, what? I can’t even. It’s so needlessly complicated. It also kept failing to install, getting stuck at 45% three times, though that could’ve been a Windows issue.</p><p>When you <em>do</em> get Synapse installed, it’s slow, laggy and often takes ages to recognize the chair after booting up your PC, if it even manages to at all. Every time I rebooted, I had to un/re-plug the Soma Chroma’s 2.4G wireless dongle from/into my PC, otherwise Synapse wouldn’t recognize the chair.</p><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="JQEfnP8sNqQUYeobpq7xDo" name="Razer_gamingchair_ 9.JPG" alt="The Razer Soma Chroma chair's 2.4G dongle, sitting on its side on the chair's arm rest." src="https://cdn.mos.cms.futurecdn.net/JQEfnP8sNqQUYeobpq7xDo.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The changes I made in Synapse regularly failed to apply, despite the app saying they did — I switched the lighting to static purple, which it changed to for around 30 seconds before defaulting back to unicorn puke RGB. And to top it all off, the moment you close the Synapse app, the lighting switches back to the default rainbow effect anyway. That means you have to keep that crappy piece of bloatware running while you game, if you want RGB. </p><p>Oh, and if you want any advanced effects you then have to download Razer’s Chroma RGB controller anyway. Eurgh. It’s not worth dealing with such terrible software for a couple of measly RGB strips on a mostly uncomfortable chair.</p><h2 class="article-body__section" id="section-razer-soma-chroma-review-verdict"><span>Razer Soma Chroma review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cZ8rL5Xh6EYHoftrFjGdSn" name="Razer_gamingchair_ 7.JPG" alt="The Razer Soma Chroma chair back, illuminated with a green glow" src="https://cdn.mos.cms.futurecdn.net/cZ8rL5Xh6EYHoftrFjGdSn.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I’m pretty disappointed by the Soma Chroma. I’ve awarded credit for its premium design, comfy base and arm rests, and its ease of assembly. Unfortunately, my three pros up top are tempered by four pretty major cons, so half marks for this chair is arguably even a little generous. </p><p>The Soma Chroma is really rather uncomfortable thanks to its lack of a neck cushion and only a semblance of lumbar support. Meanwhile, the adjustability is pretty scant and the companion software, Synapse, is nothing short of terrible.</p><p>So why bother? Just buy a Secretlab Titan Evo and be slightly less uncomfortable. Or do it properly and buy an ergonomic <a href="https://www.tomsguide.com/home/home-office/best-office-chairs"><u>office chair</u></a> (guess what: you <em>can</em> game in one of those). Before long, your neck will thank you.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/razer-soma-chroma-review</link>
                                                                            <description>
                            <![CDATA[ The Razer Soma Chroma looks good and has some comfortable elements, but is let down by a lack of neck and lumbar support, plus poor companion software. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Z4XSDdStwdCoL4nvBEDWSk</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/T8QCq5RtAJUsoWoUPam7gn-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 13 Aug 2026 11:39:03 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Home Office]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                                                                <author><![CDATA[ peter.wolinski@futurenet.com (Peter Wolinski) ]]></author>                    <dc:creator><![CDATA[ Peter Wolinski ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/stgPfXWY7ukw8J8rfC7vjg.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Peter is a Senior Editor at Tom&#039;s Guide, heading up the site&#039;s Reviews team and Cameras section. Having built gaming PCs since he was 10 (that&#039;s a while ago now) he&#039;s a bit of a nerd about components and hardware. He&#039;s also been an iPhone user since the classic iPhone 4, and a Mac user for well over a decade. Experienced in using and testing all kinds of technology — from phones through to tablets, computers, games consoles, cameras and smart home tech — helping people find the best tech for them (at the best prices) is what Peter does best. A photographer since he bought his first camera (a Fujifilm) in 2015, Peter was previously an Editor for Canon-Europe.com. He then edited the Cameras and How To sections of Tom&#039;s Guide. When he&#039;s not crafting helpful, in-depth reviews, Peter can usually be found out and about honing his architectural photography skills, riding his motorcycle around Welsh mountain roads, telling everyone about his two greyhounds, squeezing a few extra FPS out of PC games or perfecting his espresso shots.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/T8QCq5RtAJUsoWoUPam7gn-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Razer Soma Chroma chair in an industrial setting, illuminated with a green glow and with a gaming setup in the background]]></media:description>                                                            <media:text><![CDATA[The Razer Soma Chroma chair in an industrial setting, illuminated with a green glow and with a gaming setup in the background]]></media:text>
                                <media:title type="plain"><![CDATA[The Razer Soma Chroma chair in an industrial setting, illuminated with a green glow and with a gaming setup in the background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/T8QCq5RtAJUsoWoUPam7gn-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Razer Soma Chroma is the latest <a href="https://www.tomsguide.com/best-picks/best-gaming-chairs"><u>gaming chair</u></a> from Razer, taking up the mid-range mantle between the pricier Razer Iskur and slightly cheaper Razer Enki. The Soma Chroma has one major party trick: not satisfied with its usual black and green motif, Razer has added RGB lighting for maximum elite gamerness. The Soma Chroma also boasts Razer’s usual premium design and build quality, a super thick seat cushion and comfortable arm rests.</p><p>Unfortunately, it’s let down by a few glaring omissions. Razer seems to think a slight bend in the backrest constitutes lumbar support, and that neck support isn’t as important as RGB lighting. So while your butt might be comfy, your back and neck certainly won’t be without further purchases. There’s also very limited adjustments on offer. Oh, and the companion software, Synapse, is terrible.</p><p>All in all, if you want a gaming chair that’s all about looks, this could be the one. But if you’re planning on spending long hours in the hot seat, I’d advise you look for something with more support and adjustability.</p><p>Find out more in my full Razer Soma Chroma review.</p><h2 class="article-body__section" id="section-razer-soma-chroma-review-cheat-sheet"><span>Razer Soma Chroma review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>A mid-range gaming chair from Razer</li><li><strong>Who is it for? Gamers who want an RGB-clad chair</strong></li><li><strong>What does it cost?</strong> <a href="https://www.amazon.com/Razer-Chroma-Ergonomic-Reactive-Lighting/dp/B0H3XDND95/" target="_blank" rel="nofollow"><u>$499</u></a> / <a href="https://www.amazon.co.uk/Razer-Soma-Chroma-Built-Connection/dp/B0GX5QZ2TK" target="_blank" rel="nofollow"><u>£499</u></a></li><li><strong>What do we like? </strong>The comfy base and arm rests, premium build, attractive styling and ease of assembly</li><li><strong>What don’t we like? </strong>Virtually no lumbar support, no neck support, limited adjustability and an awful companion app</li></ul><h2 class="article-body__section" id="section-razer-soma-chroma-review-specs"><span>Razer Soma Chroma review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/Razer-Chroma-Ergonomic-Reactive-Lighting/dp/B0H3XDND95/" target="_blank" rel="nofollow"><u>$499</u></a> / <a href="https://www.amazon.co.uk/Razer-Soma-Chroma-Built-Connection/dp/B0GX5QZ2TK" target="_blank" rel="nofollow"><u>£499</u></a></p></td></tr><tr><td class="firstcol " ><p><strong>Maximum user height</strong></p></td><td  ><p>5.3-6.6 ft</p></td></tr><tr><td class="firstcol " ><p><strong>Maximum load</strong></p></td><td  ><p>331 lbs</p></td></tr><tr><td class="firstcol " ><p><strong>Seat height</strong></p></td><td  ><p>16-20 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Backrest height</strong></p></td><td  ><p>33 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Material</strong></p></td><td  ><p>Fabric (unspecified)</p></td></tr><tr><td class="firstcol " ><p><strong>Warranty</strong></p></td><td  ><p>3 years</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-razer-soma-chroma-review-the-ups"><span>Razer Soma Chroma review: The ups</span></h2><p>The Razer Soma Chroma has a few things in its favor, like premium build quality, a striking aesthetic, a comfy base and squidgy arm rests, plus a mostly cable-free design.</p><h2 id="premium-build">Premium build </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="5P4rzXDGgx8axhjcbznDTo" name="Razer_gamingchair_ 15.JPG" alt="The Razer Soma Chroma chair in an industrial setting head rest with the RGB on and the Razer logo showing, illuminated with a green glow" src="https://cdn.mos.cms.futurecdn.net/5P4rzXDGgx8axhjcbznDTo.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>There’s no denying the Soma Chroma is built well — unsurprising if you have any experience with Razer products. The fabric used is high quality and soft to the touch; there’s thick foam on the seat pad and arm rests; and there aren’t too many scratchy plastics (with the exception of the arm rest tubes. </p><p>The chair’s recline mechanism also operates with a very satisfying mechanical clunk — it feels like there’s some heavyweight machinery in there holding it together. It’s a far cry from the janky mechanism used on my <a href="https://www.tomsguide.com/home/home-office/boulies-ep460-review"><u>Boulies EP460</u></a>.</p><h2 id="easy-assembly">Easy assembly</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/4BL7SzUWji9ZfxXU8gFpVY.jpg" alt="The Razer Soma Chroma's components laid out on a concrete floor" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/NEhmYfwB3vB9LqVwFoj3PY.jpg" alt="The Razer Soma Chroma's instruction manual" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>The Soma Chroma was pretty easy to assemble. My team reviews lots of chairs, and I’m usually the one building them — even when my colleagues are the ones reviewing them (I guess that’s one disadvantage to being handy with a wrench).</p><p>The Soma Chroma was in the average difficulty range. It was nowhere near as simple to build as the <a href="https://www.tomsguide.com/home/home-office/boulies-op180-review"><u>Boulies OP180</u></a>, which only took me 10 minutes. There were also some heavier components, like the back rest, which may necessitate a second person to help. Other than that, it’s simply a case of putting the bolts where needed, all of which is detailed in the very thorough included instruction sheet. I built the Soma Chroma on my own in about half an hour. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ZD27FxbV4TQWCQBKQUhkLY" name="Razer Soma Chroma Build_1" alt="The Razer Soma Chroma's building gloves" src="https://cdn.mos.cms.futurecdn.net/ZD27FxbV4TQWCQBKQUhkLY.jpg" mos="" align="middle" fullscreen="" width="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 love that Razer supplies the Soma Chroma with a set of black gloves to  wear when building the chair. I've never seen that from other brands before, and it's a nice touch.</p><h2 id="dashing-design">Dashing design</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="T8QCq5RtAJUsoWoUPam7gn" name="Razer_gamingchair_.JPG" alt="The Razer Soma Chroma chair in an industrial setting, illuminated with a green glow and with a gaming setup in the background" src="https://cdn.mos.cms.futurecdn.net/T8QCq5RtAJUsoWoUPam7gn.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Soma Chroma looks rather fetching, too. It sports the typical streamlined gamer chair design — not a million miles away from the ubiquitous <a href="https://www.tomsguide.com/gaming/gaming-peripherals/secretlab-titan-evo-2022-review"><u>Secretlab Titan Evo</u></a>. A cutout near the neck and distinctive contouring on both the back rest and seat give it a sports-car-esque vibe. It looks straight out of an esports competition.</p><p>With the lighting disabled, The Soma Chroma boasts Razer’s usual sleek, blacked out aesthetic, with striking green accents. With the lighting turned on, it looks about as sophisticated as RGB lighting ever does. If you’re after that particular aesthetic, I’m sure you’ll think it looks great. It’s not for me, but that’s down to personal preference. And besides, Razer has applied the RGB fairly sparingly around the wings.</p><h2 id="comfy-base-and-arm-rests">Comfy base and arm rests</h2><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="dxbbgXU8sbtNfzaHPjAWVo" name="Razer_gamingchair_ 10.JPG" alt="The Razer Soma Chroma chair seat base, illuminated with a green glow" src="https://cdn.mos.cms.futurecdn.net/dxbbgXU8sbtNfzaHPjAWVo.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Sitting on the Soma Chroma for the first time, I was very pleasantly surprised at the seat base. I suffer from a type of immuno-arthritis that affects, among other areas, my coccyx. In short, butt comfiness is high on my agenda. </p><p>With other foam-cushioned chairs I’ve used, like the <a href="https://www.tomsguide.com/home/home-office/autonomous-ergochair-pro-review"><u>Autonomous ErgoChair Pro</u></a>, seat pad foam usually compresses, applying too much pressure up into my lower back — I often have to use a special coccyx relief cushion with a cutout to relieve coccyx pressure. It’s for this reason I usually choose full mesh chairs like the Boulies EP460, as mesh seat pads provide the best butt support.</p><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="sDdosCcQuscG26sXxUsppn" name="Razer_gamingchair_ 3.JPG" alt="The Razer Soma Chroma chair's armrests, illuminated with a green glow" src="https://cdn.mos.cms.futurecdn.net/sDdosCcQuscG26sXxUsppn.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Soma Chroma, though, has probably the comfiest foam base I’ve sat on. The foam is super thick and very squishy. I haven’t had to use my coccyx cushion at all. Also impressively squishy are the arm rests. So often, manufacturers leave arm rests hard and uncomfortable, causing elbow pain. Not so here. The Soma Chroma has about an inch of foam padding on each rest.</p><p>Overall, even after longer gaming/work stints of 8 hours, I’ve had no butt and no elbow pain. Unfortunately, as I’ll cover later, I had other types of pain from the lack of back and neck support.</p><h2 id="not-fully-wireless-but-tidy">Not fully wireless, but tidy</h2><p>If you choose to use its lighting, the Soma Chroma needs to be powered via USB-C as there’s no built-in battery. You can either plug it into a wall socket or your PC, or use one of the <a href="https://www.tomsguide.com/best-picks/best-portable-chargers"><u>best power banks</u></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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="q3muaNAyZUSzcNCin3YKwn" name="Razer_gamingchair_ 6.JPG" alt="The Razer Soma Chroma chair with a power bank in its back pocket and plugged into its USB-C cable" src="https://cdn.mos.cms.futurecdn.net/q3muaNAyZUSzcNCin3YKwn.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The latter is the tidiest method — there’s a zip pocket at the back of the base, which will fit a small-ish power bank like my <a href="https://www.amazon.com/INIU-Portable-10000mAh-Essentials-Powerbank/dp/B0FC6D44MT"><u>Iniu Ultra Mini</u></a> ($31). That means no power banks dangling down or cables getting snagged in the wheels as you move the chair.</p><p>The RGB lights aren’t too power hungry either. We ran the RGB for 2-3 hours on our product photoshoot and the charge on my 10,000mAh Iniu only dropped by 1%.</p><p>Once powered, the Soma Chroma <em>does</em> have wireless connectivity. It comes with a USB-A Wi-Fi dongle, so you can hook the chair up to your PC and control the RGB via Razer Synapse. There are controls on the chair itself, but these are a little clunky unless you keep the instructions with you. I’m not at all keen on Synapse either, which I’ll get onto below.</p><h2 class="article-body__section" id="section-razer-soma-chroma-review-the-downs"><span>Razer Soma Chroma review: The downs</span></h2><p>Unfortunately, without buying further accessories, the Soma Chroma is downright uncomfortable thanks to no neck support, minimal lumbar support, no included support accessories and limited adjustment. Then there’s Synapse…</p><h2 id="poor-neck-and-lumbar-support">Poor neck and lumbar support</h2><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="DMZ3G8X4QGvFWzNXvd7xUo" name="Razer_gamingchair_ 12.JPG" alt="The Razer Soma Chroma back rest padding and lumbar curve, illuminated with a green glow" src="https://cdn.mos.cms.futurecdn.net/DMZ3G8X4QGvFWzNXvd7xUo.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Razer claims the Soma Chroma has lumbar support. What it really means is that the Soma Chroma has a slight arch in the backrest. It provides about as much lumbar support as propping one’s self up against a plank of wood. There’s also no neck rest, and no additional neck cushion included — if you want one of those, you’ll need to pay an extra $50. </p><p>After my first testing session — about four hours of gaming — I started noticing a slight pain in my neck and upper shoulders. On day two, after another eight hours, I was experiencing full blown neck pain on both sides, up into the back of my head.</p><p>As I mentioned earlier, I have a form of immuno-arthritis, and there’s no way in hell I’d sit in this chair on a daily basis, at least not without some neck support. I have pretty good sitting posture (I have to make sure of it) but without anything to support your neck, it’s very hard to achieve that.</p><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="NupqQyh7cY8ASG52FDFWJo" name="Razer_gamingchair_ 13.JPG" alt="The Razer Soma Chroma headrest, with the RGB on, Razer logo showing and illuminated with a green glow" src="https://cdn.mos.cms.futurecdn.net/NupqQyh7cY8ASG52FDFWJo.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Admittedly, the Soma Chroma isn’t alone here. If you know anything about computing chairs, you’ll know that gaming chairs are usually designed for style over comfort. Most of them use the same flat back shaping, like the Secretlab Titan Evo and <a href="https://www.tomsguide.com/gaming/gaming-peripherals/dxracer-craft-review"><u>DXRacer Craft</u></a>, for instance — the thing is, those two chairs at least come with a neck pillow for support.</p><p>If you want proper support, though, you’re better off looking at the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-iskur-v2-newgen-review"><u>Razer Iskur V2 NewGen</u></a>, with its much better (i.e. existent) lumbar support and neck pillow. Or, a hybrid mesh chair like the <a href="https://www.tomsguide.com/home/home-office/herman-miller-x-logitech-g-vantum-gaming-chair-review"><u>Herman Miller Vantum</u></a>. Or consider an office chair as, believe it or not, gaming chairs are mostly marketing. You can game just fine and much more comfortably in a mid-range mesh office chair like my Boulies EP460.</p><h2 id="limited-adjustability">Limited adjustability</h2><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="AKuemiFQiNVu8cfge6nzNo" name="Razer_gamingchair_ 5.JPG" alt="The Razer Soma Chroma chair's recline mechanism." src="https://cdn.mos.cms.futurecdn.net/AKuemiFQiNVu8cfge6nzNo.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>On top of the discomfort, the Soma Chroma offers very limited adjustability. You can do the bare minimum: recline, seat height, arm rest height and swivel. But there’s no way to slide the seat forward or back; no forward or backward arm rest sliders, and no lumbar adjustment.</p><p>You <em>can</em> set the chair into a free recline mode, but the mechanism was so stiff on my chair that I had to push off from a wall to get it to actually recline.</p><p>The Soma Chroma is also a little low, with the seat height maxing out at 16-20 inches. My Boulies EP460 maxes out at 23 inches, for comparison. A taller maximum seat height is more comfortable for those with long legs.</p><h2 id="synapse-really-really-sucks">Synapse really, really sucks</h2><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="f9xSiLKC4VNRjhxjkLCDTo" name="Razer_gamingchair_ 8.JPG" alt="The Razer Soma Chroma chair top controls, illuminated by a green glow" src="https://cdn.mos.cms.futurecdn.net/f9xSiLKC4VNRjhxjkLCDTo.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Razer’s Synapse software is one of two ways to control the Soma Chroma’s RGB, in addition to the onboard button controls, which are a little basic. Given the RGB is such a major feature of the chair, Synapse is therefore a pretty important element. </p><p>Now, I’ve used Synapse before, so my expectations were tempered. But man oh man, I’d forgotten quite how much Synapse sucks — like, more than any other mainstream companion software I’ve ever used after testing and using dozens of peripherals. I’d honestly prefer Asus’ Armoury Crate, which is seriously saying something.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/gZPtVosuGphsNEK73352ph.jpg" alt="A screenshot of the Razer Synapse app being used to customize the Razer Soma Chroma" /><figcaption><small role="credit">Razer / Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/VFkeCdp2orV3TobZmSE839.jpg" alt="A screenshot of the Razer Synapse app being used to customize the Razer Soma Chroma" /><figcaption>As you can see in the pink highlighted area (top left), the Soma Chroma was often simply not recognized by Synapse, forcing me to remove the USB dongle and plug it back in each time I rebooted.<small role="credit">Razer / Future</small></figcaption></figure></figure><p>Firstly, Synapse is incredibly annoying to set up: you have to download the installer; then download Synapse (fighting off the extra bloatware it tries to download at the same time); then install Synapse; then fire up the installed app… and then <em>download Synapse again</em>. Like, what? I can’t even. It’s so needlessly complicated. It also kept failing to install, getting stuck at 45% three times, though that could’ve been a Windows issue.</p><p>When you <em>do</em> get Synapse installed, it’s slow, laggy and often takes ages to recognize the chair after booting up your PC, if it even manages to at all. Every time I rebooted, I had to un/re-plug the Soma Chroma’s 2.4G wireless dongle from/into my PC, otherwise Synapse wouldn’t recognize the chair.</p><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="JQEfnP8sNqQUYeobpq7xDo" name="Razer_gamingchair_ 9.JPG" alt="The Razer Soma Chroma chair's 2.4G dongle, sitting on its side on the chair's arm rest." src="https://cdn.mos.cms.futurecdn.net/JQEfnP8sNqQUYeobpq7xDo.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The changes I made in Synapse regularly failed to apply, despite the app saying they did — I switched the lighting to static purple, which it changed to for around 30 seconds before defaulting back to unicorn puke RGB. And to top it all off, the moment you close the Synapse app, the lighting switches back to the default rainbow effect anyway. That means you have to keep that crappy piece of bloatware running while you game, if you want RGB. </p><p>Oh, and if you want any advanced effects you then have to download Razer’s Chroma RGB controller anyway. Eurgh. It’s not worth dealing with such terrible software for a couple of measly RGB strips on a mostly uncomfortable chair.</p><h2 class="article-body__section" id="section-razer-soma-chroma-review-verdict"><span>Razer Soma Chroma review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cZ8rL5Xh6EYHoftrFjGdSn" name="Razer_gamingchair_ 7.JPG" alt="The Razer Soma Chroma chair back, illuminated with a green glow" src="https://cdn.mos.cms.futurecdn.net/cZ8rL5Xh6EYHoftrFjGdSn.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I’m pretty disappointed by the Soma Chroma. I’ve awarded credit for its premium design, comfy base and arm rests, and its ease of assembly. Unfortunately, my three pros up top are tempered by four pretty major cons, so half marks for this chair is arguably even a little generous. </p><p>The Soma Chroma is really rather uncomfortable thanks to its lack of a neck cushion and only a semblance of lumbar support. Meanwhile, the adjustability is pretty scant and the companion software, Synapse, is nothing short of terrible.</p><p>So why bother? Just buy a Secretlab Titan Evo and be slightly less uncomfortable. Or do it properly and buy an ergonomic <a href="https://www.tomsguide.com/home/home-office/best-office-chairs"><u>office chair</u></a> (guess what: you <em>can</em> game in one of those). Before long, your neck will thank you.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I finally found a mobile game controller that’s as comfortable as the PlayStation Portal — and it actually feels like a real gamepad ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Despite being remote play only, the <a href="https://www.tomsguide.com/opinion/i-thought-playstation-portal-was-pointless-heres-why-i-was-wrong">PlayStation Portal</a> ended up being a surprise hit thanks to how convenient it was to use and how comfortable it was to hold. As someone who’s tried over half a dozen of the <a href="https://www.tomsguide.com/best-picks/best-mobile-game-controllers">best mobile game controllers</a> — from the <a href="https://www.tomsguide.com/reviews/razer-kishi-v2-review-making-the-best-even-better">Razer Kishi</a> to the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-tried-the-new-backbone-pro-controller-and-the-feature-ive-always-wanted-wasnt-the-most-surprising">Backbone Pro</a> — I can definitely see why. But what if PlayStation isn’t your platform of choice?</p><p>Instead of reinventing the wheel with the PlayStation Portal, Sony essentially cut its DualSense controller in half and put an 8-inch screen in the middle. This way, you got the same larger handles PS5 players were already used to without having to adapt to something smaller and ultimately less comfortable.</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/9bVa9eeI1yo" allowfullscreen></iframe></div></div><p>While portability heavily influenced the design of the first crop of mobile game controllers, companies quickly realized that comfort trumps compactness. This is why the <a href="https://www.tomsguide.com/gaming/i-built-the-ultimate-remote-play-setup-with-wi-fi-7-to-say-goodbye-to-stuttery-gameplay-for-good-heres-how">Razer Kishi Ultra</a> has full-sized buttons and longer handles, and you could say the exact same thing about Asus’ upcoming <a href="https://www.tomsguide.com/gaming/handheld-gaming/asus-rog-xbox-ally-x20-hands-on-review">ROG Xbox Ally X20</a> too.</p><p>Just when I thought I was done testing out mobile game controllers, I finally found one that gives me that PlayStation Portal feel — but with all my favorite pro controller-style features packed in too. Meet the Elo Vagabond.</p><div class="product"><a data-dimension112="4e228c96-9291-11f1-a50e-a9418ed0c36f" data-action="Deal Block" data-label="Vagabond" data-dimension48="Vagabond" data-dimension25="$99" href="https://www.amazon.com/dp/B0DBQBP3D5" 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="zMzWdTaaMkLPgxVovYGw5N" name="Vagabond" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/zMzWdTaaMkLPgxVovYGw5N.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/dp/B0DBQBP3D5" target="_blank" rel="nofollow" data-dimension112="4e228c96-9291-11f1-a50e-a9418ed0c36f" data-action="Deal Block" data-label="Vagabond" data-dimension48="Vagabond" data-dimension25="$99">Vagabond: $99</a></strong><br>This mobile game controller brings full-sized console ergonomics to your smartphone. Featuring swept-back handles, microswitch buttons, and anti-drift Hall Effect thumbsticks, it fixes the cramped hand fatigue common on flatter mobile grips. With pass-through USB-C charging, a 3.5mm headphone jack, and support for phones up to mini tablets, it turns your mobile device into a true handheld console. <br><br><strong>Price check: </strong><a href="https://eloesports.com/products/elo-vagabond-mobile-gaming-controller" target="_blank" rel="nofollow"><strong>$99 @ Elo</strong></a><a class="view-deal button" href="https://www.amazon.com/dp/B0DBQBP3D5" target="_blank" rel="nofollow" data-dimension112="4e228c96-9291-11f1-a50e-a9418ed0c36f" data-action="Deal Block" data-label="Vagabond" data-dimension48="Vagabond" data-dimension25="$99">View Deal</a></p></div><h2 id="pro-controller-meets-mobile">Pro controller meets mobile</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LZwUXsrQgEd2pgVJYXMwZU" name="Elo Vagabond-9" alt="The Elo Vagabond mobile game controller unboxed on a table" src="https://cdn.mos.cms.futurecdn.net/LZwUXsrQgEd2pgVJYXMwZU.jpg" mos="" align="middle" fullscreen="" width="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>After reaching out to Elo about testing the Vagabond, the company sent over the controller along with its full lineup of accessories. Right out of the box, I was impressed by how many rubber inserts Elo includes. While Razer typically gives you three pairs, I found six pairs packaged alongside the controller.</p><p>The Vagabond is built for the long haul, with tactile microswitch buttons instead of standard membrane ones, plus magnetic <a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-gave-this-pro-controller-the-ultimate-upgrade-to-beat-stick-drift-and-it-only-took-5-minutes">Hall Effect joysticks</a> to combat stick drift. There’s a dedicated purple capture button sitting next to ABXY, and the joysticks feature purple anti-friction rings around their bases. Once plugged into your phone, they also give off a subtle purple RGB glow by default.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="SZhmiZGjnZHovfMv3KwAGa" name="Elo Vagabond-7" alt="The backside of the Elo Vagabond mobile game controller showing off its remappable back buttons and the textured grips on its handles" src="https://cdn.mos.cms.futurecdn.net/SZhmiZGjnZHovfMv3KwAGa.jpg" mos="" align="middle" fullscreen="" width="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 customizable rear buttons — something I <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">love to see on any controller</a>, as mapping them to my most-used face buttons gives my right thumb a much-needed rest. However, if you’re the type of gamer who never uses back paddles, there are dedicated toggle switches on either side to physically disable them. Even though I would have preferred true rubberized grips, the micro-textured, cross-hatched pattern molded directly into the back of the handles makes the Vagabond exceptionally easy to hold onto. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="snuHLiygGwz8i5rhUSLa9f" name="Elo Vagabond-8" alt="A close-up shot showing the Elo Vagabond's main USB-C connector and its USB-C port for passthrough charging" src="https://cdn.mos.cms.futurecdn.net/snuHLiygGwz8i5rhUSLa9f.jpg" mos="" align="middle" fullscreen="" width="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 connecting your smartphone, the Vagabond features a flexible USB-C connector that tilts up and down, making it far easier to dock and undock your phone without worrying about damaging its charging port. While many other mobile controllers have a headphone jack on one handle and a USB-C passthrough charging port on the other, I really like that Elo placed both ports right along the center bridge. This keeps the handles clean and comfortable in your hands while protecting both 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="E6pr2CC5JQVpdDjeii96xm" name="Elo Vagabond-6" alt="A person showing off the hidden storage compartment inside the case for the Elo Vagabond mobile game controller" src="https://cdn.mos.cms.futurecdn.net/E6pr2CC5JQVpdDjeii96xm.jpg" mos="" align="middle" fullscreen="" width="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>Elo also sent over its official hard carrying case. Though I would have preferred to see it bundled in the box, the case is exceptionally well-built and worth the extra investment to protect your setup on the go. Underneath where the controller rests, there's a clever storage compartment designed to hold accessories like those extra rubber adapters — a massive plus if you swap devices or cases often.</p><p>Alternatively, you could easily use that space to store a pair of wired earbuds or a short charging cable. Unfortunately, I found the compartment was just a bit too tight to comfortably hold <a href="https://www.tomsguide.com/computing/software/i-tested-all-my-usb-c-cables-with-this-free-mac-app-instead-of-guessing-each-time-i-plugged-one-in">Elo’s 240W Link USB-C to USB-C cable</a>. Still, having built-in accessory storage is a huge win for a mobile controller built for travel.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-O92xyX"></div>                            </div>                            <script src="https://kwizly.com/embed/O92xyX.js" async></script><h2 id="console-quality-controls-on-the-go">Console-quality controls on the 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="fhdwzmELu7HHHrHZK3j6Z4" name="Elo Vagabond-5" alt="The Elo Vagabond mobile game controller with a phone inside running the Elo Unleashed app" src="https://cdn.mos.cms.futurecdn.net/fhdwzmELu7HHHrHZK3j6Z4.jpg" mos="" align="middle" fullscreen="" width="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 Elo Vagabond, I first plugged in a Galaxy S24 FE smartphone. Much to my surprise, I didn’t even have to take off its case. This is a massive selling point, as the Vagabond works with everyday phone cases right out of the box without requiring you to slice away rubber or physically modify the controller — something I've had to do with both the original Razer Kishi and older GameSir models in the past.</p><p>Eager to start customizing those rear inputs, I downloaded the free <a href="https://eloesports.com/pages/elo-unleashed" target="_blank">Elo Unleashed</a> companion app. While most mobile controllers come with an app these days, I found Elo’s interface to be remarkably clean and intuitive. Better yet, unlike Backbone’s companion software, none of the Vagabond's advanced features are locked behind a paid subscription. With a few quick taps, I mapped the right rear button to A and the left to X — my go-to layout when playing the skateboarding sim Session.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DXmBA6ExTbVH8nZATvDiu8" name="Elo Vagabond-2" alt="A person playing Ratchet & Clank: Rift Apart remotely on the Elo Vagabond mobile game controller" src="https://cdn.mos.cms.futurecdn.net/DXmBA6ExTbVH8nZATvDiu8.jpg" mos="" align="middle" fullscreen="" width="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 native console ports are still relatively rare on Android compared to iOS, I primarily used the Vagabond for remote play to stream my Steam library around the house. Even during multi-hour sessions, the ergonomic handles kept my hands entirely cramp-free.</p><p>That comfort was especially noticeable while playing Session, where you rely heavily on the triggers to steer your skateboard and rotate mid-air. The Vagabond features full-travel, analog-style Hall Effect triggers rather than the shallow, digital on/off switches found on cheaper mobile game controllers. That extra control depth is equally vital for feathering the gas in racing games or metering aim in shooters. Speaking of which, I also put in some time with Ratchet & Clank: Rift Apart, and blasting through waves of evil robots felt fantastic on these sticks and triggers.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bpoSHYnVoDzaNACKxa4riD" name="Elo Vagabond-4" alt="A person sitting on the couch playing Death Stranding 2 remotely using the Elo Vagabond mobile game controller" src="https://cdn.mos.cms.futurecdn.net/bpoSHYnVoDzaNACKxa4riD.jpg" mos="" align="middle" fullscreen="" width="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>My longest play sessions came while cozied up on the couch making deliveries in <a href="https://www.tomsguide.com/gaming/playstation/death-stranding-2-is-a-surprisingly-great-starting-place-for-new-players-heres-how-it-hooked-me-after-i-dropped-the-original">Death Stranding 2</a>. Whether traveling on foot and using the triggers to balance heavy cargo or zipping across the terrain in a vehicle, the Vagabond delivered a superb remote play experience as I worked to connect the continent of Australia while dodging BTs.</p><p>At just $99, I’ve been quite impressed with the Elo Vagabond so far. Unfortunately though, there was one device I didn’t get to test it with.</p><h2 id="phone-only-for-now">Phone only (for now)</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8fshS42TmUrasyRBn3XsQH" name="Elo Vagabond-3" alt="A person sitting on the couch playing games using the Elo Vagabond mobile game controller" src="https://cdn.mos.cms.futurecdn.net/8fshS42TmUrasyRBn3XsQH.jpg" mos="" align="middle" fullscreen="" width="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 massive slates to foldables, the Vagabond works with all of the <a href="https://www.tomsguide.com/best-picks/best-phones">best phones</a>. In fact, the controller extends far enough to support devices just over 8 inches long — meaning you can also clamp in an iPad mini to get a big-screen remote play experience that rivals the PlayStation Portal. There was just one problem: I didn’t have an iPad mini on hand to test it out.</p><p>Last year, I <a href="https://www.tomsguide.com/tablets/i-spent-two-weeks-with-the-ipad-mini-7-and-it-reignited-my-love-for-smaller-tablets">borrowed an iPad mini</a> from work for a story, and it reignited my love for small tablets — a passion I've had since the days of the Nexus 7. I generally prefer Android over iOS, so when Lenovo unveiled its 8.8-inch <a href="https://www.tomsguide.com/computing/tablets/i-thought-the-ipad-mini-was-the-perfect-small-tablet-until-i-tried-the-lenovo-legion-tab-3-heres-why">Legion Tab Gen 3</a> with Wi-Fi 7 support for a better remote play experience, I bought one with my own money. However, while the Vagabond stretches up to 8.03 inches to accommodate Apple’s iPad mini, the Legion Tab Gen 3 is slightly too long at 8.2 inches. The same held true for the RedMagic Astra 2 gaming tablet I’m currently reviewing.</p><p>I was hoping to pick up a discounted iPad mini specifically to use with the Vagabond, but thanks to <a href="https://www.tomsguide.com/computing/ram-price-crisis-2026-everything-you-need-to-know">RAMaggedon</a>, finding one anywhere under $500 has proven tough. Who knows — maybe I’ll grab an iPad mini 7 once Apple’s long-rumored <a href="https://www.tomsguide.com/computing/ipads/first-oled-ipad-mini-tipped-for-october-launch-heres-why-im-excited-and-worried">OLED iPad mini</a> finally hits store shelves.</p><p>For now, though, I’m more than content streaming my favorite Steam games on the Vagabond using my phone or the <a href="https://www.tomsguide.com/opinion/i-used-the-razer-edge-5g-as-my-main-game-console-for-a-week-heres-what-happened">Razer Edge 5G</a>, which gets you pretty close to that mini-tablet experience anyway. If you’ve tried the Backbone or the standard Razer Kishi and found them uncomfortable over long play sessions, the Elo Vagabond just might surprise you the same way it did me.</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-tried-the-sonic-the-hedgehog-office-chair-and-it-actually-makes-ergonomics-fun-and-fast"><strong>I tried the Sonic the Hedgehog office chair — and it actually makes ergonomics fun (and fast)</strong></a></li><li><a href="https://www.tomsguide.com/gaming/handheld-gaming/i-tested-the-worlds-first-mobile-game-controller-with-ar-glasses-support-and-it-completely-transformed-my-16-hour-flight"><strong>I used the world's first mobile game controller with AR glasses support — and it completely transformed my 16-hour flight</strong></a></li><li><a href="https://www.tomsguide.com/computing/desktop-computers/mini-pcs/minisforum-g1-pro-review"><strong>I tested the Minisforum G1 Pro and this console-sized mini PC works just as well in the living room as it does at your desk</strong></a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/i-finally-found-a-mobile-game-controller-thats-as-comfortable-as-the-playstation-portal-and-it-actually-feels-like-a-real-gamepad</link>
                                                                            <description>
                            <![CDATA[ The Elo Vagabond takes the comfort of the PlayStation Portal and adds pro controller-style features for an exceptional mobile game controller. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">hgB7RcRQp34W3EBWCZZtEe</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/rHdfPYuxbFXziLwuM2ee8R-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 09 Aug 2026 12:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gaming Peripherals]]></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;Before joining the team, he spent three years covering cybersecurity and B2B tech for ITProPortal while living in South Korea. After moving back to the US. Anthony joined the TechRadar Pro team where he covered these topics along with VPNs, web hosting, online collaboration software and video conferencing for four years. Anthony also has his ears to the ground and is on the lookout for the next major cyberattack or data breach.&lt;/p&gt;&lt;p&gt;Based in Houston, Texas, Anthony also handles VPN testing for both Tom’s Guide and TechRadar. As someone who has worked from home exclusively since 2018, he has reviewed dozens of standing desks as well as office chairs and has taken a closer look at other essential remote working accessories. As part of these reviews, Anthony frequently builds intricate desk setups which is why he’s such a big advocate for cable management and keeping things organized. When he’s not writing, he can be found tinkering with PCs and game consoles, managing cables and making upgrades to his smart home.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/rHdfPYuxbFXziLwuM2ee8R-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A person holding up the Elo Vagabond mobile game controller while accessing their Steam library using the Steam Link app]]></media:description>                                                            <media:text><![CDATA[A person holding up the Elo Vagabond mobile game controller while accessing their Steam library using the Steam Link app]]></media:text>
                                <media:title type="plain"><![CDATA[A person holding up the Elo Vagabond mobile game controller while accessing their Steam library using the Steam Link app]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/rHdfPYuxbFXziLwuM2ee8R-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Despite being remote play only, the <a href="https://www.tomsguide.com/opinion/i-thought-playstation-portal-was-pointless-heres-why-i-was-wrong">PlayStation Portal</a> ended up being a surprise hit thanks to how convenient it was to use and how comfortable it was to hold. As someone who’s tried over half a dozen of the <a href="https://www.tomsguide.com/best-picks/best-mobile-game-controllers">best mobile game controllers</a> — from the <a href="https://www.tomsguide.com/reviews/razer-kishi-v2-review-making-the-best-even-better">Razer Kishi</a> to the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-tried-the-new-backbone-pro-controller-and-the-feature-ive-always-wanted-wasnt-the-most-surprising">Backbone Pro</a> — I can definitely see why. But what if PlayStation isn’t your platform of choice?</p><p>Instead of reinventing the wheel with the PlayStation Portal, Sony essentially cut its DualSense controller in half and put an 8-inch screen in the middle. This way, you got the same larger handles PS5 players were already used to without having to adapt to something smaller and ultimately less comfortable.</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/9bVa9eeI1yo" allowfullscreen></iframe></div></div><p>While portability heavily influenced the design of the first crop of mobile game controllers, companies quickly realized that comfort trumps compactness. This is why the <a href="https://www.tomsguide.com/gaming/i-built-the-ultimate-remote-play-setup-with-wi-fi-7-to-say-goodbye-to-stuttery-gameplay-for-good-heres-how">Razer Kishi Ultra</a> has full-sized buttons and longer handles, and you could say the exact same thing about Asus’ upcoming <a href="https://www.tomsguide.com/gaming/handheld-gaming/asus-rog-xbox-ally-x20-hands-on-review">ROG Xbox Ally X20</a> too.</p><p>Just when I thought I was done testing out mobile game controllers, I finally found one that gives me that PlayStation Portal feel — but with all my favorite pro controller-style features packed in too. Meet the Elo Vagabond.</p><div class="product"><a data-dimension112="4e228c96-9291-11f1-a50e-a9418ed0c36f" data-action="Deal Block" data-label="Vagabond" data-dimension48="Vagabond" data-dimension25="$99" href="https://www.amazon.com/dp/B0DBQBP3D5" 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="zMzWdTaaMkLPgxVovYGw5N" name="Vagabond" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/zMzWdTaaMkLPgxVovYGw5N.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/dp/B0DBQBP3D5" target="_blank" rel="nofollow" data-dimension112="4e228c96-9291-11f1-a50e-a9418ed0c36f" data-action="Deal Block" data-label="Vagabond" data-dimension48="Vagabond" data-dimension25="$99">Vagabond: $99</a></strong><br>This mobile game controller brings full-sized console ergonomics to your smartphone. Featuring swept-back handles, microswitch buttons, and anti-drift Hall Effect thumbsticks, it fixes the cramped hand fatigue common on flatter mobile grips. With pass-through USB-C charging, a 3.5mm headphone jack, and support for phones up to mini tablets, it turns your mobile device into a true handheld console. <br><br><strong>Price check: </strong><a href="https://eloesports.com/products/elo-vagabond-mobile-gaming-controller" target="_blank" rel="nofollow"><strong>$99 @ Elo</strong></a><a class="view-deal button" href="https://www.amazon.com/dp/B0DBQBP3D5" target="_blank" rel="nofollow" data-dimension112="4e228c96-9291-11f1-a50e-a9418ed0c36f" data-action="Deal Block" data-label="Vagabond" data-dimension48="Vagabond" data-dimension25="$99">View Deal</a></p></div><h2 id="pro-controller-meets-mobile">Pro controller meets mobile</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LZwUXsrQgEd2pgVJYXMwZU" name="Elo Vagabond-9" alt="The Elo Vagabond mobile game controller unboxed on a table" src="https://cdn.mos.cms.futurecdn.net/LZwUXsrQgEd2pgVJYXMwZU.jpg" mos="" align="middle" fullscreen="" width="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>After reaching out to Elo about testing the Vagabond, the company sent over the controller along with its full lineup of accessories. Right out of the box, I was impressed by how many rubber inserts Elo includes. While Razer typically gives you three pairs, I found six pairs packaged alongside the controller.</p><p>The Vagabond is built for the long haul, with tactile microswitch buttons instead of standard membrane ones, plus magnetic <a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-gave-this-pro-controller-the-ultimate-upgrade-to-beat-stick-drift-and-it-only-took-5-minutes">Hall Effect joysticks</a> to combat stick drift. There’s a dedicated purple capture button sitting next to ABXY, and the joysticks feature purple anti-friction rings around their bases. Once plugged into your phone, they also give off a subtle purple RGB glow by default.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="SZhmiZGjnZHovfMv3KwAGa" name="Elo Vagabond-7" alt="The backside of the Elo Vagabond mobile game controller showing off its remappable back buttons and the textured grips on its handles" src="https://cdn.mos.cms.futurecdn.net/SZhmiZGjnZHovfMv3KwAGa.jpg" mos="" align="middle" fullscreen="" width="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 customizable rear buttons — something I <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">love to see on any controller</a>, as mapping them to my most-used face buttons gives my right thumb a much-needed rest. However, if you’re the type of gamer who never uses back paddles, there are dedicated toggle switches on either side to physically disable them. Even though I would have preferred true rubberized grips, the micro-textured, cross-hatched pattern molded directly into the back of the handles makes the Vagabond exceptionally easy to hold onto. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="snuHLiygGwz8i5rhUSLa9f" name="Elo Vagabond-8" alt="A close-up shot showing the Elo Vagabond's main USB-C connector and its USB-C port for passthrough charging" src="https://cdn.mos.cms.futurecdn.net/snuHLiygGwz8i5rhUSLa9f.jpg" mos="" align="middle" fullscreen="" width="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 connecting your smartphone, the Vagabond features a flexible USB-C connector that tilts up and down, making it far easier to dock and undock your phone without worrying about damaging its charging port. While many other mobile controllers have a headphone jack on one handle and a USB-C passthrough charging port on the other, I really like that Elo placed both ports right along the center bridge. This keeps the handles clean and comfortable in your hands while protecting both 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="E6pr2CC5JQVpdDjeii96xm" name="Elo Vagabond-6" alt="A person showing off the hidden storage compartment inside the case for the Elo Vagabond mobile game controller" src="https://cdn.mos.cms.futurecdn.net/E6pr2CC5JQVpdDjeii96xm.jpg" mos="" align="middle" fullscreen="" width="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>Elo also sent over its official hard carrying case. Though I would have preferred to see it bundled in the box, the case is exceptionally well-built and worth the extra investment to protect your setup on the go. Underneath where the controller rests, there's a clever storage compartment designed to hold accessories like those extra rubber adapters — a massive plus if you swap devices or cases often.</p><p>Alternatively, you could easily use that space to store a pair of wired earbuds or a short charging cable. Unfortunately, I found the compartment was just a bit too tight to comfortably hold <a href="https://www.tomsguide.com/computing/software/i-tested-all-my-usb-c-cables-with-this-free-mac-app-instead-of-guessing-each-time-i-plugged-one-in">Elo’s 240W Link USB-C to USB-C cable</a>. Still, having built-in accessory storage is a huge win for a mobile controller built for travel.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-O92xyX"></div>                            </div>                            <script src="https://kwizly.com/embed/O92xyX.js" async></script><h2 id="console-quality-controls-on-the-go">Console-quality controls on the 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="fhdwzmELu7HHHrHZK3j6Z4" name="Elo Vagabond-5" alt="The Elo Vagabond mobile game controller with a phone inside running the Elo Unleashed app" src="https://cdn.mos.cms.futurecdn.net/fhdwzmELu7HHHrHZK3j6Z4.jpg" mos="" align="middle" fullscreen="" width="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 Elo Vagabond, I first plugged in a Galaxy S24 FE smartphone. Much to my surprise, I didn’t even have to take off its case. This is a massive selling point, as the Vagabond works with everyday phone cases right out of the box without requiring you to slice away rubber or physically modify the controller — something I've had to do with both the original Razer Kishi and older GameSir models in the past.</p><p>Eager to start customizing those rear inputs, I downloaded the free <a href="https://eloesports.com/pages/elo-unleashed" target="_blank">Elo Unleashed</a> companion app. While most mobile controllers come with an app these days, I found Elo’s interface to be remarkably clean and intuitive. Better yet, unlike Backbone’s companion software, none of the Vagabond's advanced features are locked behind a paid subscription. With a few quick taps, I mapped the right rear button to A and the left to X — my go-to layout when playing the skateboarding sim Session.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DXmBA6ExTbVH8nZATvDiu8" name="Elo Vagabond-2" alt="A person playing Ratchet & Clank: Rift Apart remotely on the Elo Vagabond mobile game controller" src="https://cdn.mos.cms.futurecdn.net/DXmBA6ExTbVH8nZATvDiu8.jpg" mos="" align="middle" fullscreen="" width="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 native console ports are still relatively rare on Android compared to iOS, I primarily used the Vagabond for remote play to stream my Steam library around the house. Even during multi-hour sessions, the ergonomic handles kept my hands entirely cramp-free.</p><p>That comfort was especially noticeable while playing Session, where you rely heavily on the triggers to steer your skateboard and rotate mid-air. The Vagabond features full-travel, analog-style Hall Effect triggers rather than the shallow, digital on/off switches found on cheaper mobile game controllers. That extra control depth is equally vital for feathering the gas in racing games or metering aim in shooters. Speaking of which, I also put in some time with Ratchet & Clank: Rift Apart, and blasting through waves of evil robots felt fantastic on these sticks and triggers.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bpoSHYnVoDzaNACKxa4riD" name="Elo Vagabond-4" alt="A person sitting on the couch playing Death Stranding 2 remotely using the Elo Vagabond mobile game controller" src="https://cdn.mos.cms.futurecdn.net/bpoSHYnVoDzaNACKxa4riD.jpg" mos="" align="middle" fullscreen="" width="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>My longest play sessions came while cozied up on the couch making deliveries in <a href="https://www.tomsguide.com/gaming/playstation/death-stranding-2-is-a-surprisingly-great-starting-place-for-new-players-heres-how-it-hooked-me-after-i-dropped-the-original">Death Stranding 2</a>. Whether traveling on foot and using the triggers to balance heavy cargo or zipping across the terrain in a vehicle, the Vagabond delivered a superb remote play experience as I worked to connect the continent of Australia while dodging BTs.</p><p>At just $99, I’ve been quite impressed with the Elo Vagabond so far. Unfortunately though, there was one device I didn’t get to test it with.</p><h2 id="phone-only-for-now">Phone only (for now)</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8fshS42TmUrasyRBn3XsQH" name="Elo Vagabond-3" alt="A person sitting on the couch playing games using the Elo Vagabond mobile game controller" src="https://cdn.mos.cms.futurecdn.net/8fshS42TmUrasyRBn3XsQH.jpg" mos="" align="middle" fullscreen="" width="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 massive slates to foldables, the Vagabond works with all of the <a href="https://www.tomsguide.com/best-picks/best-phones">best phones</a>. In fact, the controller extends far enough to support devices just over 8 inches long — meaning you can also clamp in an iPad mini to get a big-screen remote play experience that rivals the PlayStation Portal. There was just one problem: I didn’t have an iPad mini on hand to test it out.</p><p>Last year, I <a href="https://www.tomsguide.com/tablets/i-spent-two-weeks-with-the-ipad-mini-7-and-it-reignited-my-love-for-smaller-tablets">borrowed an iPad mini</a> from work for a story, and it reignited my love for small tablets — a passion I've had since the days of the Nexus 7. I generally prefer Android over iOS, so when Lenovo unveiled its 8.8-inch <a href="https://www.tomsguide.com/computing/tablets/i-thought-the-ipad-mini-was-the-perfect-small-tablet-until-i-tried-the-lenovo-legion-tab-3-heres-why">Legion Tab Gen 3</a> with Wi-Fi 7 support for a better remote play experience, I bought one with my own money. However, while the Vagabond stretches up to 8.03 inches to accommodate Apple’s iPad mini, the Legion Tab Gen 3 is slightly too long at 8.2 inches. The same held true for the RedMagic Astra 2 gaming tablet I’m currently reviewing.</p><p>I was hoping to pick up a discounted iPad mini specifically to use with the Vagabond, but thanks to <a href="https://www.tomsguide.com/computing/ram-price-crisis-2026-everything-you-need-to-know">RAMaggedon</a>, finding one anywhere under $500 has proven tough. Who knows — maybe I’ll grab an iPad mini 7 once Apple’s long-rumored <a href="https://www.tomsguide.com/computing/ipads/first-oled-ipad-mini-tipped-for-october-launch-heres-why-im-excited-and-worried">OLED iPad mini</a> finally hits store shelves.</p><p>For now, though, I’m more than content streaming my favorite Steam games on the Vagabond using my phone or the <a href="https://www.tomsguide.com/opinion/i-used-the-razer-edge-5g-as-my-main-game-console-for-a-week-heres-what-happened">Razer Edge 5G</a>, which gets you pretty close to that mini-tablet experience anyway. If you’ve tried the Backbone or the standard Razer Kishi and found them uncomfortable over long play sessions, the Elo Vagabond just might surprise you the same way it did me.</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-tried-the-sonic-the-hedgehog-office-chair-and-it-actually-makes-ergonomics-fun-and-fast"><strong>I tried the Sonic the Hedgehog office chair — and it actually makes ergonomics fun (and fast)</strong></a></li><li><a href="https://www.tomsguide.com/gaming/handheld-gaming/i-tested-the-worlds-first-mobile-game-controller-with-ar-glasses-support-and-it-completely-transformed-my-16-hour-flight"><strong>I used the world's first mobile game controller with AR glasses support — and it completely transformed my 16-hour flight</strong></a></li><li><a href="https://www.tomsguide.com/computing/desktop-computers/mini-pcs/minisforum-g1-pro-review"><strong>I tested the Minisforum G1 Pro and this console-sized mini PC works just as well in the living room as it does at your desk</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The Asus ROG Swift OLED is a powerful gaming monitor for hardcore gamers — here’s why ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Asus ROG Swift OLED PG34WCDN is one of the loveliest gaming monitors I’ve had the pleasure of reviewing. Not only does it look great on a desk, but its curved OLED panel makes games feel more immersive. Though it’s pricey at $1,299, it’s a worthwhile investment that’ll enhance your gaming experiences for years to come.</p><p>Like the equally awesome <a href="https://www.tomsguide.com/computing/monitors/alienware-34-280hz-qd-oled-aw3426dw-review">Alienware AW3426DW</a>, Asus’ monitor features an ultrawide 21:9 aspect ratio, which is great for expanding your gaming POV and letting you comfortably have more open windows on the screen. The 800R curvature isn’t too extreme but still does a nice job of enveloping you. The sharp 3440 x 1440 resolution and vivid OLED panel also keep you immersed. It can also get surprisingly bright for a gaming monitor.</p><p>Some of the monitor's unique features set it apart from competitors and deliver sharper image quality. The Penta Tandem QD OLED display with Pure RGB is a first outside Asus' own UCWM series and improves text rendering. The new Black Shield Film offers superior ambient light handling, eliminates color shift, and improves black depth perception.</p><p>Performance is smooth and responsive, thanks to the fast 360Hz refresh rate and low 0.03ms response time (respectively). Whether you’re playing fast-paced first-person shooters or enjoying a more cinematic experience, the ROG Swift OLED has you covered.</p><p>Aside from its high price compared to similar monitors, the Asus ROG Swift OLED PG34WCDN is easily one of the <a href="https://www.tomsguide.com/us/best-gaming-monitors,review-3114.html">best gaming monitors</a> you can buy. Find out why in my full review.</p><h3 class="article-body__section" id="section-asus-rog-swift-oled-pg34wcdn-review-cheat-sheet"><span>Asus ROG Swift OLED PG34WCDN review: Cheat sheet</span></h3><ul><li><strong>What is it?</strong> The Asus ROG Swift OLED is a curved gaming monitor.</li><li><strong>Who is it for?</strong> Gamers who need a monitor with a high refresh rate for fast-paced competitive gaming.</li><li><strong>What does it cost?</strong> Asus ROG Swift OLED (PG34WCDM) costs <a href="https://www.newegg.com/asus-pg34wcdn-34-qd-oled-360-hz-rog-swift-qd-oled/p/N82E16824281410" target="_blank" rel="nofollow">$1,299 on Newegg</a>.</li><li><strong>What do we like?</strong> We like the sleek design, immersive curved panel, vivid image quality, and smooth performance.</li><li><strong>What don’t we like?</strong> We don’t like that it costs more than similar gaming monitors.</li></ul><h3 class="article-body__section" id="section-asus-rog-swift-oled-pg34wcdn-review-specs"><span>Asus ROG Swift OLED PG34WCDN review: Specs</span></h3><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Asus ROG Swift OLED (PG34WCDM) </strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$1,299</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>34-inch, 800R curved</p></td></tr><tr><td class="firstcol " ><p><strong>Resolution</strong></p></td><td  ><p>3440 x 1440</p></td></tr><tr><td class="firstcol " ><p><strong>Aspect ratio</strong></p></td><td  ><p>21:9</p></td></tr><tr><td class="firstcol " ><p><strong>Refresh rate</strong></p></td><td  ><p>360Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Response time</strong></p></td><td  ><p>0.03 ms</p></td></tr><tr><td class="firstcol " ><p><strong>Panel type</strong></p></td><td  ><p>OLED</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>1x DisplayPort, 2x HDMI, 1x USB-C, 1x headphone jack, 3x USB-A, 1x USB-A, 1x SPDIF out</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>30.9 x 21.6 x 11.5 inches (with stand)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>18.52 pounds (with stand)</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-asus-rog-swift-oled-pg34wcdn-review-the-ups"><span>Asus ROG Swift OLED PG34WCDN review: The ups</span></h3><p>The Asus ROG Swift OLED impresses thanks to its eye-catching design, vibrant image quality, and blazing-fast performance.</p><h2 id="sleek-design">Sleek design</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="K3mctydyq36AJfT3ntE9Wa" name="Asus ROG Swift OLED (2026)-18" alt="Asus ROG Swift OLED (2026)" src="https://cdn.mos.cms.futurecdn.net/K3mctydyq36AJfT3ntE9Wa.jpg" mos="" align="middle" fullscreen="" width="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 won’t mistake the ROG Swift OLED for anything other than a gaming monitor, thanks to its dark chassis, sharp angles, and standard red lighting. It’s a pretty aggressive design, but that’s what makes it so striking.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PmXRxesPqSmWjoXNsatnTL" name="Asus ROG Swift OLED (2026)-14" alt="Asus ROG Swift OLED (2026)" src="https://cdn.mos.cms.futurecdn.net/PmXRxesPqSmWjoXNsatnTL.jpg" mos="" align="middle" fullscreen="" width="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 certainly not as gargantuan as the <a href="https://www.tomsguide.com/reviews/samsung-odyssey-oled-g9">49-inch Samsung Odyssey OLED G9</a>, you’ll still need a relatively large table for this monitor. Its tripod-like stand is just a few inches shorter than the 30.9 x 21.6 x 11.5-inch panel. Though wide, the legs are elevated high enough to let you keep peripherals under them if you’re running out of 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="qiNZPpJMr7vVC8LkWB54xS" name="Asus ROG Swift OLED (2026)-12" alt="Asus ROG Swift OLED (2026)" src="https://cdn.mos.cms.futurecdn.net/qiNZPpJMr7vVC8LkWB54xS.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There’s a cutaway on the stand’s shaft that makes management simple. It’s also easy to raise or lower the monitor to your desired height, tilt it backward by 5 degrees or forward by 20 degrees, and swivel the screen 15 degrees left or right.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YiaRciMPD95KAgrKaWoubY" name="Asus ROG Swift OLED (2026)-20" alt="Asus ROG Swift OLED (2026)" src="https://cdn.mos.cms.futurecdn.net/YiaRciMPD95KAgrKaWoubY.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>You’ll find plenty of ports on the back. This includes one DisplayPort, two HDMI ports, three USB-A ports, one USB-C port, a headphone jack, and a USB-C port. Given the monitor’s size, you’ll need to either go around it or rotate it to access the ports, as you can’t easily connect cables by feel alone.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RhJxrbeqZwoEGndmcLvK4g" name="Asus ROG Swift OLED (2026)-9" alt="Asus ROG Swift OLED (2026)" src="https://cdn.mos.cms.futurecdn.net/RhJxrbeqZwoEGndmcLvK4g.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>This wouldn’t be a proper gaming monitor without RGB lighting. On the back, there’s a large ROG logo you can customize with different colors and lighting effects via the menu. My favorite lighting feature is a red ROG logo projected under the stand and onto your table. The lighting here isn’t intrusive and nicely complements the monitor’s overall aesthetic.</p><h2 id="vivid-display">Vivid display</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="nVjALxwULxcBgHvGMVWMeg" name="Asus ROG Swift OLED (2026)-1-LIST" alt="Asus ROG Swift OLED (2026)" src="https://cdn.mos.cms.futurecdn.net/nVjALxwULxcBgHvGMVWMeg.jpg" mos="" align="middle" fullscreen="" width="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 OLED panel delivers bright, colorful images that make every game you play look its best. The contrast between dark and light elements is fantastic and enhances the already oversaturated hues. The 21:9 aspect ratio and 800R curvature also draw you in. Even if you’re not getting a 4K image, 3440 x 1440 is still very sharp.</p><p>A game like <a href="https://www.tomsguide.com/reviews/cyberpunk-2077">Cyberpunk 2077</a> shines on the Swift OLED. The neon-drenched streets and holograms come alive thanks to the monitor’s oversaturated color reproduction. On the 21:9 panel, I can see more of the surroundings than I would on a standard 16:9 display. The sharp resolution and overall brightness also ensure everything comes through clearly.</p><div ><table><caption>Display benchmark results</caption><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Asus ROG Swift OLED</strong></p></th><th  ><p><strong>Alienware AW3426DW</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Nits (brightness)</strong></p></td><td  ><p>260</p></td><td  ><p>298</p></td></tr><tr><td class="firstcol " ><p><strong>sRGB</strong></p></td><td  ><p>200.7%</p></td><td  ><p>187.6%</p></td></tr><tr><td class="firstcol " ><p><strong>DCI-P3</strong></p></td><td  ><p>142.2%</p></td><td  ><p>132.9%</p></td></tr><tr><td class="firstcol " ><p><strong>Delta-E</strong></p></td><td  ><p>0.26</p></td><td  ><p>0.20</p></td></tr></tbody></table></div><p>And what do our lab tests have to say? In its default User mode, the ROG Swift OLED produces oversaturated hues in both the sRGB and DCI-P3 color gamuts, as both are well above the 100% target. As you can see in the table above, the panel on Asus’ monitor is more colorful than the one on the Alienware AW3426DW in its standard mode.</p><div ><table><caption>HDR benchmark results</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>10%</strong></p></td><td  ><p><strong>40%</strong></p></td><td  ><p><strong>100%</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Gaming HDR</strong></p></td><td  ><p>457</p></td><td  ><p>344</p></td><td  ><p>281</p></td></tr><tr><td class="firstcol " ><p><strong>Cinema HDR</strong></p></td><td  ><p>458</p></td><td  ><p>344</p></td><td  ><p>279</p></td></tr><tr><td class="firstcol " ><p><strong>HDR 500 True Black</strong></p></td><td  ><p>457</p></td><td  ><p>346</p></td><td  ><p>280</p></td></tr><tr><td class="firstcol " ><p><strong>Console HDR</strong></p></td><td  ><p>481</p></td><td  ><p>347</p></td><td  ><p>280</p></td></tr></tbody></table></div><p>One major win here is brightness. In dedicated HDR modes, the ROG Swift OLED reaches nearly 500 nits at 10% of the display and about 280 nits across the entire screen. Dim HDR brightness has been my chief complaint with the gaming monitors I’ve reviewed, so it’s great to see Asus (and Alienware) bucking this trend.</p><p>Speaking of dedicated display modes, you get a total of nine here. This includes standard fare like FPS, RTS, and Sports modes, each tuned for its respective gaming genre. The modes differ only slightly from one another, depending on their functions.</p><h2 id="blazing-fast-performance">Blazing fast performance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rHNR2vTGJGPGRuDwehmVNn" name="Asus ROG Swift OLED (2026)-8" alt="Asus ROG Swift OLED (2026)" src="https://cdn.mos.cms.futurecdn.net/rHNR2vTGJGPGRuDwehmVNn.jpg" mos="" align="middle" fullscreen="" width="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 ROG Swift OLED delivers professional-grade gaming performance thanks to its 360Hz refresh rate and super-low 0.03ms response time. Compatibility with Nvidia G-Sync also helps deliver smooth gaming performance. While it doesn’t match the <a href="https://www.tomsguide.com/computing/monitors/lg-ultragear-27gx790b-b-review">LG UltraGear 27GX790B-B</a>’s insane 540Hz and 720Hz modes, you won’t complain about this monitor’s performance.</p><p>To test the ROG Swift OLED, I connected it to the Alienware 16 Area-51, a powerful gaming laptop with an Intel Core Ultra 9 CPU, an Nvidia RTX 5080 GPU, and 32GB of RAM. You’ll want a sufficiently powerful rig like this to take advantage of this monitor’s stellar performance.</p><p>Cyberpunk 2077 ran smoothly thanks to the high refresh rate and low latency. I couldn’t get the frame rate anywhere near the 320Hz refresh rate, but the extra headroom meant I didn’t experience choppiness. And unless you’re a hardcore competitive gamer, you probably won’t notice much, if any, input lag—I certainly didn’t.</p><h2 id="clean-ui">Clean UI</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GfPNjf5EzDic6TJNBieE77" name="Asus ROG Swift OLED (2026)-6" alt="Asus ROG Swift OLED (2026)" src="https://cdn.mos.cms.futurecdn.net/GfPNjf5EzDic6TJNBieE77.jpg" mos="" align="middle" fullscreen="" width="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 ROG Swift OLED has a clean UI that you can easily access by clicking the OSD joystick. This is where you'll see all the display modes and make fine adjustments to brightness, RGB lighting, and other features. Everything is organized into clear sections, and it’s easy to navigate.</p><p>The OSD joystick rests behind the ROG logo at the bottom center and is easy to reach. The stick is relatively rigid but still has enough give when you move it. It also sticks out enough to not feel like a nub.</p><p>Though the menu is a bit more complex than on other gaming monitors, it doesn’t overwhelm either.</p><h3 class="article-body__section" id="section-asus-rog-swift-oled-pg34wcdn-review-the-downs"><span>Asus ROG Swift OLED PG34WCDN review: The downs</span></h3><p>There’s no denying that the Asus ROG Swift OLED is a fantastic gaming monitor that checks all the right boxes. That said, it has one major drawback.</p><h2 id="pricey">Pricey</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Mt7VJMtjUvxGdLKNa6w98E" name="Asus ROG Swift OLED (2026)-21" alt="Asus ROG Swift OLED (2026)" src="https://cdn.mos.cms.futurecdn.net/Mt7VJMtjUvxGdLKNa6w98E.jpg" mos="" align="middle" fullscreen="" width="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 be fair, the Asus ROG Swift OLED isn’t the most expensive gaming monitor I’ve reviewed. It’s fairly priced for what it offers. However, unless you’re a hardcore competitive gamer who needs an ultra-fast refresh rate, there are other, more affordable options.</p><p>The main example that comes to mind is the Alienware AW3426DW, which also has a 21:9 aspect ratio and a 3440 x 1440 resolution. While it has a “lower” 280Hz refresh rate and a less curved panel, you get most of the Swift OLED’s key features for just $799. Because of that, you’ll have to ask yourself whether the extra $500 for a higher refresh rate and flashier RGB lighting is worth it.</p><h3 class="article-body__section" id="section-asus-rog-swift-oled-pg34wcdn-review-verdict"><span>Asus ROG Swift OLED PG34WCDN review: Verdict</span></h3><p>Gaming monitors designed for high-level competitive play usually sacrifice picture quality for faster performance. The Asus ROG Swift OLED doesn't, proving that you can have the best of both worlds. Yes, it’s designed for fast-paced online gaming, but it also delivers stunning overall picture quality.</p><p>If the $1299 asking price is too steep, then check out the $799 Alienware AW3426DW I mentioned above. But if Asus’ monitor fits your needs as a competitive gamer, then I promise you won’t be disappointed. Right now, it’s one of the finest gaming monitors you can buy.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/monitors/asus-rog-swift-oled-pg34wcdn-review</link>
                                                                            <description>
                            <![CDATA[ The Asus ROG Swift OLED delivers thanks to its stunning picture quality and fast performance. It’s an excellent gaming monitor for competitive-focused players. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">bz2DbjM86DvKrqj4tYDquB</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/hJE7zoG7ush5yQF3awArWn-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 08 Aug 2026 08:30:00 +0000</pubDate>                                                                                                                                <updated>Thu, 13 Aug 2026 13:23:54 +0000</updated>
                                                                                                                                            <category><![CDATA[Monitors]]></category>
                                                    <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Computing Hardware]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                <author><![CDATA[ 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/hJE7zoG7ush5yQF3awArWn-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Asus ROG Swift OLED (2026)]]></media:description>                                                            <media:text><![CDATA[Asus ROG Swift OLED (2026)]]></media:text>
                                <media:title type="plain"><![CDATA[Asus ROG Swift OLED (2026)]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/hJE7zoG7ush5yQF3awArWn-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Asus ROG Swift OLED PG34WCDN is one of the loveliest gaming monitors I’ve had the pleasure of reviewing. Not only does it look great on a desk, but its curved OLED panel makes games feel more immersive. Though it’s pricey at $1,299, it’s a worthwhile investment that’ll enhance your gaming experiences for years to come.</p><p>Like the equally awesome <a href="https://www.tomsguide.com/computing/monitors/alienware-34-280hz-qd-oled-aw3426dw-review">Alienware AW3426DW</a>, Asus’ monitor features an ultrawide 21:9 aspect ratio, which is great for expanding your gaming POV and letting you comfortably have more open windows on the screen. The 800R curvature isn’t too extreme but still does a nice job of enveloping you. The sharp 3440 x 1440 resolution and vivid OLED panel also keep you immersed. It can also get surprisingly bright for a gaming monitor.</p><p>Some of the monitor's unique features set it apart from competitors and deliver sharper image quality. The Penta Tandem QD OLED display with Pure RGB is a first outside Asus' own UCWM series and improves text rendering. The new Black Shield Film offers superior ambient light handling, eliminates color shift, and improves black depth perception.</p><p>Performance is smooth and responsive, thanks to the fast 360Hz refresh rate and low 0.03ms response time (respectively). Whether you’re playing fast-paced first-person shooters or enjoying a more cinematic experience, the ROG Swift OLED has you covered.</p><p>Aside from its high price compared to similar monitors, the Asus ROG Swift OLED PG34WCDN is easily one of the <a href="https://www.tomsguide.com/us/best-gaming-monitors,review-3114.html">best gaming monitors</a> you can buy. Find out why in my full review.</p><h3 class="article-body__section" id="section-asus-rog-swift-oled-pg34wcdn-review-cheat-sheet"><span>Asus ROG Swift OLED PG34WCDN review: Cheat sheet</span></h3><ul><li><strong>What is it?</strong> The Asus ROG Swift OLED is a curved gaming monitor.</li><li><strong>Who is it for?</strong> Gamers who need a monitor with a high refresh rate for fast-paced competitive gaming.</li><li><strong>What does it cost?</strong> Asus ROG Swift OLED (PG34WCDM) costs <a href="https://www.newegg.com/asus-pg34wcdn-34-qd-oled-360-hz-rog-swift-qd-oled/p/N82E16824281410" target="_blank" rel="nofollow">$1,299 on Newegg</a>.</li><li><strong>What do we like?</strong> We like the sleek design, immersive curved panel, vivid image quality, and smooth performance.</li><li><strong>What don’t we like?</strong> We don’t like that it costs more than similar gaming monitors.</li></ul><h3 class="article-body__section" id="section-asus-rog-swift-oled-pg34wcdn-review-specs"><span>Asus ROG Swift OLED PG34WCDN review: Specs</span></h3><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Asus ROG Swift OLED (PG34WCDM) </strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$1,299</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>34-inch, 800R curved</p></td></tr><tr><td class="firstcol " ><p><strong>Resolution</strong></p></td><td  ><p>3440 x 1440</p></td></tr><tr><td class="firstcol " ><p><strong>Aspect ratio</strong></p></td><td  ><p>21:9</p></td></tr><tr><td class="firstcol " ><p><strong>Refresh rate</strong></p></td><td  ><p>360Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Response time</strong></p></td><td  ><p>0.03 ms</p></td></tr><tr><td class="firstcol " ><p><strong>Panel type</strong></p></td><td  ><p>OLED</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>1x DisplayPort, 2x HDMI, 1x USB-C, 1x headphone jack, 3x USB-A, 1x USB-A, 1x SPDIF out</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>30.9 x 21.6 x 11.5 inches (with stand)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>18.52 pounds (with stand)</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-asus-rog-swift-oled-pg34wcdn-review-the-ups"><span>Asus ROG Swift OLED PG34WCDN review: The ups</span></h3><p>The Asus ROG Swift OLED impresses thanks to its eye-catching design, vibrant image quality, and blazing-fast performance.</p><h2 id="sleek-design">Sleek design</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="K3mctydyq36AJfT3ntE9Wa" name="Asus ROG Swift OLED (2026)-18" alt="Asus ROG Swift OLED (2026)" src="https://cdn.mos.cms.futurecdn.net/K3mctydyq36AJfT3ntE9Wa.jpg" mos="" align="middle" fullscreen="" width="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 won’t mistake the ROG Swift OLED for anything other than a gaming monitor, thanks to its dark chassis, sharp angles, and standard red lighting. It’s a pretty aggressive design, but that’s what makes it so striking.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PmXRxesPqSmWjoXNsatnTL" name="Asus ROG Swift OLED (2026)-14" alt="Asus ROG Swift OLED (2026)" src="https://cdn.mos.cms.futurecdn.net/PmXRxesPqSmWjoXNsatnTL.jpg" mos="" align="middle" fullscreen="" width="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 certainly not as gargantuan as the <a href="https://www.tomsguide.com/reviews/samsung-odyssey-oled-g9">49-inch Samsung Odyssey OLED G9</a>, you’ll still need a relatively large table for this monitor. Its tripod-like stand is just a few inches shorter than the 30.9 x 21.6 x 11.5-inch panel. Though wide, the legs are elevated high enough to let you keep peripherals under them if you’re running out of 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="qiNZPpJMr7vVC8LkWB54xS" name="Asus ROG Swift OLED (2026)-12" alt="Asus ROG Swift OLED (2026)" src="https://cdn.mos.cms.futurecdn.net/qiNZPpJMr7vVC8LkWB54xS.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There’s a cutaway on the stand’s shaft that makes management simple. It’s also easy to raise or lower the monitor to your desired height, tilt it backward by 5 degrees or forward by 20 degrees, and swivel the screen 15 degrees left or right.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YiaRciMPD95KAgrKaWoubY" name="Asus ROG Swift OLED (2026)-20" alt="Asus ROG Swift OLED (2026)" src="https://cdn.mos.cms.futurecdn.net/YiaRciMPD95KAgrKaWoubY.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>You’ll find plenty of ports on the back. This includes one DisplayPort, two HDMI ports, three USB-A ports, one USB-C port, a headphone jack, and a USB-C port. Given the monitor’s size, you’ll need to either go around it or rotate it to access the ports, as you can’t easily connect cables by feel alone.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RhJxrbeqZwoEGndmcLvK4g" name="Asus ROG Swift OLED (2026)-9" alt="Asus ROG Swift OLED (2026)" src="https://cdn.mos.cms.futurecdn.net/RhJxrbeqZwoEGndmcLvK4g.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>This wouldn’t be a proper gaming monitor without RGB lighting. On the back, there’s a large ROG logo you can customize with different colors and lighting effects via the menu. My favorite lighting feature is a red ROG logo projected under the stand and onto your table. The lighting here isn’t intrusive and nicely complements the monitor’s overall aesthetic.</p><h2 id="vivid-display">Vivid display</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="nVjALxwULxcBgHvGMVWMeg" name="Asus ROG Swift OLED (2026)-1-LIST" alt="Asus ROG Swift OLED (2026)" src="https://cdn.mos.cms.futurecdn.net/nVjALxwULxcBgHvGMVWMeg.jpg" mos="" align="middle" fullscreen="" width="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 OLED panel delivers bright, colorful images that make every game you play look its best. The contrast between dark and light elements is fantastic and enhances the already oversaturated hues. The 21:9 aspect ratio and 800R curvature also draw you in. Even if you’re not getting a 4K image, 3440 x 1440 is still very sharp.</p><p>A game like <a href="https://www.tomsguide.com/reviews/cyberpunk-2077">Cyberpunk 2077</a> shines on the Swift OLED. The neon-drenched streets and holograms come alive thanks to the monitor’s oversaturated color reproduction. On the 21:9 panel, I can see more of the surroundings than I would on a standard 16:9 display. The sharp resolution and overall brightness also ensure everything comes through clearly.</p><div ><table><caption>Display benchmark results</caption><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Asus ROG Swift OLED</strong></p></th><th  ><p><strong>Alienware AW3426DW</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Nits (brightness)</strong></p></td><td  ><p>260</p></td><td  ><p>298</p></td></tr><tr><td class="firstcol " ><p><strong>sRGB</strong></p></td><td  ><p>200.7%</p></td><td  ><p>187.6%</p></td></tr><tr><td class="firstcol " ><p><strong>DCI-P3</strong></p></td><td  ><p>142.2%</p></td><td  ><p>132.9%</p></td></tr><tr><td class="firstcol " ><p><strong>Delta-E</strong></p></td><td  ><p>0.26</p></td><td  ><p>0.20</p></td></tr></tbody></table></div><p>And what do our lab tests have to say? In its default User mode, the ROG Swift OLED produces oversaturated hues in both the sRGB and DCI-P3 color gamuts, as both are well above the 100% target. As you can see in the table above, the panel on Asus’ monitor is more colorful than the one on the Alienware AW3426DW in its standard mode.</p><div ><table><caption>HDR benchmark results</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>10%</strong></p></td><td  ><p><strong>40%</strong></p></td><td  ><p><strong>100%</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Gaming HDR</strong></p></td><td  ><p>457</p></td><td  ><p>344</p></td><td  ><p>281</p></td></tr><tr><td class="firstcol " ><p><strong>Cinema HDR</strong></p></td><td  ><p>458</p></td><td  ><p>344</p></td><td  ><p>279</p></td></tr><tr><td class="firstcol " ><p><strong>HDR 500 True Black</strong></p></td><td  ><p>457</p></td><td  ><p>346</p></td><td  ><p>280</p></td></tr><tr><td class="firstcol " ><p><strong>Console HDR</strong></p></td><td  ><p>481</p></td><td  ><p>347</p></td><td  ><p>280</p></td></tr></tbody></table></div><p>One major win here is brightness. In dedicated HDR modes, the ROG Swift OLED reaches nearly 500 nits at 10% of the display and about 280 nits across the entire screen. Dim HDR brightness has been my chief complaint with the gaming monitors I’ve reviewed, so it’s great to see Asus (and Alienware) bucking this trend.</p><p>Speaking of dedicated display modes, you get a total of nine here. This includes standard fare like FPS, RTS, and Sports modes, each tuned for its respective gaming genre. The modes differ only slightly from one another, depending on their functions.</p><h2 id="blazing-fast-performance">Blazing fast performance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rHNR2vTGJGPGRuDwehmVNn" name="Asus ROG Swift OLED (2026)-8" alt="Asus ROG Swift OLED (2026)" src="https://cdn.mos.cms.futurecdn.net/rHNR2vTGJGPGRuDwehmVNn.jpg" mos="" align="middle" fullscreen="" width="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 ROG Swift OLED delivers professional-grade gaming performance thanks to its 360Hz refresh rate and super-low 0.03ms response time. Compatibility with Nvidia G-Sync also helps deliver smooth gaming performance. While it doesn’t match the <a href="https://www.tomsguide.com/computing/monitors/lg-ultragear-27gx790b-b-review">LG UltraGear 27GX790B-B</a>’s insane 540Hz and 720Hz modes, you won’t complain about this monitor’s performance.</p><p>To test the ROG Swift OLED, I connected it to the Alienware 16 Area-51, a powerful gaming laptop with an Intel Core Ultra 9 CPU, an Nvidia RTX 5080 GPU, and 32GB of RAM. You’ll want a sufficiently powerful rig like this to take advantage of this monitor’s stellar performance.</p><p>Cyberpunk 2077 ran smoothly thanks to the high refresh rate and low latency. I couldn’t get the frame rate anywhere near the 320Hz refresh rate, but the extra headroom meant I didn’t experience choppiness. And unless you’re a hardcore competitive gamer, you probably won’t notice much, if any, input lag—I certainly didn’t.</p><h2 id="clean-ui">Clean UI</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GfPNjf5EzDic6TJNBieE77" name="Asus ROG Swift OLED (2026)-6" alt="Asus ROG Swift OLED (2026)" src="https://cdn.mos.cms.futurecdn.net/GfPNjf5EzDic6TJNBieE77.jpg" mos="" align="middle" fullscreen="" width="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 ROG Swift OLED has a clean UI that you can easily access by clicking the OSD joystick. This is where you'll see all the display modes and make fine adjustments to brightness, RGB lighting, and other features. Everything is organized into clear sections, and it’s easy to navigate.</p><p>The OSD joystick rests behind the ROG logo at the bottom center and is easy to reach. The stick is relatively rigid but still has enough give when you move it. It also sticks out enough to not feel like a nub.</p><p>Though the menu is a bit more complex than on other gaming monitors, it doesn’t overwhelm either.</p><h3 class="article-body__section" id="section-asus-rog-swift-oled-pg34wcdn-review-the-downs"><span>Asus ROG Swift OLED PG34WCDN review: The downs</span></h3><p>There’s no denying that the Asus ROG Swift OLED is a fantastic gaming monitor that checks all the right boxes. That said, it has one major drawback.</p><h2 id="pricey">Pricey</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Mt7VJMtjUvxGdLKNa6w98E" name="Asus ROG Swift OLED (2026)-21" alt="Asus ROG Swift OLED (2026)" src="https://cdn.mos.cms.futurecdn.net/Mt7VJMtjUvxGdLKNa6w98E.jpg" mos="" align="middle" fullscreen="" width="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 be fair, the Asus ROG Swift OLED isn’t the most expensive gaming monitor I’ve reviewed. It’s fairly priced for what it offers. However, unless you’re a hardcore competitive gamer who needs an ultra-fast refresh rate, there are other, more affordable options.</p><p>The main example that comes to mind is the Alienware AW3426DW, which also has a 21:9 aspect ratio and a 3440 x 1440 resolution. While it has a “lower” 280Hz refresh rate and a less curved panel, you get most of the Swift OLED’s key features for just $799. Because of that, you’ll have to ask yourself whether the extra $500 for a higher refresh rate and flashier RGB lighting is worth it.</p><h3 class="article-body__section" id="section-asus-rog-swift-oled-pg34wcdn-review-verdict"><span>Asus ROG Swift OLED PG34WCDN review: Verdict</span></h3><p>Gaming monitors designed for high-level competitive play usually sacrifice picture quality for faster performance. The Asus ROG Swift OLED doesn't, proving that you can have the best of both worlds. Yes, it’s designed for fast-paced online gaming, but it also delivers stunning overall picture quality.</p><p>If the $1299 asking price is too steep, then check out the $799 Alienware AW3426DW I mentioned above. But if Asus’ monitor fits your needs as a competitive gamer, then I promise you won’t be disappointed. Right now, it’s one of the finest gaming monitors you can buy.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The Edifier G5 Max delivers main character energy without the luxury price tag — here’s why it’s excellent ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">best gaming headsets</a> can truly elevate your experience by making you feel like the main character — and that’s exactly what the Edifier G5 Max does. Though it enters a crowded market where premium features are no longer reserved for premium prices, it certainly makes an impression.</p><p>With support for Hi-Res Audio, THX Spatial Audio, and an eye-catching 305-hour battery life, the G5 Max gives you little to complain about. In-game audio is outstanding, while the headset itself is extremely comfortable for all-day wear. While it isn’t flawless, as its mic(s) aren’t anything to write home about, I still think the G5 Max is worth the asking price.</p><p>To find out if this is the right headset for you, read my full Edifier G5 Max review.</p><h2 class="article-body__section" id="section-edifier-g5-max-review-specs"><span>Edifier G5 Max review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/Edifier-Gaming-Headset-Battery-Audio/dp/B0GLMSCLK5/" target="_blank" rel="nofollow">$149</a> / <a href="https://www.amazon.co.uk/Edifier-G5-MAX-Wireless-Headset-Space-Grey/dp/B0GKPB74M8/" target="_blank" rel="nofollow">£159</a></p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Space Gray, White</p></td></tr><tr><td class="firstcol " ><p><strong>Platforms</strong></p></td><td  ><p>PS5, PS4, Nintendo Switch 2, Nintendo Switch, PC, macOS, iOS, Android</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Bluetooth 6.0, 2.4GHz, USB-A wired</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>Rechargeable</p></td></tr><tr><td class="firstcol " ><p><strong>Battery life (rated)</strong></p></td><td  ><p>305 hours (Bluetooth) | 227 hours (2.4GHz)</p></td></tr><tr><td class="firstcol " ><p><strong>Frequency response</strong></p></td><td  ><p>20Hz-40KHz</p></td></tr><tr><td class="firstcol " ><p><strong>Drivers</strong></p></td><td  ><p>53mm dynamic</p></td></tr><tr><td class="firstcol " ><p><strong>Multipoint connectivity</strong></p></td><td  ><p>No</p></td></tr><tr><td class="firstcol " ><p><strong>Paired devices max</strong></p></td><td  ><p>1</p></td></tr><tr><td class="firstcol " ><p><strong>Microphone</strong></p></td><td  ><p>2x built-in mics; 1x detachable boom mic</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>10.75oz</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-edifier-g5-max-review-cheat-sheet"><span>Edifier G5 Max review: Cheat sheet</span></h2><ul><li><strong>What is it?</strong> A wireless gaming headset compatible with PS5, Nintendo Switch, PC and smartphones</li><li><strong>Who is it for?</strong> Anyone who wants an immersive gaming experience without breaking the bank</li><li><strong>How much does it cost? </strong>The Edifier G5 Max is available for <a href="https://www.amazon.com/Edifier-Gaming-Headset-Battery-Audio/dp/B0GLMSCLK5/" target="_blank" rel="nofollow">$149</a> / <a href="https://www.amazon.co.uk/Edifier-G5-MAX-Wireless-Headset-Space-Grey/dp/B0GKPB74M8/" target="_blank" rel="nofollow">£159</a></li><li><strong>What do we like?</strong> The comfortable design, immersive in-game audio, great music capabilities, long battery life, and more</li><li><strong>What don’t we like?</strong> The lack of a macOS companion app and the subpar mic performance</li></ul><h2 class="article-body__section" id="section-edifier-g5-max-review-the-ups"><span>Edifier G5 Max review: The ups</span></h2><p>The Edifier G5 Max is extremely comfortable and boasts all-round great sound in video games and while listening to music. Its companion apps make customization easy, too.</p><h2 id="extremely-comfortable">Extremely comfortable</h2><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="CBSoxTwPZucshhh9E6SAmi" name="Hecate_G5_Max_Headphones_003.JPG" alt="Edifier G5 Max wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/CBSoxTwPZucshhh9E6SAmi.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As someone who reviews gaming headsets for a living (and uses them in her free time too), I’ve been spoiled by the likes of the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/alienware-pro-wireless-gaming-headset-review">Alienware Pro Wireless Gaming Headset</a> ($229) and the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-blackshark-v3-pro-review">Razer BlackShark V3 Pro</a> ($249) when it comes to comfort. Though the Edifier G5 Max doesn’t cost as much, it’s an extremely comfortable headset, and one that hasn’t made my ears sweat, unlike the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/final-vr3000-ex-gaming-headset-review">Final VR3000 EX</a> ($149).</p><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="A3K2wvqdNsXFQqgqB7Y6dj" name="Hecate_G5_Max_Headphones_008.JPG" alt="Edifier G5 Max wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/A3K2wvqdNsXFQqgqB7Y6dj.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 G5 Max’s earcups feel very spacious and sit comfortably around my ears. The cushions and the headband are made of memory foam and “skin-friendly protein leather.” These are designed to elevate pressure you’d otherwise feel on the top of your head and around your ears. Having worn the headset for six straight hours, I can confirm that I didn’t feel any discomfort, so the G5 Max is great for prolonged wear.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3066px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="usbYLUUi9n2Y4mECorjLnc" name="Edifier-G5-Max-2" alt="Edifier G5 Max gaming headset" src="https://cdn.mos.cms.futurecdn.net/usbYLUUi9n2Y4mECorjLnc.jpg" mos="" align="middle" fullscreen="" width="3066" height="1725" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Nikita Achanta / Tom's Guide)</span></figcaption></figure><p>Aiding the G5 Max’s comfort level is its lightweight body. The headset weighs just 10.75oz, so it’s lighter than the Final VR3000 EX (13.72oz) and the first-party <a href="https://www.tomsguide.com/gaming/gaming-peripherals/sony-playstation-pulse-elite-headset-review">Sony PlayStation Pulse Elite</a> (12.2oz, $149). Speaking of, for the same price, the G5 Max’s build quality — especially of the earcups — feels superior to the PlayStation Pulse Elite’s.</p><h2 id="immersive-in-game-audio">Immersive in-game audio</h2><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="rqibBwfzaCxUnAGkiWpbbj" name="Hecate_G5_Max_Headphones_010.JPG" alt="Edifier G5 Max wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/rqibBwfzaCxUnAGkiWpbbj.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 Edifier G5 Max makes games sound simply gorgeous, thanks to its 53mm dynamic driver which covers a frequency response range of 20Hz to 40KHz — so the entirety of the average human hearing spectrum and then some. In addition to that, the G5 Max features custom 7.1.4 Spatial Audio (Windows-only) co-developed by HECATE and THX. This essentially puts you at the center of a 360° sound sphere, creating an immersive gaming experience.</p><p>And the G5 Max works extremely well. I played <a href="https://www.tomsguide.com/gaming/clair-obscur-expedition-33-review">Clair Obscur: Expedition 33</a> and <a href="https://www.tomsguide.com/gaming/assassins-creed-shadows-review">Assassin’s Creed Shadows</a> on my <a href="https://www.tomsguide.com/gaming/playstation/ps5-slim">PS5 Slim</a> to test the headset’s general console capabilities, and <a href="https://www.tomsguide.com/reviews/cyberpunk-2077-phantom-liberty">Cyberpunk 2077</a> on the <a href="https://www.tomsguide.com/computing/gaming-laptops/alienware-16x-aurora-review">Alienware 16X Aurora</a> to test the Spatial Audio. </p><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="U7RAibWDiPDD4YwwZyL6dj" name="Hecate_G5_Max_Headphones_009.JPG" alt="Edifier G5 Max wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/U7RAibWDiPDD4YwwZyL6dj.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As soon as I booted up Expedition 33, I was drawn into the Belle Époque world, with every orchestral score, environmental effect, and combat cue carrying immense detail. During a post-endgame secret boss fight, I appreciated being able to hear every combat cue so that I could time my parries perfectly, and these didn’t get lost as the symphonic metal background track swelled. I also enjoyed hearing my attacks land with plenty of low-end impact and <em>oomph</em>.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="TkhSKiqnKYadjcshmpQycj" name="Hecate_G5_Max_Headphones_011.JPG" alt="Edifier G5 Max wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/TkhSKiqnKYadjcshmpQycj.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>In Assassin’s Creed Shadows, I appreciated the G5 Max bringing the world of feudal Japan to life — from the rustling of the leaves in the wind and the trickling of waterfalls, to the clash of swords during heated battles and the protagonist’s hidden blade making a sharp <em>shing. </em>Dialogues sounded loud and clear, too, even when there were multiple voices speaking at once. I also appreciated the headset’s directionality in Shadows, as I could hear NPCs speaking in the right earcup — and then traveling to the left when I changed my direction.</p><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="E6Wzwo82WuKBabXgTrcRGj" name="Hecate_G5_Max_Headphones_005.JPG" alt="Edifier G5 Max wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/E6Wzwo82WuKBabXgTrcRGj.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>Cyberpunk 2077 really showed off what the G5 Max’s THX Spatial Audio could do. Walking through the neon-laden, chaotic streets of Night City felt extremely immersive, with different sounds emerging from different directions which made me feel like the main character. During firefights, I found it much easier to pinpoint where my enemies were positioned, thanks to the precise acoustics, which gave me a competitive advantage. This also made infiltrating enemy camps easier as all I had to do was listen out for footsteps and then execute stealth takedowns.</p><p>Overall, the G5 Max is ideal for a number of genres, including RPG and FPS titles. Combine that with the supreme comfort and you don’t even realize hours have gone by.</p><h2 id="great-for-music-too">Great for music, too</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="myVnztzZL23YeNTbDvp2bj" name="Hecate_G5_Max_Headphones_004.JPG" alt="Edifier G5 Max wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/myVnztzZL23YeNTbDvp2bj.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Alongside being excellent for gaming, the Edifier G5 Max is great for listening to music, too. It carries Hi-Res Audio and Hi-Res Audio Wireless certifications which means it can transmit and reproduce high-resolution digital audio formats with its 96KHz/24-bit sampling rate. This gives it a leg-up over other similarly priced gaming headsets, such as the Final VR3000 EX and the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/asus-rog-pelta-gaming-headset-review">Asus ROG Pelta</a> ($129) which aren’t Hi-Res certified.</p><p>I tested the G5 Max’s music capabilities by listening to a few of my favorite testing songs on <a href="https://www.tomsguide.com/audio/qobuz-review">Qobuz</a>, the <a href="https://www.tomsguide.com/buying-guide/best-music-streaming-services">best music streaming service</a> for audiophiles. I’ve been thoroughly impressed by the G5 Max’s airy and spacious soundstage, with every instrument and 070 Shake’s breathwork in ‘<a href="https://open.qobuz.com/track/291554006" target="_blank" rel="nofollow">Elephant</a>’ sounding layered. In ‘<a href="https://open.qobuz.com/track/161150239" target="_blank" rel="nofollow">Sultans of Swing</a>’ by Dire Straits, each note plucked on the guitar sounded clear and nuanced, while the softer bass provided a powerful backbone to the track.</p><p>For the price, the sound quality doesn’t give you a lot to complain about. If you want <em>even</em> better sound, though, I’d recommend spending an extra $50 on the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/sony-inzone-h6-air-review">Sony Inzone H6 Air</a> ($199) which utilizes studio-grade drivers.</p><p><em>Listen along to my review with the Edifier G5 Max testing playlist:</em></p><iframe allow="" height="390" width="378" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://widget.qobuz.com/playlist/68306967?zone=GB-en"></iframe><h2 id="two-useful-companion-apps">Two useful companion apps</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/6mikkFaAStu8NvRyzBNNTW.jpg" alt="Edifier G5 Max customization app screenshot" /><figcaption><small role="credit">Edifier / Hecate / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/UzcTK768ApgCQ7CDCm5cWW.jpg" alt="Edifier G5 Max customization app screenshot" /><figcaption><small role="credit">Edifier / Hecate / Tom's Guide</small></figcaption></figure></figure><p>There are two ways to customize the Edifier G5 Max: you can use either the Edifier ConneX <a href="https://play.google.com/store/apps/details?id=com.edifier.edifierconnex&hl=en_GB" target="_blank" rel="nofollow">Android</a>/<a href="https://apps.apple.com/us/app/edifier-connex/id6469028132" target="_blank" rel="nofollow">iOS</a> app, or the proprietary <a href="https://hecategaming.com/pages/driver-download-center?srsltid=AfmBOop6FlhDthZDgTwmINO1G8eN2Y2qo6sWJ8vdZs8_gbzyKECogHIh" target="_blank" rel="nofollow">HECATE Driver Software</a> on Windows. The former is handy for when you want to make on-the-fly adjustments, such as swapping between EQ presets, customizing your own EQ, and remapping the headset’s buttons. I tested it on my <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-10-pro-xl-review">Google Pixel 10 Pro XL</a> and appreciated its straightforward and easy to understand interface.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/YHodLFbAr5vnHSwsrMVSrW.jpg" alt="Edifier G5 Max customization app screenshot" /><figcaption><small role="credit">Edifier / Hecate / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/3UJHLfER9VGRtu8heuGroW.jpg" alt="Edifier G5 Max customization app screenshot" /><figcaption><small role="credit">Edifier / Hecate / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/9NuG7YkiTtMmRub8oJRHaW.jpg" alt="Edifier G5 Max customization app screenshot" /><figcaption><small role="credit">Edifier / Hecate / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Cy5Cp9wJAqwvdRGgQwy8mW.jpg" alt="Edifier G5 Max customization app screenshot" /><figcaption><small role="credit">Edifier / Hecate / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/SWf2gHMw2HMSe5w2U9tViW.jpg" alt="Edifier G5 Max customization app screenshot" /><figcaption><small role="credit">Edifier / Hecate / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/cacnfhJKLjuKs9DhxiLDfW.jpg" alt="Edifier G5 Max customization app screenshot" /><figcaption><small role="credit">Edifier / Hecate / Tom's Guide</small></figcaption></figure></figure><p>HECATE Driver Software is more detailed and offers more in-depth personalization. You can enable THX Spatial Audio, adjust the mic’s settings, make extensive adjustments to the RGB lighting, and enable game-specific EQ presets (Valorant, PUBG, Battlefield 5, Overwatch, and more). The desktop app doesn’t feature any intrusive ads or pop-ups, making it a breeze to use.</p><h2 id="astonishing-305-hour-battery">Astonishing 305-hour battery</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="AohnawsbMTSaEfa54Lzdaj" name="Hecate_G5_Max_Headphones_006.JPG" alt="Edifier G5 Max wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/AohnawsbMTSaEfa54Lzdaj.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you need a gaming headset that doesn’t run out of battery too quickly, the Edifier G5 Max should be your port of call. I can only describe its battery life as astonishing, as it’s rated for 305 hours over Bluetooth or 227 hours over 2.4GHz. The G5 Max, then, blows its competition out of the water. Other similarly priced headsets, such as the Final VR3000 EX (55 hours), Sony PlayStation Pulse Elite (30 hours), and Asus ROG Pelta (90 hours), simply fall short.</p><p>Not just that, but even pricier headsets don’t last as long, like the Razer BlackShark V3 Pro (70 hours), the Alienware Pro Wireless Gaming Headset (70 hours) and even the extortionate <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-elite-review">SteelSeries Arctis Nova Elite</a> (60 hours, $599).</p><p>I would have to game <em>a lot </em>to kill the G5 Max’s battery, but after having used it for eight hours and left it running overnight with my PS5 turned on — so a total of 18 hours or so — the battery had dipped by only 7%. That’s great.</p><h2 class="article-body__section" id="section-edifier-g5-max-review-the-downs"><span>Edifier G5 Max review: The downs</span></h2><p>The Edifier G5 Max is great but it’s important to note that its microphones aren’t the best, and there’s no macOS companion app.</p><h2 id="subpar-mic-s-performance">Subpar mic(s) performance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Lcm5qNBC5vYT3KxH6Jpc6j" name="Hecate_G5_Max_Headphones_007.JPG" alt="Edifier G5 Max wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/Lcm5qNBC5vYT3KxH6Jpc6j.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 Edifier G5 Max features two mic setups: two built-in mics (for answering calls on the go) and one detachable boom mic (for when you want maximum clarity while gaming). Sounds great in theory, but in my testing, I thought both the mic’s performance was underwhelming.</p><audio src="https://cdn.mos.cms.futurecdn.net/G3qMZDL2HnVYXivcSknouj/Edifier%20G5%20Max%20%E2%80%94%20Built-in%20mics.mp3"  controls="controls" preload="none"></audio><p><br>I tested the built-in mics first and wasn’t impressed. As you can hear in the clip above, my voice sounds muffled and a little distant. My words don’t sound clear either, and the sibilance (“s” and “t” sounds) seems to bleed together.</p><audio src="https://cdn.mos.cms.futurecdn.net/DvraW5Mj7cjcb3zzhzt9vj/Edifier%20G5%20Max%20%E2%80%94%20Boom%20mic.mp3"  controls="controls" preload="none"></audio><p><br>The detachable boom mic, on the other hand, sounds slightly better than the built-in ones. This mic features dual environmental noise cancelation and AI-powered noise cancelation which works well — you can’t hear the TV in the background of the clip above. My voice also sounds better but it’s still fuzzy, and my high pitch in places sounds harsh and piercing. I would recommend the Asus ROG Pelta and its very clear mic if you play online.</p><h2 id="no-macos-companion-app">No macOS companion app</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uUKCZm2i2J9TtMecfwbVci" name="Hecate_G5_Max_Headphones_015.JPG" alt="Edifier G5 Max wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/uUKCZm2i2J9TtMecfwbVci.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>Annoyingly, the HECATE Driver Software isn’t compatible with macOS machines — even though the Edifier G5 Max itself is. If you don’t have access to a Windows laptop, you’ll need to rely on the Edifier ConneX smartphone app for customization… but that means you won’t be able to enable or use THX Spatial Audio, and you’ll miss out on one of the headset’s key features.</p><p>This isn’t a massive flaw, though, as THX Spatial Audio works only on Windows computers. On the PS5, you can enable 3D sound via the console’s settings to get 360° sound. This also isn’t the first time I’ve tested a gaming headset with Windows-only software — the Asus ROG Pelta springs to mind. The Final VR3000 EX doesn’t even have a desktop companion app, and customization via its mobile app is fairly limited.</p><h2 class="article-body__section" id="section-edifier-g5-max-review-verdict"><span>Edifier G5 Max review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="x79wGBQgxQ372ykyabUMcj" name="Hecate_G5_Max_Headphones_013.JPG" alt="Edifier G5 Max wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/x79wGBQgxQ372ykyabUMcj.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 Edifier G5 Max proves that you don’t need to spend top dollar to get an excellent gaming headset. Its combination of exceptional comfort, loooong battery life, immersive in-game audio, and easy customization make it an easy headset to recommend. It’s great for listening to music too as it’s Hi-Res certified — something its closest rivals aren’t.</p><p>That isn’t to say it’s perfect, but the G5 Max’s shortcomings feel relatively minor in the grand scheme of things. Its detachable boom mic works fine but doesn’t sound as clear as its competitors, and there’s no macOS app for customization. Neither issue detracts from what is otherwise an impressive package. If you prioritize immersive audio, all-day comfort, and battery life, the G5 Max should be your port of call.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/edifier-g5-max-review</link>
                                                                            <description>
                            <![CDATA[ The Edifier G5 Max is supremely comfortable and boasts excellent, immersive in-game audio, up to 305 hours of battery life, and dual companion apps. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">yicJqH3c3Mr9ZvNxsi4PZX</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/N5FnhreakFjLwrSR8gipHc-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 07 Aug 2026 15:38:34 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres.&lt;/p&gt;&lt;p&gt;A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/N5FnhreakFjLwrSR8gipHc-1280-80.jpg">
                                                            <media:credit><![CDATA[Nikita Achanta / Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Edifier G5 Max gaming headset]]></media:description>                                                            <media:text><![CDATA[Edifier G5 Max gaming headset]]></media:text>
                                <media:title type="plain"><![CDATA[Edifier G5 Max gaming headset]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/N5FnhreakFjLwrSR8gipHc-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">best gaming headsets</a> can truly elevate your experience by making you feel like the main character — and that’s exactly what the Edifier G5 Max does. Though it enters a crowded market where premium features are no longer reserved for premium prices, it certainly makes an impression.</p><p>With support for Hi-Res Audio, THX Spatial Audio, and an eye-catching 305-hour battery life, the G5 Max gives you little to complain about. In-game audio is outstanding, while the headset itself is extremely comfortable for all-day wear. While it isn’t flawless, as its mic(s) aren’t anything to write home about, I still think the G5 Max is worth the asking price.</p><p>To find out if this is the right headset for you, read my full Edifier G5 Max review.</p><h2 class="article-body__section" id="section-edifier-g5-max-review-specs"><span>Edifier G5 Max review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/Edifier-Gaming-Headset-Battery-Audio/dp/B0GLMSCLK5/" target="_blank" rel="nofollow">$149</a> / <a href="https://www.amazon.co.uk/Edifier-G5-MAX-Wireless-Headset-Space-Grey/dp/B0GKPB74M8/" target="_blank" rel="nofollow">£159</a></p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Space Gray, White</p></td></tr><tr><td class="firstcol " ><p><strong>Platforms</strong></p></td><td  ><p>PS5, PS4, Nintendo Switch 2, Nintendo Switch, PC, macOS, iOS, Android</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Bluetooth 6.0, 2.4GHz, USB-A wired</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>Rechargeable</p></td></tr><tr><td class="firstcol " ><p><strong>Battery life (rated)</strong></p></td><td  ><p>305 hours (Bluetooth) | 227 hours (2.4GHz)</p></td></tr><tr><td class="firstcol " ><p><strong>Frequency response</strong></p></td><td  ><p>20Hz-40KHz</p></td></tr><tr><td class="firstcol " ><p><strong>Drivers</strong></p></td><td  ><p>53mm dynamic</p></td></tr><tr><td class="firstcol " ><p><strong>Multipoint connectivity</strong></p></td><td  ><p>No</p></td></tr><tr><td class="firstcol " ><p><strong>Paired devices max</strong></p></td><td  ><p>1</p></td></tr><tr><td class="firstcol " ><p><strong>Microphone</strong></p></td><td  ><p>2x built-in mics; 1x detachable boom mic</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>10.75oz</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-edifier-g5-max-review-cheat-sheet"><span>Edifier G5 Max review: Cheat sheet</span></h2><ul><li><strong>What is it?</strong> A wireless gaming headset compatible with PS5, Nintendo Switch, PC and smartphones</li><li><strong>Who is it for?</strong> Anyone who wants an immersive gaming experience without breaking the bank</li><li><strong>How much does it cost? </strong>The Edifier G5 Max is available for <a href="https://www.amazon.com/Edifier-Gaming-Headset-Battery-Audio/dp/B0GLMSCLK5/" target="_blank" rel="nofollow">$149</a> / <a href="https://www.amazon.co.uk/Edifier-G5-MAX-Wireless-Headset-Space-Grey/dp/B0GKPB74M8/" target="_blank" rel="nofollow">£159</a></li><li><strong>What do we like?</strong> The comfortable design, immersive in-game audio, great music capabilities, long battery life, and more</li><li><strong>What don’t we like?</strong> The lack of a macOS companion app and the subpar mic performance</li></ul><h2 class="article-body__section" id="section-edifier-g5-max-review-the-ups"><span>Edifier G5 Max review: The ups</span></h2><p>The Edifier G5 Max is extremely comfortable and boasts all-round great sound in video games and while listening to music. Its companion apps make customization easy, too.</p><h2 id="extremely-comfortable">Extremely comfortable</h2><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="CBSoxTwPZucshhh9E6SAmi" name="Hecate_G5_Max_Headphones_003.JPG" alt="Edifier G5 Max wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/CBSoxTwPZucshhh9E6SAmi.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As someone who reviews gaming headsets for a living (and uses them in her free time too), I’ve been spoiled by the likes of the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/alienware-pro-wireless-gaming-headset-review">Alienware Pro Wireless Gaming Headset</a> ($229) and the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-blackshark-v3-pro-review">Razer BlackShark V3 Pro</a> ($249) when it comes to comfort. Though the Edifier G5 Max doesn’t cost as much, it’s an extremely comfortable headset, and one that hasn’t made my ears sweat, unlike the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/final-vr3000-ex-gaming-headset-review">Final VR3000 EX</a> ($149).</p><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="A3K2wvqdNsXFQqgqB7Y6dj" name="Hecate_G5_Max_Headphones_008.JPG" alt="Edifier G5 Max wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/A3K2wvqdNsXFQqgqB7Y6dj.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 G5 Max’s earcups feel very spacious and sit comfortably around my ears. The cushions and the headband are made of memory foam and “skin-friendly protein leather.” These are designed to elevate pressure you’d otherwise feel on the top of your head and around your ears. Having worn the headset for six straight hours, I can confirm that I didn’t feel any discomfort, so the G5 Max is great for prolonged wear.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3066px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="usbYLUUi9n2Y4mECorjLnc" name="Edifier-G5-Max-2" alt="Edifier G5 Max gaming headset" src="https://cdn.mos.cms.futurecdn.net/usbYLUUi9n2Y4mECorjLnc.jpg" mos="" align="middle" fullscreen="" width="3066" height="1725" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Nikita Achanta / Tom's Guide)</span></figcaption></figure><p>Aiding the G5 Max’s comfort level is its lightweight body. The headset weighs just 10.75oz, so it’s lighter than the Final VR3000 EX (13.72oz) and the first-party <a href="https://www.tomsguide.com/gaming/gaming-peripherals/sony-playstation-pulse-elite-headset-review">Sony PlayStation Pulse Elite</a> (12.2oz, $149). Speaking of, for the same price, the G5 Max’s build quality — especially of the earcups — feels superior to the PlayStation Pulse Elite’s.</p><h2 id="immersive-in-game-audio">Immersive in-game audio</h2><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="rqibBwfzaCxUnAGkiWpbbj" name="Hecate_G5_Max_Headphones_010.JPG" alt="Edifier G5 Max wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/rqibBwfzaCxUnAGkiWpbbj.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 Edifier G5 Max makes games sound simply gorgeous, thanks to its 53mm dynamic driver which covers a frequency response range of 20Hz to 40KHz — so the entirety of the average human hearing spectrum and then some. In addition to that, the G5 Max features custom 7.1.4 Spatial Audio (Windows-only) co-developed by HECATE and THX. This essentially puts you at the center of a 360° sound sphere, creating an immersive gaming experience.</p><p>And the G5 Max works extremely well. I played <a href="https://www.tomsguide.com/gaming/clair-obscur-expedition-33-review">Clair Obscur: Expedition 33</a> and <a href="https://www.tomsguide.com/gaming/assassins-creed-shadows-review">Assassin’s Creed Shadows</a> on my <a href="https://www.tomsguide.com/gaming/playstation/ps5-slim">PS5 Slim</a> to test the headset’s general console capabilities, and <a href="https://www.tomsguide.com/reviews/cyberpunk-2077-phantom-liberty">Cyberpunk 2077</a> on the <a href="https://www.tomsguide.com/computing/gaming-laptops/alienware-16x-aurora-review">Alienware 16X Aurora</a> to test the Spatial Audio. </p><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="U7RAibWDiPDD4YwwZyL6dj" name="Hecate_G5_Max_Headphones_009.JPG" alt="Edifier G5 Max wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/U7RAibWDiPDD4YwwZyL6dj.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As soon as I booted up Expedition 33, I was drawn into the Belle Époque world, with every orchestral score, environmental effect, and combat cue carrying immense detail. During a post-endgame secret boss fight, I appreciated being able to hear every combat cue so that I could time my parries perfectly, and these didn’t get lost as the symphonic metal background track swelled. I also enjoyed hearing my attacks land with plenty of low-end impact and <em>oomph</em>.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="TkhSKiqnKYadjcshmpQycj" name="Hecate_G5_Max_Headphones_011.JPG" alt="Edifier G5 Max wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/TkhSKiqnKYadjcshmpQycj.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>In Assassin’s Creed Shadows, I appreciated the G5 Max bringing the world of feudal Japan to life — from the rustling of the leaves in the wind and the trickling of waterfalls, to the clash of swords during heated battles and the protagonist’s hidden blade making a sharp <em>shing. </em>Dialogues sounded loud and clear, too, even when there were multiple voices speaking at once. I also appreciated the headset’s directionality in Shadows, as I could hear NPCs speaking in the right earcup — and then traveling to the left when I changed my direction.</p><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="E6Wzwo82WuKBabXgTrcRGj" name="Hecate_G5_Max_Headphones_005.JPG" alt="Edifier G5 Max wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/E6Wzwo82WuKBabXgTrcRGj.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>Cyberpunk 2077 really showed off what the G5 Max’s THX Spatial Audio could do. Walking through the neon-laden, chaotic streets of Night City felt extremely immersive, with different sounds emerging from different directions which made me feel like the main character. During firefights, I found it much easier to pinpoint where my enemies were positioned, thanks to the precise acoustics, which gave me a competitive advantage. This also made infiltrating enemy camps easier as all I had to do was listen out for footsteps and then execute stealth takedowns.</p><p>Overall, the G5 Max is ideal for a number of genres, including RPG and FPS titles. Combine that with the supreme comfort and you don’t even realize hours have gone by.</p><h2 id="great-for-music-too">Great for music, too</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="myVnztzZL23YeNTbDvp2bj" name="Hecate_G5_Max_Headphones_004.JPG" alt="Edifier G5 Max wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/myVnztzZL23YeNTbDvp2bj.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Alongside being excellent for gaming, the Edifier G5 Max is great for listening to music, too. It carries Hi-Res Audio and Hi-Res Audio Wireless certifications which means it can transmit and reproduce high-resolution digital audio formats with its 96KHz/24-bit sampling rate. This gives it a leg-up over other similarly priced gaming headsets, such as the Final VR3000 EX and the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/asus-rog-pelta-gaming-headset-review">Asus ROG Pelta</a> ($129) which aren’t Hi-Res certified.</p><p>I tested the G5 Max’s music capabilities by listening to a few of my favorite testing songs on <a href="https://www.tomsguide.com/audio/qobuz-review">Qobuz</a>, the <a href="https://www.tomsguide.com/buying-guide/best-music-streaming-services">best music streaming service</a> for audiophiles. I’ve been thoroughly impressed by the G5 Max’s airy and spacious soundstage, with every instrument and 070 Shake’s breathwork in ‘<a href="https://open.qobuz.com/track/291554006" target="_blank" rel="nofollow">Elephant</a>’ sounding layered. In ‘<a href="https://open.qobuz.com/track/161150239" target="_blank" rel="nofollow">Sultans of Swing</a>’ by Dire Straits, each note plucked on the guitar sounded clear and nuanced, while the softer bass provided a powerful backbone to the track.</p><p>For the price, the sound quality doesn’t give you a lot to complain about. If you want <em>even</em> better sound, though, I’d recommend spending an extra $50 on the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/sony-inzone-h6-air-review">Sony Inzone H6 Air</a> ($199) which utilizes studio-grade drivers.</p><p><em>Listen along to my review with the Edifier G5 Max testing playlist:</em></p><iframe allow="" height="390" width="378" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://widget.qobuz.com/playlist/68306967?zone=GB-en"></iframe><h2 id="two-useful-companion-apps">Two useful companion apps</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/6mikkFaAStu8NvRyzBNNTW.jpg" alt="Edifier G5 Max customization app screenshot" /><figcaption><small role="credit">Edifier / Hecate / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/UzcTK768ApgCQ7CDCm5cWW.jpg" alt="Edifier G5 Max customization app screenshot" /><figcaption><small role="credit">Edifier / Hecate / Tom's Guide</small></figcaption></figure></figure><p>There are two ways to customize the Edifier G5 Max: you can use either the Edifier ConneX <a href="https://play.google.com/store/apps/details?id=com.edifier.edifierconnex&hl=en_GB" target="_blank" rel="nofollow">Android</a>/<a href="https://apps.apple.com/us/app/edifier-connex/id6469028132" target="_blank" rel="nofollow">iOS</a> app, or the proprietary <a href="https://hecategaming.com/pages/driver-download-center?srsltid=AfmBOop6FlhDthZDgTwmINO1G8eN2Y2qo6sWJ8vdZs8_gbzyKECogHIh" target="_blank" rel="nofollow">HECATE Driver Software</a> on Windows. The former is handy for when you want to make on-the-fly adjustments, such as swapping between EQ presets, customizing your own EQ, and remapping the headset’s buttons. I tested it on my <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-10-pro-xl-review">Google Pixel 10 Pro XL</a> and appreciated its straightforward and easy to understand interface.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/YHodLFbAr5vnHSwsrMVSrW.jpg" alt="Edifier G5 Max customization app screenshot" /><figcaption><small role="credit">Edifier / Hecate / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/3UJHLfER9VGRtu8heuGroW.jpg" alt="Edifier G5 Max customization app screenshot" /><figcaption><small role="credit">Edifier / Hecate / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/9NuG7YkiTtMmRub8oJRHaW.jpg" alt="Edifier G5 Max customization app screenshot" /><figcaption><small role="credit">Edifier / Hecate / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Cy5Cp9wJAqwvdRGgQwy8mW.jpg" alt="Edifier G5 Max customization app screenshot" /><figcaption><small role="credit">Edifier / Hecate / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/SWf2gHMw2HMSe5w2U9tViW.jpg" alt="Edifier G5 Max customization app screenshot" /><figcaption><small role="credit">Edifier / Hecate / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/cacnfhJKLjuKs9DhxiLDfW.jpg" alt="Edifier G5 Max customization app screenshot" /><figcaption><small role="credit">Edifier / Hecate / Tom's Guide</small></figcaption></figure></figure><p>HECATE Driver Software is more detailed and offers more in-depth personalization. You can enable THX Spatial Audio, adjust the mic’s settings, make extensive adjustments to the RGB lighting, and enable game-specific EQ presets (Valorant, PUBG, Battlefield 5, Overwatch, and more). The desktop app doesn’t feature any intrusive ads or pop-ups, making it a breeze to use.</p><h2 id="astonishing-305-hour-battery">Astonishing 305-hour battery</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="AohnawsbMTSaEfa54Lzdaj" name="Hecate_G5_Max_Headphones_006.JPG" alt="Edifier G5 Max wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/AohnawsbMTSaEfa54Lzdaj.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you need a gaming headset that doesn’t run out of battery too quickly, the Edifier G5 Max should be your port of call. I can only describe its battery life as astonishing, as it’s rated for 305 hours over Bluetooth or 227 hours over 2.4GHz. The G5 Max, then, blows its competition out of the water. Other similarly priced headsets, such as the Final VR3000 EX (55 hours), Sony PlayStation Pulse Elite (30 hours), and Asus ROG Pelta (90 hours), simply fall short.</p><p>Not just that, but even pricier headsets don’t last as long, like the Razer BlackShark V3 Pro (70 hours), the Alienware Pro Wireless Gaming Headset (70 hours) and even the extortionate <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-elite-review">SteelSeries Arctis Nova Elite</a> (60 hours, $599).</p><p>I would have to game <em>a lot </em>to kill the G5 Max’s battery, but after having used it for eight hours and left it running overnight with my PS5 turned on — so a total of 18 hours or so — the battery had dipped by only 7%. That’s great.</p><h2 class="article-body__section" id="section-edifier-g5-max-review-the-downs"><span>Edifier G5 Max review: The downs</span></h2><p>The Edifier G5 Max is great but it’s important to note that its microphones aren’t the best, and there’s no macOS companion app.</p><h2 id="subpar-mic-s-performance">Subpar mic(s) performance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Lcm5qNBC5vYT3KxH6Jpc6j" name="Hecate_G5_Max_Headphones_007.JPG" alt="Edifier G5 Max wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/Lcm5qNBC5vYT3KxH6Jpc6j.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 Edifier G5 Max features two mic setups: two built-in mics (for answering calls on the go) and one detachable boom mic (for when you want maximum clarity while gaming). Sounds great in theory, but in my testing, I thought both the mic’s performance was underwhelming.</p><audio src="https://cdn.mos.cms.futurecdn.net/G3qMZDL2HnVYXivcSknouj/Edifier%20G5%20Max%20%E2%80%94%20Built-in%20mics.mp3"  controls="controls" preload="none"></audio><p><br>I tested the built-in mics first and wasn’t impressed. As you can hear in the clip above, my voice sounds muffled and a little distant. My words don’t sound clear either, and the sibilance (“s” and “t” sounds) seems to bleed together.</p><audio src="https://cdn.mos.cms.futurecdn.net/DvraW5Mj7cjcb3zzhzt9vj/Edifier%20G5%20Max%20%E2%80%94%20Boom%20mic.mp3"  controls="controls" preload="none"></audio><p><br>The detachable boom mic, on the other hand, sounds slightly better than the built-in ones. This mic features dual environmental noise cancelation and AI-powered noise cancelation which works well — you can’t hear the TV in the background of the clip above. My voice also sounds better but it’s still fuzzy, and my high pitch in places sounds harsh and piercing. I would recommend the Asus ROG Pelta and its very clear mic if you play online.</p><h2 id="no-macos-companion-app">No macOS companion app</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uUKCZm2i2J9TtMecfwbVci" name="Hecate_G5_Max_Headphones_015.JPG" alt="Edifier G5 Max wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/uUKCZm2i2J9TtMecfwbVci.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>Annoyingly, the HECATE Driver Software isn’t compatible with macOS machines — even though the Edifier G5 Max itself is. If you don’t have access to a Windows laptop, you’ll need to rely on the Edifier ConneX smartphone app for customization… but that means you won’t be able to enable or use THX Spatial Audio, and you’ll miss out on one of the headset’s key features.</p><p>This isn’t a massive flaw, though, as THX Spatial Audio works only on Windows computers. On the PS5, you can enable 3D sound via the console’s settings to get 360° sound. This also isn’t the first time I’ve tested a gaming headset with Windows-only software — the Asus ROG Pelta springs to mind. The Final VR3000 EX doesn’t even have a desktop companion app, and customization via its mobile app is fairly limited.</p><h2 class="article-body__section" id="section-edifier-g5-max-review-verdict"><span>Edifier G5 Max review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="x79wGBQgxQ372ykyabUMcj" name="Hecate_G5_Max_Headphones_013.JPG" alt="Edifier G5 Max wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/x79wGBQgxQ372ykyabUMcj.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 Edifier G5 Max proves that you don’t need to spend top dollar to get an excellent gaming headset. Its combination of exceptional comfort, loooong battery life, immersive in-game audio, and easy customization make it an easy headset to recommend. It’s great for listening to music too as it’s Hi-Res certified — something its closest rivals aren’t.</p><p>That isn’t to say it’s perfect, but the G5 Max’s shortcomings feel relatively minor in the grand scheme of things. Its detachable boom mic works fine but doesn’t sound as clear as its competitors, and there’s no macOS app for customization. Neither issue detracts from what is otherwise an impressive package. If you prioritize immersive audio, all-day comfort, and battery life, the G5 Max should be your port of call.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I spent a week with the Razer Seiren V3 Pro — here’s how it stacks up to my Elgato Wave 3 ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I’ve been podcasting for the better part of 14 years, and the one piece of gear I’ve invested in more than anything else is one of the <a href="https://www.tomsguide.com/best-picks/best-microphones">best microphones</a>. After all, people will forgive so-so or even boring visuals as long as the audio is solid. I ran a Samson C01U Pro for years before switching to my current <a href="https://www.tomsguide.com/reviews/elgato-wave-3-microphone">Elgato Wave 3</a>, and I’m still happy with it. That said, I’ve been testing a pretty strong rival lately — the Razer Seiren V3 Pro.</p><p>Razer’s latest Seiren is a studio-leaning dynamic mic aimed squarely at podcasters and creators who want cleaner sound without a ton of extra gear. It has a solid, Shure-inspired look and comes packed with built-in processing tools that actually help you sound better right out of the box. At $249, it’s not cheap, but you’re getting dual USB-C and XLR connectivity, a 30 mm capsule, and some useful onboard features for the money.</p><p>So, will I ditch my beloved Wave 3 for the Seiren V3 Pro? Read on for what this mic is all about and how it held up after a week of real use.</p><div class="product"><a data-dimension112="03efcb36-8d21-11f1-9888-91fd9399c585" data-action="Deal Block" data-label="Seiren V3 Pro" data-dimension48="Seiren V3 Pro" data-dimension25="$249" href="https://www.amazon.com/Razer-Seiren-Pro-Microphone-Built/dp/B0H1DW8HXQ" 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="rqgYtPsERxh7UatykS8Z3k" name="Razer Seiren V3 Pro" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/rqgYtPsERxh7UatykS8Z3k.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Razer Seiren V3 Pro is a microphone built for streamers, podcasters, and creators who want clear, professional audio with minimal fuss. Its cardioid pattern captures focused vocals while reducing background noise, and its onboard processing tools deliver excellent sound out of the box. Though it's not cheap, it'll take your podcasting/content creation to the next level.<a class="view-deal button" href="https://www.amazon.com/Razer-Seiren-Pro-Microphone-Built/dp/B0H1DW8HXQ" target="_blank" rel="nofollow" data-dimension112="03efcb36-8d21-11f1-9888-91fd9399c585" data-action="Deal Block" data-label="Seiren V3 Pro" data-dimension48="Seiren V3 Pro" data-dimension25="$249">View Deal</a></p></div><h2 id="razer-seiren-v3-pro-what-is-it">Razer Seiren V3 Pro: What is it?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5050px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="fDR6d9yR9W7skBDRoKrrGP" name="Razer Seiren V3 Pro-5" alt="Razer Seiren V3 Pro" src="https://cdn.mos.cms.futurecdn.net/fDR6d9yR9W7skBDRoKrrGP.jpg" mos="" align="middle" fullscreen="" width="5050" height="2841" attribution="" endorsement="" class="inline"></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 I dig into my experience with the Seiren V3 Pro, here’s a quick look at the features so you know what you’re dealing with.</p><p>The Seiren V3 Pro is built to deliver the warm, broadcast-style sound many podcasters and streamers are after. Its cardioid pickup pattern means you speak into the top of the mic, which focuses on your voice while rejecting noise from the sides and rear. That’s especially useful if you’re recording in a regular room rather than a treated studio. It also includes a built-in shock absorber and a removable pop filter to minimize noise and plosives before they reach your recording.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4734px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="WCYE9stSXsy6BZpKU4EEgN" name="Razer Seiren V3 Pro-3" alt="Razer Seiren V3 Pro" src="https://cdn.mos.cms.futurecdn.net/WCYE9stSXsy6BZpKU4EEgN.jpg" mos="" align="middle" fullscreen="" width="4734" height="2663" attribution="" endorsement="" class="inline"></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 standout features is the dual connectivity. You get USB-C for simple plug-and-play use, plus a full XLR connection when you want to run it through a proper audio interface or mixer. That flexibility means the same mic can sit on a basic streaming desk one day and move into a more serious recording setup the next — no need to buy two different mics!</p><p>On the software side, Razer includes onboard DSP tools such as a compressor, expander, limiter, and an AI noise remover. There’s also 32-bit float support in the Razer Synapse app, which gives you more headroom and less chance of clipping when you get loud. </p><p>Between the processing and the extra dynamic range, much of the cleanup happens before the audio even reaches your computer. A physical gain dial sits right on the mic for quick adjustments, and the Chroma RGB ring serves as both a status indicator (mute, levels, etc.) and a bit of customizable flair.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5150px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="tAyRBBGGgUwkhLVn4BobnX" name="Razer Seiren V3 Pro-8" alt="Razer Seiren V3 Pro" src="https://cdn.mos.cms.futurecdn.net/tAyRBBGGgUwkhLVn4BobnX.jpg" mos="" align="middle" fullscreen="" width="5150" height="2897" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Overall, the Seiren V3 Pro feels like the best of both worlds: easy enough for more casual users like me to set up and start using, but with enough depth and customization to keep the more serious audio folks happy.</p><h2 id="razer-seiren-v3-pro-my-experience">Razer Seiren V3 Pro: My experience</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4721px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="wMR7YgR4vCdytLdJQo76MU" name="Razer Seiren V3 Pro-2" alt="Razer Seiren V3 Pro" src="https://cdn.mos.cms.futurecdn.net/wMR7YgR4vCdytLdJQo76MU.jpg" mos="" align="middle" fullscreen="" width="4721" height="2656" attribution="" endorsement="" class="inline"></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 impressed the second I pulled the Razer Seiren V3 Pro out of the box. It’s a slick-looking piece of kit. Objectively, it doesn’t look all that different from other cardioid mics, but it’s a design style I’ve always liked and rarely had the chance to use. Inside the box, you get the mic, its stand, and a long USB cable. One end is USB-A, and Razer includes a USB-A-to-USB-C adapter, a thoughtful little touch.</p><p>Once you plug it into your PC and open the Razer Synapse app, it guides you through a quick setup. You speak into the mic at a normal volume, record a bit of ambient noise, tell it what you’re using it for (podcasting, in my case), and how far the mic is from you. That’s it. The whole process takes less than five minutes and does much of the heavy lifting for you.</p><p>I’m generally happy with the recording quality. My voice comes through full, and there’s almost no background noise. The only real issue is specific to my setup: the mic sits about two feet away from me, and because I live in a pretty bare studio apartment, it can pick up a bit of that empty-room sound. I don’t have that problem with my Elgato Wave 3 since it’s on an arm and I can pull it right up to my mouth. I can’t do that as easily with the Razer, but even at a less-than-ideal distance, the audio still sounds solid.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1919px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="tbbBruAfb26hfJdDc2JEJG" name="Razer Seiren V3 Pro - Synapse" alt="Razer Synapse" src="https://cdn.mos.cms.futurecdn.net/tbbBruAfb26hfJdDc2JEJG.jpg" mos="" align="middle" fullscreen="" width="1919" height="1079" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / Razer)</span></figcaption></figure><p>I’m not an audiophile, and I don’t like fussing with settings, so the preset options in Synapse work perfectly fine for me. You can dig in and tweak everything if you want, and I’m sure I could squeeze out even better results with some fine-tuning. For most people, though, the out-of-the-box presets are more than good enough.</p><p>The one real annoyance I encountered is how easy it is to accidentally mute yourself while adjusting the mic. The mute “button” is a large, sensitive target area, and it’s almost impossible not to graze it when repositioning the mic. A proper physical button that requires a bit of force to press would have solved this easily.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ONq1JW"></div>                            </div>                            <script src="https://kwizly.com/embed/ONq1JW.js" async></script><h2 id="razer-seiren-v3-pro-bottom-line">Razer Seiren V3 Pro: Bottom line</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3865px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xZbxZnEVtx7mXth9G2zUNd" name="Razer Seiren V3 Pro-7" alt="Razer Seiren V3 Pro" src="https://cdn.mos.cms.futurecdn.net/xZbxZnEVtx7mXth9G2zUNd.jpg" mos="" align="middle" fullscreen="" width="3865" height="2174" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>This is my first time using a Razer microphone, and I have to say that I’m pretty impressed. Between the clean design and the solid set of features, the Seiren V3 Pro feels like a real step up for anyone looking to take their podcasting or content creation more seriously. Yeah, $249 is a chunk of money, and there are cheaper options out there. But if you decide to spend it, I don’t think you’ll walk away disappointed.</p><p>So, back to the question I asked at the start: will I switch from my Elgato Wave 3 to the Razer Seiren V3 Pro? Right now, no. I’d get a lot more out of this mic if I had it on a proper arm so I could keep it closer to my mouth. That said, it’s compact enough that I’ll definitely be tossing it in my bag for podcasting on the road. It’s a fantastic microphone that can make you sound like a pro, and at the end of the day, that’s exactly what I’m after.</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/tvs/yes-your-tv-probably-has-a-microphone-in-it-heres-how-to-turn-it-off">Yes, your TV probably has a microphone in it — here's how to turn it off</a></li><li><a href="https://www.tomsguide.com/best-picks/best-cheap-headphones">The best cheap headphones: big sound for less</a></li><li><a href="https://www.tomsguide.com/audio/microphones/shure-SM4-review">Shure SM4 review: This musician’s microphone is perfect for beginners</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/peripherals/i-spent-a-week-with-the-razer-seiren-v3-pro-heres-how-it-stacks-up-to-my-elgato-wave-3</link>
                                                                            <description>
                            <![CDATA[ The Razer Seiren V3 Pro is a slick, feature-packed podcasting mic. After a week of testing, can it actually beat the Elgato Wave 3? Here’s my honest take. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">7MYAkP9Ydc8mVwagZiHMyk</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/i5XnJDSFEEDhLa8yBc66wB-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 01 Aug 2026 11:45:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></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/i5XnJDSFEEDhLa8yBc66wB-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Razer Seiren V3 Pro]]></media:description>                                                            <media:text><![CDATA[Razer Seiren V3 Pro]]></media:text>
                                <media:title type="plain"><![CDATA[Razer Seiren V3 Pro]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/i5XnJDSFEEDhLa8yBc66wB-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I’ve been podcasting for the better part of 14 years, and the one piece of gear I’ve invested in more than anything else is one of the <a href="https://www.tomsguide.com/best-picks/best-microphones">best microphones</a>. After all, people will forgive so-so or even boring visuals as long as the audio is solid. I ran a Samson C01U Pro for years before switching to my current <a href="https://www.tomsguide.com/reviews/elgato-wave-3-microphone">Elgato Wave 3</a>, and I’m still happy with it. That said, I’ve been testing a pretty strong rival lately — the Razer Seiren V3 Pro.</p><p>Razer’s latest Seiren is a studio-leaning dynamic mic aimed squarely at podcasters and creators who want cleaner sound without a ton of extra gear. It has a solid, Shure-inspired look and comes packed with built-in processing tools that actually help you sound better right out of the box. At $249, it’s not cheap, but you’re getting dual USB-C and XLR connectivity, a 30 mm capsule, and some useful onboard features for the money.</p><p>So, will I ditch my beloved Wave 3 for the Seiren V3 Pro? Read on for what this mic is all about and how it held up after a week of real use.</p><div class="product"><a data-dimension112="03efcb36-8d21-11f1-9888-91fd9399c585" data-action="Deal Block" data-label="Seiren V3 Pro" data-dimension48="Seiren V3 Pro" data-dimension25="$249" href="https://www.amazon.com/Razer-Seiren-Pro-Microphone-Built/dp/B0H1DW8HXQ" 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="rqgYtPsERxh7UatykS8Z3k" name="Razer Seiren V3 Pro" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/rqgYtPsERxh7UatykS8Z3k.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Razer Seiren V3 Pro is a microphone built for streamers, podcasters, and creators who want clear, professional audio with minimal fuss. Its cardioid pattern captures focused vocals while reducing background noise, and its onboard processing tools deliver excellent sound out of the box. Though it's not cheap, it'll take your podcasting/content creation to the next level.<a class="view-deal button" href="https://www.amazon.com/Razer-Seiren-Pro-Microphone-Built/dp/B0H1DW8HXQ" target="_blank" rel="nofollow" data-dimension112="03efcb36-8d21-11f1-9888-91fd9399c585" data-action="Deal Block" data-label="Seiren V3 Pro" data-dimension48="Seiren V3 Pro" data-dimension25="$249">View Deal</a></p></div><h2 id="razer-seiren-v3-pro-what-is-it">Razer Seiren V3 Pro: What is it?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5050px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="fDR6d9yR9W7skBDRoKrrGP" name="Razer Seiren V3 Pro-5" alt="Razer Seiren V3 Pro" src="https://cdn.mos.cms.futurecdn.net/fDR6d9yR9W7skBDRoKrrGP.jpg" mos="" align="middle" fullscreen="" width="5050" height="2841" attribution="" endorsement="" class="inline"></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 I dig into my experience with the Seiren V3 Pro, here’s a quick look at the features so you know what you’re dealing with.</p><p>The Seiren V3 Pro is built to deliver the warm, broadcast-style sound many podcasters and streamers are after. Its cardioid pickup pattern means you speak into the top of the mic, which focuses on your voice while rejecting noise from the sides and rear. That’s especially useful if you’re recording in a regular room rather than a treated studio. It also includes a built-in shock absorber and a removable pop filter to minimize noise and plosives before they reach your recording.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4734px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="WCYE9stSXsy6BZpKU4EEgN" name="Razer Seiren V3 Pro-3" alt="Razer Seiren V3 Pro" src="https://cdn.mos.cms.futurecdn.net/WCYE9stSXsy6BZpKU4EEgN.jpg" mos="" align="middle" fullscreen="" width="4734" height="2663" attribution="" endorsement="" class="inline"></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 standout features is the dual connectivity. You get USB-C for simple plug-and-play use, plus a full XLR connection when you want to run it through a proper audio interface or mixer. That flexibility means the same mic can sit on a basic streaming desk one day and move into a more serious recording setup the next — no need to buy two different mics!</p><p>On the software side, Razer includes onboard DSP tools such as a compressor, expander, limiter, and an AI noise remover. There’s also 32-bit float support in the Razer Synapse app, which gives you more headroom and less chance of clipping when you get loud. </p><p>Between the processing and the extra dynamic range, much of the cleanup happens before the audio even reaches your computer. A physical gain dial sits right on the mic for quick adjustments, and the Chroma RGB ring serves as both a status indicator (mute, levels, etc.) and a bit of customizable flair.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5150px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="tAyRBBGGgUwkhLVn4BobnX" name="Razer Seiren V3 Pro-8" alt="Razer Seiren V3 Pro" src="https://cdn.mos.cms.futurecdn.net/tAyRBBGGgUwkhLVn4BobnX.jpg" mos="" align="middle" fullscreen="" width="5150" height="2897" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Overall, the Seiren V3 Pro feels like the best of both worlds: easy enough for more casual users like me to set up and start using, but with enough depth and customization to keep the more serious audio folks happy.</p><h2 id="razer-seiren-v3-pro-my-experience">Razer Seiren V3 Pro: My experience</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4721px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="wMR7YgR4vCdytLdJQo76MU" name="Razer Seiren V3 Pro-2" alt="Razer Seiren V3 Pro" src="https://cdn.mos.cms.futurecdn.net/wMR7YgR4vCdytLdJQo76MU.jpg" mos="" align="middle" fullscreen="" width="4721" height="2656" attribution="" endorsement="" class="inline"></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 impressed the second I pulled the Razer Seiren V3 Pro out of the box. It’s a slick-looking piece of kit. Objectively, it doesn’t look all that different from other cardioid mics, but it’s a design style I’ve always liked and rarely had the chance to use. Inside the box, you get the mic, its stand, and a long USB cable. One end is USB-A, and Razer includes a USB-A-to-USB-C adapter, a thoughtful little touch.</p><p>Once you plug it into your PC and open the Razer Synapse app, it guides you through a quick setup. You speak into the mic at a normal volume, record a bit of ambient noise, tell it what you’re using it for (podcasting, in my case), and how far the mic is from you. That’s it. The whole process takes less than five minutes and does much of the heavy lifting for you.</p><p>I’m generally happy with the recording quality. My voice comes through full, and there’s almost no background noise. The only real issue is specific to my setup: the mic sits about two feet away from me, and because I live in a pretty bare studio apartment, it can pick up a bit of that empty-room sound. I don’t have that problem with my Elgato Wave 3 since it’s on an arm and I can pull it right up to my mouth. I can’t do that as easily with the Razer, but even at a less-than-ideal distance, the audio still sounds solid.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1919px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="tbbBruAfb26hfJdDc2JEJG" name="Razer Seiren V3 Pro - Synapse" alt="Razer Synapse" src="https://cdn.mos.cms.futurecdn.net/tbbBruAfb26hfJdDc2JEJG.jpg" mos="" align="middle" fullscreen="" width="1919" height="1079" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / Razer)</span></figcaption></figure><p>I’m not an audiophile, and I don’t like fussing with settings, so the preset options in Synapse work perfectly fine for me. You can dig in and tweak everything if you want, and I’m sure I could squeeze out even better results with some fine-tuning. For most people, though, the out-of-the-box presets are more than good enough.</p><p>The one real annoyance I encountered is how easy it is to accidentally mute yourself while adjusting the mic. The mute “button” is a large, sensitive target area, and it’s almost impossible not to graze it when repositioning the mic. A proper physical button that requires a bit of force to press would have solved this easily.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ONq1JW"></div>                            </div>                            <script src="https://kwizly.com/embed/ONq1JW.js" async></script><h2 id="razer-seiren-v3-pro-bottom-line">Razer Seiren V3 Pro: Bottom line</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3865px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xZbxZnEVtx7mXth9G2zUNd" name="Razer Seiren V3 Pro-7" alt="Razer Seiren V3 Pro" src="https://cdn.mos.cms.futurecdn.net/xZbxZnEVtx7mXth9G2zUNd.jpg" mos="" align="middle" fullscreen="" width="3865" height="2174" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>This is my first time using a Razer microphone, and I have to say that I’m pretty impressed. Between the clean design and the solid set of features, the Seiren V3 Pro feels like a real step up for anyone looking to take their podcasting or content creation more seriously. Yeah, $249 is a chunk of money, and there are cheaper options out there. But if you decide to spend it, I don’t think you’ll walk away disappointed.</p><p>So, back to the question I asked at the start: will I switch from my Elgato Wave 3 to the Razer Seiren V3 Pro? Right now, no. I’d get a lot more out of this mic if I had it on a proper arm so I could keep it closer to my mouth. That said, it’s compact enough that I’ll definitely be tossing it in my bag for podcasting on the road. It’s a fantastic microphone that can make you sound like a pro, and at the end of the day, that’s exactly what I’m after.</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/tvs/yes-your-tv-probably-has-a-microphone-in-it-heres-how-to-turn-it-off">Yes, your TV probably has a microphone in it — here's how to turn it off</a></li><li><a href="https://www.tomsguide.com/best-picks/best-cheap-headphones">The best cheap headphones: big sound for less</a></li><li><a href="https://www.tomsguide.com/audio/microphones/shure-SM4-review">Shure SM4 review: This musician’s microphone is perfect for beginners</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ This $399 SteelSeries headset works on every platform: I tested it for a month to see if it's worth your cash ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The SteelSeries Arctis Nova Pro Omni is the successor to 2022’s fantastic Arctis Nova Pro. The reasoning behind adding the ‘Omni’ bit is twofold: the new headset now packs an omnidirectional microphone, but it also works on every major platform.</p><p>Now, the technical challenge of making an all-platform headset is not to be sniffed at. <a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-tested-reddits-favorite-high-end-gaming-headsets-and-theres-a-clear-winner-but-its-not-the-one-i-expected"><u>Gaming headsets</u></a> typically come in either Xbox or PlayStation guise, due to lots of proprietary software nonsense (mostly from Microsoft) — malarkey that SteelSeries has managed to negotiate its way around.</p><p>Creating a worthy successor to the Nova Pro would’ve no doubt been a little easier. While old, the Pro is a fantastic gaming headset that still holds up today, so SteelSeries didn’t have to do much. It changed the mic, widened the connectivity, tweaked the drivers and added a little of the Nova Elite’s polish. <em>Voilà</em>.</p><p>So, is this one of the <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets"><u>best gaming headsets</u></a> out there? Certainly. Keep reading my full SteelSeries Arctis Nova Omni review to find out more.</p><h2 class="article-body__section" id="section-steelseries-arctis-nova-pro-omni-review-cheat-sheet"><span>SteelSeries Arctis Nova Pro Omni review: Cheat sheet</span></h2><ul><li><strong>What is it?</strong> A premium gaming headset and successor to the original Arctis Nova Pro</li><li><strong>What does it cost? </strong>Quite a bit: <a href="https://www.amazon.com/SteelSeries-Arctis-Nova-Pro-Omni-PlayStation/dp/B0GS77JQLF" target="_blank" rel="nofollow"><u>$399</u></a> / <a href="https://www.amazon.co.uk/SteelSeries-Arctis-Nova-Pro-Omni-Graphite/dp/B0GVZFQ8N2" target="_blank" rel="nofollow"><u>£349</u></a></li><li><strong>Who is it for?</strong> Competitive and/or multi-platform gamers who value sound quality</li><li><strong>What’s good?</strong> The sound, connectivity options, comfort, new mic and ‘zero-downtime’ battery</li><li><strong>What’s not?</strong> The ANC isn’t as good as SteelSeries says, and it’s pricey</li></ul><h2 class="article-body__section" id="section-steelseries-arctis-nova-pro-omni-review-specs"><span>SteelSeries Arctis Nova Pro Omni review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/SteelSeries-Arctis-Nova-Pro-Omni-PlayStation/dp/B0GS77JQLF" target="_blank" rel="nofollow"><u>$399</u></a> / <a href="https://www.amazon.co.uk/SteelSeries-Arctis-Nova-Pro-Omni-Graphite/dp/B0GVZFQ8N2" target="_blank" rel="nofollow"><u>£349</u></a></p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Black; blue; white</p></td></tr><tr><td class="firstcol " ><p><strong>Platforms</strong></p></td><td  ><p>PC, Mac, Xbox, PS5, Switch, Steam Deck/handheld; Meta Quest 2 & 3, iOS, iPadOS, Android</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Wired, 3x 2.4Ghz, 1x Bluetooth</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>2x rechargeable</p></td></tr><tr><td class="firstcol " ><p><strong>Battery life</strong></p></td><td  ><p>60 hours combined</p></td></tr><tr><td class="firstcol " ><p><strong>Frequency response</strong></p></td><td  ><p>10-40,000Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Drivers</strong></p></td><td  ><p>40mm dynamic</p></td></tr><tr><td class="firstcol " ><p><strong>Multipoint connectivity</strong></p></td><td  ><p>Yes</p></td></tr><tr><td class="firstcol " ><p><strong>Paired devices max</strong></p></td><td  ><p>4 (3x 2.4G, 1x BT, 1x Wired simultaneously)</p></td></tr><tr><td class="firstcol " ><p><strong>Microphone</strong></p></td><td  ><p>Omnidirectional boom mic</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>11.9 ounces / 339 grams</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-steelseries-arctis-nova-pro-omni-review-the-ups"><span>SteelSeries Arctis Nova Pro Omni review: The ups</span></h2><p>From the excellent sound quality to the reams of control, plenty of connectivity options, and comfortable design, there’s a lot I love about the Arctis Nova Omni.</p><h2 id="killer-sound-quality">Killer sound quality</h2><p>Obviously, the most important thing about any gaming headset is how it sounds when gaming. Thankfully, the Nova Pro Omni has sound quality in buckets, sporting 96K / 24-bit hi-res audio over Wi-Fi. </p><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="S2JAfATxFYLeYAbrQhj7b5" name="SteelSeries Arctis Nova Pro Omni-7.JPG" alt="The SteelSeries Arctis Nova Pro Omni on a stone surface against a blue background" src="https://cdn.mos.cms.futurecdn.net/S2JAfATxFYLeYAbrQhj7b5.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>It lacks the carbon fiber drivers of the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-elite-review"><u>SteelSeries Arctis Nova Elite</u></a>, but the neodymium drivers have been re-tuned from the <a href="https://www.tomsguide.com/reviews/steelseries-arctis-nova-pro-wireless"><u>Arctis Nova Pro</u></a> for tighter bass response. Bass is indeed nice and punchy — the booms of explosions in <em>Isonzo</em> and the rumbles of tanks in <em>Hell Let Loose</em> all sounded powerful and frightening, with no distortion perceptible. You won’t get that stomach-quivering sub bass as you would from a subwoofer, but if that’s what you’re after, I’d advise the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arena-9-review"><u>SteelSeries Arena 9</u></a> speaker system.</p><p>There’s a decent amount of mid-range resolution, with satisfying mechanical clicks and clacks to reloads in <em>Hell Let Loose</em>, and a thrumming timbre to car engine noise in <em>Forza Horizon 5</em>.</p><p>The Nova Pro Omni’s treble is impressively light and airy, giving bags of fine detail. Combined with strong spatial imaging, this helps you pinpoint enemy footsteps. I was able to hear enemies walking and reloading in <em>Counter-Strike 2</em>, which was enough to score me a few kills I wouldn’t otherwise have got. In <em>Isonzo</em>, I was able to precisely track an enemy snaking through a trench behind and around me, helping me get the jump on them and score a kill.</p><p>The sound quality makes the Nova Pro Omni pretty good for music, too. I tested the headset using my usual audio testing playlist on <a href="https://www.tomsguide.com/audio/qobuz-review"><u>Qobuz</u></a>, the <a href="https://www.tomsguide.com/buying-guide/best-music-streaming-services"><u>best music streaming service</u></a> for audiophiles, and had no complaints — I’d rather put $399 into the Omni than overpriced premium headphones like the $449 <a href="https://www.tomsguide.com/audio/over-ear-headphones/bose-quietcomfort-ultra-headphones-2nd-generation-review"><u>Bose QuietComfort Ultra Gen II</u></a>.</p><p><em>Listen along to my audio testing playlist on Qobuz.</em></p><iframe allow="" height="390" width="400" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://widget.qobuz.com/playlist/59666746?zone=GB-en"></iframe><h2 id="bags-of-control">Bags of control</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/fBrzNXyYT8MvaYSPRy4uu4.jpg" alt="A screenshot of the SteelSeries GG app" /><figcaption><small role="credit">SteelSeries</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/ez6UeSsC5mgGfu9xPb5qy4.jpg" alt="A screenshot of the SteelSeries GG app" /><figcaption><small role="credit">SteelSeries</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/i4FLdqDYiJ4tSSQ94DLch4.jpg" alt="A screenshot of the SteelSeries GG app" /><figcaption><small role="credit">SteelSeries</small></figcaption></figure></figure><p>As with SteelSeries’ other high-end headsets, the Nova Pro Omni comes with a desktop USB DAC/hub. This serves as a wired connection hub, but it’s also the primary way to control your headset on-the-fly, letting you quickly adjust EQ (including a custom EQ profile), ANC and microphone settings as you game.</p><p>For more in-depth control, the SteelSeries GG app is perfect. In GG, you get greater customization over audio and mic EQ, including per-game audio presets to help you tailor your sound to individual titles. GG is slick, reliable and delivers genuine performance enhancements, and I much prefer it to the bloatware from other brands, like Asus’ Armoury Crate.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2076px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="AtEZRUTSfkV8g4dGmJ6Dp4" name="SteelSeries Arctis Nova Pro Omni_Screens-4" alt="A screenshot of the SteelSeries GG app running Sonar" src="https://cdn.mos.cms.futurecdn.net/AtEZRUTSfkV8g4dGmJ6Dp4.jpg" mos="" align="middle" fullscreen="1" width="2076" height="1168" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/AtEZRUTSfkV8g4dGmJ6Dp4.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">A screenshot of Sonar running via the SteelSeries GG app. </span><span class="credit" itemprop="copyrightHolder">(Image credit: SteelSeries)</span></figcaption></figure><p>There’s also Sonar, which is a digital audio interface to mix game audio, mic, stream and chat levels. I don’t have much use for Sonar, as I’m not a streamer and only need to monitor audio and mic levels. But it’ll be a handy tool for any streaming newbies who haven’t got the cash yet to invest in a more advanced audio interface</p><h2 id="wide-compatibility">Wide compatibility</h2><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="99bb67ftAuQXHpa3qCG4g5" name="SteelSeries Arctis Nova Pro Omni-12.JPG" alt="The SteelSeries Arctis Nova Pro Omni on a stone surface against a blue background" src="https://cdn.mos.cms.futurecdn.net/99bb67ftAuQXHpa3qCG4g5.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>It’s great to see the advent of headsets that are compatible with both consoles from the two main troublemakers, Microsoft and Sony. If you own both consoles, with the Arctis Nova Omni, you won’t need to buy two headsets for switching between. The Omni can be used with both, plus Switch, PC (obviously) and a host of other platforms.</p><p>The USB-C DAC/hub is also handy here as you can plug in 3x devices for high-res Wi-Fi sound, then keep a final fourth channel for Bluetooth. You also have access to a fifth wired channel, giving a massive array of connected devices.</p><h2 id="effortless-comfort">Effortless comfort</h2><p>We always say the same thing about every Arctis Nova headset: that they’re super comfortable. They all use the same suspended headstrap, but it’s a winning formula, making the headset feel weightless and effortlessly comfortable. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1255px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YxTeBvqANG9z3on383Dmc5" name="SteelSeries Arctis Nova Pro Omni-4.JPG" alt="The SteelSeries Arctis Nova Pro Omni on a stone surface against a blue background" src="https://cdn.mos.cms.futurecdn.net/v2/t:20,l:536,cw:1255,ch:706,q:80/YxTeBvqANG9z3on383Dmc5.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>It’s much preferable to the classic single padded band of headsets like the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/fractal-design-scape-review"><u>Fractal Design Scape</u></a>, and miles better than Audeze’s suspended headband design, found on the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/audeze-maxwell-review"><u>Audeze Maxwell 1</u></a>, Maxwell 2 and Maxwell 2 ANC. The Maxwell’s headband has very limited adjustment, meaning I have to wear it lop-sided as I fall between two levels. The Nova Pro Omni, meanwhile, can be adjusted using both the headband and earcup sliders, so I can get the fit just right.</p><p>The Nova Pro Omni’s earcups are thickly padded, using the same memory foam and vegan leather as Nova Elite. By the time I’m writing this, I’m several hours into a testing and writing session with the Nova Pro Omni, and feel no need to take them off. </p><p>SteelSeries has also tweaked the position/shape of the ANC mic near the headphone driver, to ensure it doesn’t rub on your helix — clearly a frequent-enough complaint to force a change. I’ve never had this issue, but everyone’s ear anatomy is different, so it’s nice to see the brand taking steps to address it.</p><h2 id="premium-construction">Premium construction</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8ptgN2hJsMUu2G5i32Wjg5" name="SteelSeries Arctis Nova Pro Omni-5.JPG" alt="The SteelSeries Arctis Nova Pro Omni on a stone surface against a blue background" src="https://cdn.mos.cms.futurecdn.net/8ptgN2hJsMUu2G5i32Wjg5.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I like that the Nova Pro Omni looks and feels almost exactly like the Nova Elite. The Nova Pro was nearly there, to be fair — the only real difference is that the volume wheel now uses the same metal as the Nova Elite, instead of the tacky plastic wheel on the Nova Pro (the same wheel as the cheaper <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-7-gen-2-review"><u>SteelSeries Arctis Nova 7 Gen 2</u></a>).</p><p>Generally, this feels like a very premium headset, and a step up over the Nova 7 Gen 2. Admittedly, though, I don’t think any SteelSeries headset can quite match the high-quality materials and sleek scandi styling of the Fractal Design Scape.</p><h2 id="no-downtime">No downtime</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/Q5am599s4VHKTLLYCq9we5.jpg" alt="The SteelSeries Arctis Nova Pro Omni on a stone surface against a blue background" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/dVMnJ8MytEjPtpVCQ2ebf5.jpg" alt="The SteelSeries Arctis Nova Pro Omni on a stone surface against a blue background" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>Just like its siblings, the Nova Pro Omni features SteelSeries’ "Infinite Power System.” That’s a rather hyperbolic way of saying it comes with two batteries, one of which charges in the USB hub while you use the other in the headset.</p><p>Hyperbole or otherwise, I always love this system, as it means virtually no downtime if you’ve forgotten to charge your headset the night before a long gaming session. SteelSeries promises up to 30 hours from each battery, although mileage will naturally vary and you can expect a drop with ANC on. With ANC on and streaming over WiFi, four hours of constant use ate up around 20% battery, equating to 20 hours extrapolated.</p><p>Of course, for home use, as long as the spare battery charges faster than the in-use one drains (which it does), the specific number of hours doesn’t really matter. But it’s nice that you can get decent life out of the headset if you need to take it out and about.</p><h2 id="upgraded-mic">Upgraded mic</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RCPEEPn7ingwrfPSRZSmc5" name="SteelSeries Arctis Nova Pro Omni-3.JPG" alt="The SteelSeries Arctis Nova Pro Omni on a stone surface against a blue background" src="https://cdn.mos.cms.futurecdn.net/RCPEEPn7ingwrfPSRZSmc5.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Arctis Nova Omni features a new microphone — now an omnidirectional mic (hence the name). This replaces the bi-directional mic on the original Nova Pro, and is similar to the omnidirectional mic on the Nova Elite. </p><p>The change is intended to provide a more natural timbre to your voice by picking up a wider array of vocal tones. Interestingly, it has a wider frequency pickup range than the Nova Elite’s omnidirectional mic — so, technically, vocals will sound better on the Omni. The downside is that the omnidirectional mic will pick up other voices around you (in testing, it picked up my colleague’s voice), but that’s not a big issue if you’re gaming alone.<br></p><audio src="https://cdn.mos.cms.futurecdn.net/43ZTiJ2MWFaRBeF5TGFCpW/SteelSeries%20Arctis%20Nova%20Pro%20Omni%20%E2%80%94%20Mic%20test.mp3"  controls="controls" preload="none"></audio><p><br>I think the mic sounds pretty good. As you can hear in the recording above, my voice sounds clear, with a rich and natural tone in the flat EQ. Unfortunately, most of the Omni’s mic EQs aren’t worth bothering with. The Broadcast Low, Deep Voice and Balanced EQs just made me sound boomy. The Less Nasal preset worked fairly well (guess I have a nasal voice, then), but honestly, I’d just stick to the basic Flat EQ profile.</p><p>While it doesn’t quite pip the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/audeze-maxwell-2-review"><u>Audeze Maxwell 2</u></a>’s mic, the Nova Pro Omni will be a solid choice for most gamers and amateur streamers. For anyone taking streaming seriously, though, I’d advise a higher-quality standalone mic like the <a href="https://www.tomsguide.com/audio/microphones/shure-mv6-microphone-review"><u>Shure MV6</u></a> ($149), <a href="https://www.tomsguide.com/audio/microphones/shure-mv7plus-podcast-microphone-review"><u>Shure MV7+</u></a> ($279) or <a href="https://www.tomsguide.com/audio/microphones/shure-mv7i-review"><u>Shure MV7i</u></a> ($349).</p><h2 class="article-body__section" id="section-steelseries-arctis-nova-pro-omni-review-the-downs"><span>SteelSeries Arctis Nova Pro Omni review: The downs</span></h2><p>The Arctis Nova Omni isn’t perfect. The ANC is OK, but only that, so it’d be remiss of me not to call out the overhyped marketing. Otherwise, it’s just a bit pricey, and I have little else to say against it.</p><h2 id="overhyped-anc">Overhyped ANC</h2><p>I admit I’m a little spoiled when it comes to ANC, owning and testing some of the <a href="https://www.tomsguide.com/us/best-noise-cancelling-headphones,review-5566.html"><u>best noise-cancelling headphones</u></a> around. My standards are pretty high. The beef I have with SteelSeries’ recent ANC systems (here and on the Nova Elite) isn’t that they’re terrible; it’s that they’re marketed as being incredible when in actuality they’re decidedly mediocre. The same claim is being made for the Nova Pro Omni as was made about the Nova Elite: that the ANC will cut out the noise of a helicopter. </p><p>A. Frickin’. Helicopter.</p><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="GFe56QsqTdfKZycN9Ss4g5" name="SteelSeries Arctis Nova Pro Omni-6.JPG" alt="The SteelSeries Arctis Nova Pro Omni on a stone surface against a blue background" src="https://cdn.mos.cms.futurecdn.net/GFe56QsqTdfKZycN9Ss4g5.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>As with the Nova Elite, the Nova Pro Omni’s ANC could barely cut out basic office sounds: my colleague playing music through her laptop speakers; people talking around me; keyboard noise; traffic outside the window. I’m pretty sure choppers are louder than all that. And even if this is a frequency-specific issue, I have beef with that, too — frankly, I don’t give a damn if a headset can cut the sound of a helicopter, because I’m never gaming on a heli pad. I need it to cut out, oh, say… music, voices, traffic and keyboard noise.</p><p>Like I said, the Omni’s ANC isn’t <em>bad</em>. It still reduces a fair amount of noise, and some ANC is better than none. It’s just not the powerhouse ANC that SteelSeries is telling you. Not in my experience.</p><p>As I write this, I’m about to test the Nova Omni’s main competitor, the Maxwell 2 ANC. Audeze also claims to have ‘class-leading’ ANC (and proof of it, apparently), so it’s not like SteelSeries is the only one hamming things up here. We’ll see.</p><h2 id="kinda-spenny">Kinda spenny</h2><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="byEuESzsVFutXrgq2uWif5" name="SteelSeries Arctis Nova Pro Omni-9.JPG" alt="The SteelSeries Arctis Nova Pro Omni on a stone surface against a blue background" src="https://cdn.mos.cms.futurecdn.net/byEuESzsVFutXrgq2uWif5.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Credit where credit is due: SteelSeries has priced the Nova Pro Omni in line with its key rival, the $429 Audeze Maxwell 2 ANC. I was a little flabbergasted by the price of the $599 Nova Elite, but the Nova Pro Omni shows SteelSeries has at least re-entered planet Earth. </p><p>To any other manufacturer, the Nova Pro Omni would be a flagship. Its sound quality, while not quite rivalling the super tight response of the Maxwell’s planar magnetic drivers, is nevertheless excellent, and it boasts all the goodies aforementioned. Aside from the carbon drivers of the Nova Elite, the Nova Pro Omni is basically just as good as the top model, and at $200 cheaper, makes much more sense.</p><p>Objectively, though, $399 is a lot of cash to drop on a headset. If you’re on a budget, I’m afraid this headset isn’t for you. Instead, check out the <a href="https://www.tomsguide.com/gaming/peripherals/steelseries-arctis-nova-5-review"><u>SteelSeries Arctis Nova 5</u></a> ($129), Arctis Nova 7 Gen 2 ($199), or the older Arctis Nova Pro (usually around $229 these days).</p><h2 class="article-body__section" id="section-steelseries-arctis-nova-pro-omni-review-verdict"><span>SteelSeries Arctis Nova Pro Omni review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VmZGMCxyosDxYytE49Kv95" name="SteelSeries Arctis Nova Pro Omni-1.JPG" alt="The SteelSeries Arctis Nova Pro Omni on a stone surface against a blue background" src="https://cdn.mos.cms.futurecdn.net/VmZGMCxyosDxYytE49Kv95.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The SteelSeries Arctis Nova Pro Omni is a Goldilocks headset. The Nova Pro is by now kinda old and a little limited, while the flagship Nova Elite is simply too pricey. The Nova Omni fits in nicely between the two, offering a blend of sound quality, gaming performance and price. I love the wide connectivity options and attention paid to the new mic, plus SteelSeries’ usual effortless comfort.</p><p>Sure, the Omni isn’t totally perfect. I’m a supreme skeptic of the ANC claims, given my personal experience with the headset. And it ain’t exactly cheap. But the ANC isn’t terrible, and top-tier products simply cost money, so both of those are fairly minor quibbles. If I had to choose only one headset from SteelSeries’ lineup to live with, it’d be the Nova Pro Omni.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-pro-omni-review</link>
                                                                            <description>
                            <![CDATA[ The SteelSeries Arctis Nova Pro Omni delivers on its catch-all eponym. This is one of the finest gaming headsets for multi-platform gamers. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">tYb5BWMNKrpyHBFcY74m3Z</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/VmZGMCxyosDxYytE49Kv95-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 24 Jul 2026 11:30:30 +0000</pubDate>                                                                                                                                <updated>Fri, 24 Jul 2026 11:40:24 +0000</updated>
                                                                                                                                            <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                <author><![CDATA[ peter.wolinski@futurenet.com (Peter Wolinski) ]]></author>                    <dc:creator><![CDATA[ Peter Wolinski ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/stgPfXWY7ukw8J8rfC7vjg.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Peter is a Senior Editor at Tom&#039;s Guide, heading up the site&#039;s Reviews team and Cameras section. Having built gaming PCs since he was 10 (that&#039;s a while ago now) he&#039;s a bit of a nerd about components and hardware. He&#039;s also been an iPhone user since the classic iPhone 4, and a Mac user for well over a decade. Experienced in using and testing all kinds of technology — from phones through to tablets, computers, games consoles, cameras and smart home tech — helping people find the best tech for them (at the best prices) is what Peter does best. A photographer since he bought his first camera (a Fujifilm) in 2015, Peter was previously an Editor for Canon-Europe.com. He then edited the Cameras and How To sections of Tom&#039;s Guide. When he&#039;s not crafting helpful, in-depth reviews, Peter can usually be found out and about honing his architectural photography skills, riding his motorcycle around Welsh mountain roads, telling everyone about his two greyhounds, squeezing a few extra FPS out of PC games or perfecting his espresso shots.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/VmZGMCxyosDxYytE49Kv95-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The SteelSeries Arctis Nova Pro Omni on a stone surface against a blue background]]></media:description>                                                            <media:text><![CDATA[The SteelSeries Arctis Nova Pro Omni on a stone surface against a blue background]]></media:text>
                                <media:title type="plain"><![CDATA[The SteelSeries Arctis Nova Pro Omni on a stone surface against a blue background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/VmZGMCxyosDxYytE49Kv95-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The SteelSeries Arctis Nova Pro Omni is the successor to 2022’s fantastic Arctis Nova Pro. The reasoning behind adding the ‘Omni’ bit is twofold: the new headset now packs an omnidirectional microphone, but it also works on every major platform.</p><p>Now, the technical challenge of making an all-platform headset is not to be sniffed at. <a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-tested-reddits-favorite-high-end-gaming-headsets-and-theres-a-clear-winner-but-its-not-the-one-i-expected"><u>Gaming headsets</u></a> typically come in either Xbox or PlayStation guise, due to lots of proprietary software nonsense (mostly from Microsoft) — malarkey that SteelSeries has managed to negotiate its way around.</p><p>Creating a worthy successor to the Nova Pro would’ve no doubt been a little easier. While old, the Pro is a fantastic gaming headset that still holds up today, so SteelSeries didn’t have to do much. It changed the mic, widened the connectivity, tweaked the drivers and added a little of the Nova Elite’s polish. <em>Voilà</em>.</p><p>So, is this one of the <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets"><u>best gaming headsets</u></a> out there? Certainly. Keep reading my full SteelSeries Arctis Nova Omni review to find out more.</p><h2 class="article-body__section" id="section-steelseries-arctis-nova-pro-omni-review-cheat-sheet"><span>SteelSeries Arctis Nova Pro Omni review: Cheat sheet</span></h2><ul><li><strong>What is it?</strong> A premium gaming headset and successor to the original Arctis Nova Pro</li><li><strong>What does it cost? </strong>Quite a bit: <a href="https://www.amazon.com/SteelSeries-Arctis-Nova-Pro-Omni-PlayStation/dp/B0GS77JQLF" target="_blank" rel="nofollow"><u>$399</u></a> / <a href="https://www.amazon.co.uk/SteelSeries-Arctis-Nova-Pro-Omni-Graphite/dp/B0GVZFQ8N2" target="_blank" rel="nofollow"><u>£349</u></a></li><li><strong>Who is it for?</strong> Competitive and/or multi-platform gamers who value sound quality</li><li><strong>What’s good?</strong> The sound, connectivity options, comfort, new mic and ‘zero-downtime’ battery</li><li><strong>What’s not?</strong> The ANC isn’t as good as SteelSeries says, and it’s pricey</li></ul><h2 class="article-body__section" id="section-steelseries-arctis-nova-pro-omni-review-specs"><span>SteelSeries Arctis Nova Pro Omni review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/SteelSeries-Arctis-Nova-Pro-Omni-PlayStation/dp/B0GS77JQLF" target="_blank" rel="nofollow"><u>$399</u></a> / <a href="https://www.amazon.co.uk/SteelSeries-Arctis-Nova-Pro-Omni-Graphite/dp/B0GVZFQ8N2" target="_blank" rel="nofollow"><u>£349</u></a></p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Black; blue; white</p></td></tr><tr><td class="firstcol " ><p><strong>Platforms</strong></p></td><td  ><p>PC, Mac, Xbox, PS5, Switch, Steam Deck/handheld; Meta Quest 2 & 3, iOS, iPadOS, Android</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Wired, 3x 2.4Ghz, 1x Bluetooth</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>2x rechargeable</p></td></tr><tr><td class="firstcol " ><p><strong>Battery life</strong></p></td><td  ><p>60 hours combined</p></td></tr><tr><td class="firstcol " ><p><strong>Frequency response</strong></p></td><td  ><p>10-40,000Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Drivers</strong></p></td><td  ><p>40mm dynamic</p></td></tr><tr><td class="firstcol " ><p><strong>Multipoint connectivity</strong></p></td><td  ><p>Yes</p></td></tr><tr><td class="firstcol " ><p><strong>Paired devices max</strong></p></td><td  ><p>4 (3x 2.4G, 1x BT, 1x Wired simultaneously)</p></td></tr><tr><td class="firstcol " ><p><strong>Microphone</strong></p></td><td  ><p>Omnidirectional boom mic</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>11.9 ounces / 339 grams</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-steelseries-arctis-nova-pro-omni-review-the-ups"><span>SteelSeries Arctis Nova Pro Omni review: The ups</span></h2><p>From the excellent sound quality to the reams of control, plenty of connectivity options, and comfortable design, there’s a lot I love about the Arctis Nova Omni.</p><h2 id="killer-sound-quality">Killer sound quality</h2><p>Obviously, the most important thing about any gaming headset is how it sounds when gaming. Thankfully, the Nova Pro Omni has sound quality in buckets, sporting 96K / 24-bit hi-res audio over Wi-Fi. </p><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="S2JAfATxFYLeYAbrQhj7b5" name="SteelSeries Arctis Nova Pro Omni-7.JPG" alt="The SteelSeries Arctis Nova Pro Omni on a stone surface against a blue background" src="https://cdn.mos.cms.futurecdn.net/S2JAfATxFYLeYAbrQhj7b5.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>It lacks the carbon fiber drivers of the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-elite-review"><u>SteelSeries Arctis Nova Elite</u></a>, but the neodymium drivers have been re-tuned from the <a href="https://www.tomsguide.com/reviews/steelseries-arctis-nova-pro-wireless"><u>Arctis Nova Pro</u></a> for tighter bass response. Bass is indeed nice and punchy — the booms of explosions in <em>Isonzo</em> and the rumbles of tanks in <em>Hell Let Loose</em> all sounded powerful and frightening, with no distortion perceptible. You won’t get that stomach-quivering sub bass as you would from a subwoofer, but if that’s what you’re after, I’d advise the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arena-9-review"><u>SteelSeries Arena 9</u></a> speaker system.</p><p>There’s a decent amount of mid-range resolution, with satisfying mechanical clicks and clacks to reloads in <em>Hell Let Loose</em>, and a thrumming timbre to car engine noise in <em>Forza Horizon 5</em>.</p><p>The Nova Pro Omni’s treble is impressively light and airy, giving bags of fine detail. Combined with strong spatial imaging, this helps you pinpoint enemy footsteps. I was able to hear enemies walking and reloading in <em>Counter-Strike 2</em>, which was enough to score me a few kills I wouldn’t otherwise have got. In <em>Isonzo</em>, I was able to precisely track an enemy snaking through a trench behind and around me, helping me get the jump on them and score a kill.</p><p>The sound quality makes the Nova Pro Omni pretty good for music, too. I tested the headset using my usual audio testing playlist on <a href="https://www.tomsguide.com/audio/qobuz-review"><u>Qobuz</u></a>, the <a href="https://www.tomsguide.com/buying-guide/best-music-streaming-services"><u>best music streaming service</u></a> for audiophiles, and had no complaints — I’d rather put $399 into the Omni than overpriced premium headphones like the $449 <a href="https://www.tomsguide.com/audio/over-ear-headphones/bose-quietcomfort-ultra-headphones-2nd-generation-review"><u>Bose QuietComfort Ultra Gen II</u></a>.</p><p><em>Listen along to my audio testing playlist on Qobuz.</em></p><iframe allow="" height="390" width="400" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://widget.qobuz.com/playlist/59666746?zone=GB-en"></iframe><h2 id="bags-of-control">Bags of control</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/fBrzNXyYT8MvaYSPRy4uu4.jpg" alt="A screenshot of the SteelSeries GG app" /><figcaption><small role="credit">SteelSeries</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/ez6UeSsC5mgGfu9xPb5qy4.jpg" alt="A screenshot of the SteelSeries GG app" /><figcaption><small role="credit">SteelSeries</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/i4FLdqDYiJ4tSSQ94DLch4.jpg" alt="A screenshot of the SteelSeries GG app" /><figcaption><small role="credit">SteelSeries</small></figcaption></figure></figure><p>As with SteelSeries’ other high-end headsets, the Nova Pro Omni comes with a desktop USB DAC/hub. This serves as a wired connection hub, but it’s also the primary way to control your headset on-the-fly, letting you quickly adjust EQ (including a custom EQ profile), ANC and microphone settings as you game.</p><p>For more in-depth control, the SteelSeries GG app is perfect. In GG, you get greater customization over audio and mic EQ, including per-game audio presets to help you tailor your sound to individual titles. GG is slick, reliable and delivers genuine performance enhancements, and I much prefer it to the bloatware from other brands, like Asus’ Armoury Crate.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2076px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="AtEZRUTSfkV8g4dGmJ6Dp4" name="SteelSeries Arctis Nova Pro Omni_Screens-4" alt="A screenshot of the SteelSeries GG app running Sonar" src="https://cdn.mos.cms.futurecdn.net/AtEZRUTSfkV8g4dGmJ6Dp4.jpg" mos="" align="middle" fullscreen="1" width="2076" height="1168" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/AtEZRUTSfkV8g4dGmJ6Dp4.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">A screenshot of Sonar running via the SteelSeries GG app. </span><span class="credit" itemprop="copyrightHolder">(Image credit: SteelSeries)</span></figcaption></figure><p>There’s also Sonar, which is a digital audio interface to mix game audio, mic, stream and chat levels. I don’t have much use for Sonar, as I’m not a streamer and only need to monitor audio and mic levels. But it’ll be a handy tool for any streaming newbies who haven’t got the cash yet to invest in a more advanced audio interface</p><h2 id="wide-compatibility">Wide compatibility</h2><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="99bb67ftAuQXHpa3qCG4g5" name="SteelSeries Arctis Nova Pro Omni-12.JPG" alt="The SteelSeries Arctis Nova Pro Omni on a stone surface against a blue background" src="https://cdn.mos.cms.futurecdn.net/99bb67ftAuQXHpa3qCG4g5.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>It’s great to see the advent of headsets that are compatible with both consoles from the two main troublemakers, Microsoft and Sony. If you own both consoles, with the Arctis Nova Omni, you won’t need to buy two headsets for switching between. The Omni can be used with both, plus Switch, PC (obviously) and a host of other platforms.</p><p>The USB-C DAC/hub is also handy here as you can plug in 3x devices for high-res Wi-Fi sound, then keep a final fourth channel for Bluetooth. You also have access to a fifth wired channel, giving a massive array of connected devices.</p><h2 id="effortless-comfort">Effortless comfort</h2><p>We always say the same thing about every Arctis Nova headset: that they’re super comfortable. They all use the same suspended headstrap, but it’s a winning formula, making the headset feel weightless and effortlessly comfortable. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1255px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YxTeBvqANG9z3on383Dmc5" name="SteelSeries Arctis Nova Pro Omni-4.JPG" alt="The SteelSeries Arctis Nova Pro Omni on a stone surface against a blue background" src="https://cdn.mos.cms.futurecdn.net/v2/t:20,l:536,cw:1255,ch:706,q:80/YxTeBvqANG9z3on383Dmc5.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>It’s much preferable to the classic single padded band of headsets like the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/fractal-design-scape-review"><u>Fractal Design Scape</u></a>, and miles better than Audeze’s suspended headband design, found on the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/audeze-maxwell-review"><u>Audeze Maxwell 1</u></a>, Maxwell 2 and Maxwell 2 ANC. The Maxwell’s headband has very limited adjustment, meaning I have to wear it lop-sided as I fall between two levels. The Nova Pro Omni, meanwhile, can be adjusted using both the headband and earcup sliders, so I can get the fit just right.</p><p>The Nova Pro Omni’s earcups are thickly padded, using the same memory foam and vegan leather as Nova Elite. By the time I’m writing this, I’m several hours into a testing and writing session with the Nova Pro Omni, and feel no need to take them off. </p><p>SteelSeries has also tweaked the position/shape of the ANC mic near the headphone driver, to ensure it doesn’t rub on your helix — clearly a frequent-enough complaint to force a change. I’ve never had this issue, but everyone’s ear anatomy is different, so it’s nice to see the brand taking steps to address it.</p><h2 id="premium-construction">Premium construction</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8ptgN2hJsMUu2G5i32Wjg5" name="SteelSeries Arctis Nova Pro Omni-5.JPG" alt="The SteelSeries Arctis Nova Pro Omni on a stone surface against a blue background" src="https://cdn.mos.cms.futurecdn.net/8ptgN2hJsMUu2G5i32Wjg5.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I like that the Nova Pro Omni looks and feels almost exactly like the Nova Elite. The Nova Pro was nearly there, to be fair — the only real difference is that the volume wheel now uses the same metal as the Nova Elite, instead of the tacky plastic wheel on the Nova Pro (the same wheel as the cheaper <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-7-gen-2-review"><u>SteelSeries Arctis Nova 7 Gen 2</u></a>).</p><p>Generally, this feels like a very premium headset, and a step up over the Nova 7 Gen 2. Admittedly, though, I don’t think any SteelSeries headset can quite match the high-quality materials and sleek scandi styling of the Fractal Design Scape.</p><h2 id="no-downtime">No downtime</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/Q5am599s4VHKTLLYCq9we5.jpg" alt="The SteelSeries Arctis Nova Pro Omni on a stone surface against a blue background" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/dVMnJ8MytEjPtpVCQ2ebf5.jpg" alt="The SteelSeries Arctis Nova Pro Omni on a stone surface against a blue background" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>Just like its siblings, the Nova Pro Omni features SteelSeries’ "Infinite Power System.” That’s a rather hyperbolic way of saying it comes with two batteries, one of which charges in the USB hub while you use the other in the headset.</p><p>Hyperbole or otherwise, I always love this system, as it means virtually no downtime if you’ve forgotten to charge your headset the night before a long gaming session. SteelSeries promises up to 30 hours from each battery, although mileage will naturally vary and you can expect a drop with ANC on. With ANC on and streaming over WiFi, four hours of constant use ate up around 20% battery, equating to 20 hours extrapolated.</p><p>Of course, for home use, as long as the spare battery charges faster than the in-use one drains (which it does), the specific number of hours doesn’t really matter. But it’s nice that you can get decent life out of the headset if you need to take it out and about.</p><h2 id="upgraded-mic">Upgraded mic</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RCPEEPn7ingwrfPSRZSmc5" name="SteelSeries Arctis Nova Pro Omni-3.JPG" alt="The SteelSeries Arctis Nova Pro Omni on a stone surface against a blue background" src="https://cdn.mos.cms.futurecdn.net/RCPEEPn7ingwrfPSRZSmc5.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Arctis Nova Omni features a new microphone — now an omnidirectional mic (hence the name). This replaces the bi-directional mic on the original Nova Pro, and is similar to the omnidirectional mic on the Nova Elite. </p><p>The change is intended to provide a more natural timbre to your voice by picking up a wider array of vocal tones. Interestingly, it has a wider frequency pickup range than the Nova Elite’s omnidirectional mic — so, technically, vocals will sound better on the Omni. The downside is that the omnidirectional mic will pick up other voices around you (in testing, it picked up my colleague’s voice), but that’s not a big issue if you’re gaming alone.<br></p><audio src="https://cdn.mos.cms.futurecdn.net/43ZTiJ2MWFaRBeF5TGFCpW/SteelSeries%20Arctis%20Nova%20Pro%20Omni%20%E2%80%94%20Mic%20test.mp3"  controls="controls" preload="none"></audio><p><br>I think the mic sounds pretty good. As you can hear in the recording above, my voice sounds clear, with a rich and natural tone in the flat EQ. Unfortunately, most of the Omni’s mic EQs aren’t worth bothering with. The Broadcast Low, Deep Voice and Balanced EQs just made me sound boomy. The Less Nasal preset worked fairly well (guess I have a nasal voice, then), but honestly, I’d just stick to the basic Flat EQ profile.</p><p>While it doesn’t quite pip the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/audeze-maxwell-2-review"><u>Audeze Maxwell 2</u></a>’s mic, the Nova Pro Omni will be a solid choice for most gamers and amateur streamers. For anyone taking streaming seriously, though, I’d advise a higher-quality standalone mic like the <a href="https://www.tomsguide.com/audio/microphones/shure-mv6-microphone-review"><u>Shure MV6</u></a> ($149), <a href="https://www.tomsguide.com/audio/microphones/shure-mv7plus-podcast-microphone-review"><u>Shure MV7+</u></a> ($279) or <a href="https://www.tomsguide.com/audio/microphones/shure-mv7i-review"><u>Shure MV7i</u></a> ($349).</p><h2 class="article-body__section" id="section-steelseries-arctis-nova-pro-omni-review-the-downs"><span>SteelSeries Arctis Nova Pro Omni review: The downs</span></h2><p>The Arctis Nova Omni isn’t perfect. The ANC is OK, but only that, so it’d be remiss of me not to call out the overhyped marketing. Otherwise, it’s just a bit pricey, and I have little else to say against it.</p><h2 id="overhyped-anc">Overhyped ANC</h2><p>I admit I’m a little spoiled when it comes to ANC, owning and testing some of the <a href="https://www.tomsguide.com/us/best-noise-cancelling-headphones,review-5566.html"><u>best noise-cancelling headphones</u></a> around. My standards are pretty high. The beef I have with SteelSeries’ recent ANC systems (here and on the Nova Elite) isn’t that they’re terrible; it’s that they’re marketed as being incredible when in actuality they’re decidedly mediocre. The same claim is being made for the Nova Pro Omni as was made about the Nova Elite: that the ANC will cut out the noise of a helicopter. </p><p>A. Frickin’. Helicopter.</p><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="GFe56QsqTdfKZycN9Ss4g5" name="SteelSeries Arctis Nova Pro Omni-6.JPG" alt="The SteelSeries Arctis Nova Pro Omni on a stone surface against a blue background" src="https://cdn.mos.cms.futurecdn.net/GFe56QsqTdfKZycN9Ss4g5.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>As with the Nova Elite, the Nova Pro Omni’s ANC could barely cut out basic office sounds: my colleague playing music through her laptop speakers; people talking around me; keyboard noise; traffic outside the window. I’m pretty sure choppers are louder than all that. And even if this is a frequency-specific issue, I have beef with that, too — frankly, I don’t give a damn if a headset can cut the sound of a helicopter, because I’m never gaming on a heli pad. I need it to cut out, oh, say… music, voices, traffic and keyboard noise.</p><p>Like I said, the Omni’s ANC isn’t <em>bad</em>. It still reduces a fair amount of noise, and some ANC is better than none. It’s just not the powerhouse ANC that SteelSeries is telling you. Not in my experience.</p><p>As I write this, I’m about to test the Nova Omni’s main competitor, the Maxwell 2 ANC. Audeze also claims to have ‘class-leading’ ANC (and proof of it, apparently), so it’s not like SteelSeries is the only one hamming things up here. We’ll see.</p><h2 id="kinda-spenny">Kinda spenny</h2><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="byEuESzsVFutXrgq2uWif5" name="SteelSeries Arctis Nova Pro Omni-9.JPG" alt="The SteelSeries Arctis Nova Pro Omni on a stone surface against a blue background" src="https://cdn.mos.cms.futurecdn.net/byEuESzsVFutXrgq2uWif5.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Credit where credit is due: SteelSeries has priced the Nova Pro Omni in line with its key rival, the $429 Audeze Maxwell 2 ANC. I was a little flabbergasted by the price of the $599 Nova Elite, but the Nova Pro Omni shows SteelSeries has at least re-entered planet Earth. </p><p>To any other manufacturer, the Nova Pro Omni would be a flagship. Its sound quality, while not quite rivalling the super tight response of the Maxwell’s planar magnetic drivers, is nevertheless excellent, and it boasts all the goodies aforementioned. Aside from the carbon drivers of the Nova Elite, the Nova Pro Omni is basically just as good as the top model, and at $200 cheaper, makes much more sense.</p><p>Objectively, though, $399 is a lot of cash to drop on a headset. If you’re on a budget, I’m afraid this headset isn’t for you. Instead, check out the <a href="https://www.tomsguide.com/gaming/peripherals/steelseries-arctis-nova-5-review"><u>SteelSeries Arctis Nova 5</u></a> ($129), Arctis Nova 7 Gen 2 ($199), or the older Arctis Nova Pro (usually around $229 these days).</p><h2 class="article-body__section" id="section-steelseries-arctis-nova-pro-omni-review-verdict"><span>SteelSeries Arctis Nova Pro Omni review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VmZGMCxyosDxYytE49Kv95" name="SteelSeries Arctis Nova Pro Omni-1.JPG" alt="The SteelSeries Arctis Nova Pro Omni on a stone surface against a blue background" src="https://cdn.mos.cms.futurecdn.net/VmZGMCxyosDxYytE49Kv95.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The SteelSeries Arctis Nova Pro Omni is a Goldilocks headset. The Nova Pro is by now kinda old and a little limited, while the flagship Nova Elite is simply too pricey. The Nova Omni fits in nicely between the two, offering a blend of sound quality, gaming performance and price. I love the wide connectivity options and attention paid to the new mic, plus SteelSeries’ usual effortless comfort.</p><p>Sure, the Omni isn’t totally perfect. I’m a supreme skeptic of the ANC claims, given my personal experience with the headset. And it ain’t exactly cheap. But the ANC isn’t terrible, and top-tier products simply cost money, so both of those are fairly minor quibbles. If I had to choose only one headset from SteelSeries’ lineup to live with, it’d be the Nova Pro Omni.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The Razer Huntsman V3 just became my go-to PC gaming keyboard — here’s why ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I haven’t used a Razer gaming keyboard for a while, so testing the new Razer Huntsman V3 TKL 8KHz feels like reuniting with an old friend. Since the company uses proprietary switches, its keyboards feel different from competitors that use third-party parts. This remains true for the Huntsman V3.</p><p>This more affordable variant of last year’s Huntsman V3 Pro TKL 8KHz packs several competitive gaming-focused features, such as super-fast 8KHz polling and adjustable actuation points. While the keyboard is relatively thin, its aluminum build makes it sturdy and safe to travel with. And while it’s a gaming keyboard at its core, it’s also great for typing.</p><p>If you’re a competitive gamer who needs a keyboard that can keep up with you and won’t break the bank, the Razer Huntsman V3 Tenkeyless 8KHz is one of the <a href="https://www.tomsguide.com/best-picks/best-gaming-keyboard">best gaming keyboards</a> that's worth checking out. Here’s why.</p><div class="product"><a data-dimension112="56b2384a-814b-11f1-b86a-11d34ca164b1" data-action="Deal Block" data-label="Huntsman V3 Tenkeyless 8KHz" data-dimension48="Huntsman V3 Tenkeyless 8KHz" data-dimension25="$169" href="https://www.amazon.com/Razer-Huntsman-Esports-Gaming-Keyboard/dp/B0GWNHWWN8" 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="GQZWYf9pyTNyTxNzdKcnQh" name="Razer Huntsman V3 Tenkeyless 8KHz" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/GQZWYf9pyTNyTxNzdKcnQh.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Razer Huntsman V3 Tenkeyless 8KHz is a pro-grade gaming keyboard, featuring precise optical switches, a super-high 8K polling rate, adjustable actuation points, and full RGB lighting. At $169, it's the most affordable Huntsman V3 model currently available, and it's worth the money if you're a hardcore competitive PC gamer.<a class="view-deal button" href="https://www.amazon.com/Razer-Huntsman-Esports-Gaming-Keyboard/dp/B0GWNHWWN8" target="_blank" rel="nofollow" data-dimension112="56b2384a-814b-11f1-b86a-11d34ca164b1" data-action="Deal Block" data-label="Huntsman V3 Tenkeyless 8KHz" data-dimension48="Huntsman V3 Tenkeyless 8KHz" data-dimension25="$169">View Deal</a></p></div><h2 id="what-s-this-razer-huntsman-v3-all-about">What's this Razer Huntsman V3 all about?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qfm62vGH79v4W9e5Ythv4U" name="Razer Huntsman V3 TKL 8K--1" alt="Razer Huntsman V3 Tenkeyless 8KHz" src="https://cdn.mos.cms.futurecdn.net/qfm62vGH79v4W9e5Ythv4U.jpg" mos="" align="middle" fullscreen="" width="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 Razer Huntsman V3 TKL 8KHz is a competitive gaming keyboard built for fast-paced first-person shooters and other genres that demand quick reflexes. It utilizes the company’s proprietary analog optical switches, 8K “HyperPolling,” adjustable actuation, and a slew of RGB customization options.</p><p><a href="https://www.tomsguide.com/computing/peripherals/i-finally-tried-magnetic-key-switches-but-i-never-thought-id-find-them-in-a-split-keyboard-thats-also-wireless">Magnetic switches</a> have been all the rage in recent years, but Razer has remained true to its optical switches. Both switch types provide faster response times than traditional mechanical switches, which is why competitive gamers tend to gravitate toward them. I won’t debate whether optical or magnetic switches are better for gaming, but I will say Razer’s optical switches are insanely responsive.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="pCtyQhZn2pFFSxbjm22wGd" name="Razer Huntsman V3 TKL 8K--3" alt="Razer Huntsman V3 Tenkeyless 8KHz" src="https://cdn.mos.cms.futurecdn.net/pCtyQhZn2pFFSxbjm22wGd.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Like with magnetic switches, you can set multiple actuation points on a single key—two actuation points in this case. For example, you can have an actuation point of 2.0 mm on the W key to walk and 4.0 to run. Here, you can set actuation points between 0.1 mm and 4.0, which is standard for both magnetic and optical keyboards.</p><p>Then there’s the 8K polling (the speed at which the keyboard sends signals to your computer), which Razer says is faster than other keyboards claiming such a high polling rate. According to the company, most keyboards with 8K polling have a 1.6ms response time, but the Huntsman V3 has a faster 0.48ms response time.</p><p>So, how does all of that translate to real-world use? Though I’m nowhere near a competitive gamer, even I could feel the overall smoothness and fast response when playing a first-person shooter like <a href="https://www.tomsguide.com/gaming/doom-the-dark-ages-is-a-heavy-metal-album-cover-come-to-life-and-i-cant-wait-to-play-ithttps://www.tomsguide.com/gaming/doom-the-dark-ages-review">Doom: The Dark Ages</a>. I especially like setting a faster actuation point for shooting since I could lightly brush the key instead of pressing it down all the way. And in case you’re wondering, you can set the actuation points right on the keyboard, though I still preferred doing so via the Razer Synapse app on PC.</p><h2 id="the-experience">The experience</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HijJ7EnLSEG77tMhHZry8n" name="Razer Huntsman V3 TKL 8K--5" alt="Razer Huntsman V3 Tenkeyless 8KHz" src="https://cdn.mos.cms.futurecdn.net/HijJ7EnLSEG77tMhHZry8n.jpg" mos="" align="middle" fullscreen="" width="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 I’m not the target customer for a competitive gaming keyboard, I enjoy using them because of their fast response time and smooth keystrokes—which the Razer Huntsman V3 has in spades. While the blazing performance and high customization are fantastic, there’s more to this keyboard than those selling points.</p><p>The elevated keys, with their PBT-coated keycaps, are a joy to type on. One thing I especially appreciate as someone with a heavy touch is how the keys have more resistance the further you press them. The tenkeyless layout is also ideal for me since I don’t need a numberpad, making the board unnecessarily larger.</p><p>The thocky sound the keys produce also makes using the keyboard more enjoyable. Sure, the sound isn’t as deep as you’d find on mechanical keyboards, but it’s still good. While not a clicky board, it’s definitely noisy, so you might not want to use it in an office or anywhere that could annoy others (though I used it in the office anyway!).</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uuNMe4PGQ9m4HzhL9F2pBB" name="Razer Huntsman V3 TKL 8K--6" alt="Razer Huntsman V3 Tenkeyless 8KHz" src="https://cdn.mos.cms.futurecdn.net/uuNMe4PGQ9m4HzhL9F2pBB.jpg" mos="" align="middle" fullscreen="" width="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 aluminum frame not only helps give the keyboard a richer sound, but also makes it sturdy and durable. That’s important if you need to travel with the Huntsman V3. The brushed aluminum is a nice touch that gives the keyboard a more premium look without being overbearing. And while this is a gaming keyboard, it doesn’t look like one thanks to its overall subdued design.</p><p>Of course, if you want more of a gamer aesthetic, there is no shortage of RGB options to toy around with. I’m somewhat neutral on RGB lighting, but I like that folks can customize the lighting to their exact preference. This is Razer, so the company isn’t skimping on that front.</p><p>Lastly, this isn't a wireless keyboard, so you'll need to use a USB-A port on your PC. That said, the braided cable is detachable, which is good if you need to take the keyboard on the road.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eEqDge"></div>                            </div>                            <script src="https://kwizly.com/embed/eEqDge.js" async></script><h2 id="outlook">Outlook</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wCUPYccXjWrNm5u7hH2xcK" name="Razer Huntsman V3 TKL 8K--7" alt="Razer Huntsman V3 Tenkeyless 8KHz" src="https://cdn.mos.cms.futurecdn.net/wCUPYccXjWrNm5u7hH2xcK.jpg" mos="" align="middle" fullscreen="" width="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 Razer Huntsman V3 Tenkeyless 8K is an excellent gaming keyboard thanks to its robust, competitive gamer-focused features. Outside of gaming, it also delivers a nice typing experience thanks to its durable build and responsive keys. It’s a bit pricey at $169, but for what it offers, you’re definitely getting your money’s worth.</p><p>Again, I'm a fan of Razer keyboards, and this one has everything I've come to expect from the company's peripherals. While the Pro versions of this keyboard might have more features, I like the simplicity of this board, as it still delivers excellent performance. At $169, it's worth considering.</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/keyboards/logitech-g-g512-x-review">I became a keyboard tinkerer with the Logitech G G512 X</a></li><li><a href="https://www.tomsguide.com/computing/peripherals/i-just-got-my-first-gaming-keyboard-heres-why-ill-never-use-a-regular-board-again">I just got my first gaming keyboard — I’ll never use a regular board again</a></li><li><a href="https://www.tomsguide.com/computing/buying-a-gaming-keyboard-rapid-trigger-and-snap-tap-explained">Buying a gaming keyboard? Rapid Trigger and Snap Tap explained</a></li></ul><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=gaming+laptops&min_discount_ratio=0.95&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = this.getRowsLimit();          } else {             this.displayLimit += this.getRowsLimit();          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += this.getRowsLimit();                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');               document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/keyboards/the-razer-huntsman-v3-just-became-my-go-to-pc-gaming-keyboard-heres-why</link>
                                                                            <description>
                            <![CDATA[ The Razer Huntsman V3 Tenkeyless 8KHz packs a ton of pro-grade features at a relatively affordable price. Here's what makes it worth considering. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">KGkcnrUvYLHwpfHSiUEeV4</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/iF3DdXTMBxzpFoVncGnzSK-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 17 Jul 2026 08:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Keyboards]]></category>
                                                    <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></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/iF3DdXTMBxzpFoVncGnzSK-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Razer Huntsman V3 Tenkeyless 8KHz]]></media:description>                                                            <media:text><![CDATA[Razer Huntsman V3 Tenkeyless 8KHz]]></media:text>
                                <media:title type="plain"><![CDATA[Razer Huntsman V3 Tenkeyless 8KHz]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/iF3DdXTMBxzpFoVncGnzSK-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I haven’t used a Razer gaming keyboard for a while, so testing the new Razer Huntsman V3 TKL 8KHz feels like reuniting with an old friend. Since the company uses proprietary switches, its keyboards feel different from competitors that use third-party parts. This remains true for the Huntsman V3.</p><p>This more affordable variant of last year’s Huntsman V3 Pro TKL 8KHz packs several competitive gaming-focused features, such as super-fast 8KHz polling and adjustable actuation points. While the keyboard is relatively thin, its aluminum build makes it sturdy and safe to travel with. And while it’s a gaming keyboard at its core, it’s also great for typing.</p><p>If you’re a competitive gamer who needs a keyboard that can keep up with you and won’t break the bank, the Razer Huntsman V3 Tenkeyless 8KHz is one of the <a href="https://www.tomsguide.com/best-picks/best-gaming-keyboard">best gaming keyboards</a> that's worth checking out. Here’s why.</p><div class="product"><a data-dimension112="56b2384a-814b-11f1-b86a-11d34ca164b1" data-action="Deal Block" data-label="Huntsman V3 Tenkeyless 8KHz" data-dimension48="Huntsman V3 Tenkeyless 8KHz" data-dimension25="$169" href="https://www.amazon.com/Razer-Huntsman-Esports-Gaming-Keyboard/dp/B0GWNHWWN8" 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="GQZWYf9pyTNyTxNzdKcnQh" name="Razer Huntsman V3 Tenkeyless 8KHz" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/GQZWYf9pyTNyTxNzdKcnQh.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Razer Huntsman V3 Tenkeyless 8KHz is a pro-grade gaming keyboard, featuring precise optical switches, a super-high 8K polling rate, adjustable actuation points, and full RGB lighting. At $169, it's the most affordable Huntsman V3 model currently available, and it's worth the money if you're a hardcore competitive PC gamer.<a class="view-deal button" href="https://www.amazon.com/Razer-Huntsman-Esports-Gaming-Keyboard/dp/B0GWNHWWN8" target="_blank" rel="nofollow" data-dimension112="56b2384a-814b-11f1-b86a-11d34ca164b1" data-action="Deal Block" data-label="Huntsman V3 Tenkeyless 8KHz" data-dimension48="Huntsman V3 Tenkeyless 8KHz" data-dimension25="$169">View Deal</a></p></div><h2 id="what-s-this-razer-huntsman-v3-all-about">What's this Razer Huntsman V3 all about?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qfm62vGH79v4W9e5Ythv4U" name="Razer Huntsman V3 TKL 8K--1" alt="Razer Huntsman V3 Tenkeyless 8KHz" src="https://cdn.mos.cms.futurecdn.net/qfm62vGH79v4W9e5Ythv4U.jpg" mos="" align="middle" fullscreen="" width="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 Razer Huntsman V3 TKL 8KHz is a competitive gaming keyboard built for fast-paced first-person shooters and other genres that demand quick reflexes. It utilizes the company’s proprietary analog optical switches, 8K “HyperPolling,” adjustable actuation, and a slew of RGB customization options.</p><p><a href="https://www.tomsguide.com/computing/peripherals/i-finally-tried-magnetic-key-switches-but-i-never-thought-id-find-them-in-a-split-keyboard-thats-also-wireless">Magnetic switches</a> have been all the rage in recent years, but Razer has remained true to its optical switches. Both switch types provide faster response times than traditional mechanical switches, which is why competitive gamers tend to gravitate toward them. I won’t debate whether optical or magnetic switches are better for gaming, but I will say Razer’s optical switches are insanely responsive.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="pCtyQhZn2pFFSxbjm22wGd" name="Razer Huntsman V3 TKL 8K--3" alt="Razer Huntsman V3 Tenkeyless 8KHz" src="https://cdn.mos.cms.futurecdn.net/pCtyQhZn2pFFSxbjm22wGd.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Like with magnetic switches, you can set multiple actuation points on a single key—two actuation points in this case. For example, you can have an actuation point of 2.0 mm on the W key to walk and 4.0 to run. Here, you can set actuation points between 0.1 mm and 4.0, which is standard for both magnetic and optical keyboards.</p><p>Then there’s the 8K polling (the speed at which the keyboard sends signals to your computer), which Razer says is faster than other keyboards claiming such a high polling rate. According to the company, most keyboards with 8K polling have a 1.6ms response time, but the Huntsman V3 has a faster 0.48ms response time.</p><p>So, how does all of that translate to real-world use? Though I’m nowhere near a competitive gamer, even I could feel the overall smoothness and fast response when playing a first-person shooter like <a href="https://www.tomsguide.com/gaming/doom-the-dark-ages-is-a-heavy-metal-album-cover-come-to-life-and-i-cant-wait-to-play-ithttps://www.tomsguide.com/gaming/doom-the-dark-ages-review">Doom: The Dark Ages</a>. I especially like setting a faster actuation point for shooting since I could lightly brush the key instead of pressing it down all the way. And in case you’re wondering, you can set the actuation points right on the keyboard, though I still preferred doing so via the Razer Synapse app on PC.</p><h2 id="the-experience">The experience</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HijJ7EnLSEG77tMhHZry8n" name="Razer Huntsman V3 TKL 8K--5" alt="Razer Huntsman V3 Tenkeyless 8KHz" src="https://cdn.mos.cms.futurecdn.net/HijJ7EnLSEG77tMhHZry8n.jpg" mos="" align="middle" fullscreen="" width="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 I’m not the target customer for a competitive gaming keyboard, I enjoy using them because of their fast response time and smooth keystrokes—which the Razer Huntsman V3 has in spades. While the blazing performance and high customization are fantastic, there’s more to this keyboard than those selling points.</p><p>The elevated keys, with their PBT-coated keycaps, are a joy to type on. One thing I especially appreciate as someone with a heavy touch is how the keys have more resistance the further you press them. The tenkeyless layout is also ideal for me since I don’t need a numberpad, making the board unnecessarily larger.</p><p>The thocky sound the keys produce also makes using the keyboard more enjoyable. Sure, the sound isn’t as deep as you’d find on mechanical keyboards, but it’s still good. While not a clicky board, it’s definitely noisy, so you might not want to use it in an office or anywhere that could annoy others (though I used it in the office anyway!).</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uuNMe4PGQ9m4HzhL9F2pBB" name="Razer Huntsman V3 TKL 8K--6" alt="Razer Huntsman V3 Tenkeyless 8KHz" src="https://cdn.mos.cms.futurecdn.net/uuNMe4PGQ9m4HzhL9F2pBB.jpg" mos="" align="middle" fullscreen="" width="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 aluminum frame not only helps give the keyboard a richer sound, but also makes it sturdy and durable. That’s important if you need to travel with the Huntsman V3. The brushed aluminum is a nice touch that gives the keyboard a more premium look without being overbearing. And while this is a gaming keyboard, it doesn’t look like one thanks to its overall subdued design.</p><p>Of course, if you want more of a gamer aesthetic, there is no shortage of RGB options to toy around with. I’m somewhat neutral on RGB lighting, but I like that folks can customize the lighting to their exact preference. This is Razer, so the company isn’t skimping on that front.</p><p>Lastly, this isn't a wireless keyboard, so you'll need to use a USB-A port on your PC. That said, the braided cable is detachable, which is good if you need to take the keyboard on the road.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eEqDge"></div>                            </div>                            <script src="https://kwizly.com/embed/eEqDge.js" async></script><h2 id="outlook">Outlook</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wCUPYccXjWrNm5u7hH2xcK" name="Razer Huntsman V3 TKL 8K--7" alt="Razer Huntsman V3 Tenkeyless 8KHz" src="https://cdn.mos.cms.futurecdn.net/wCUPYccXjWrNm5u7hH2xcK.jpg" mos="" align="middle" fullscreen="" width="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 Razer Huntsman V3 Tenkeyless 8K is an excellent gaming keyboard thanks to its robust, competitive gamer-focused features. Outside of gaming, it also delivers a nice typing experience thanks to its durable build and responsive keys. It’s a bit pricey at $169, but for what it offers, you’re definitely getting your money’s worth.</p><p>Again, I'm a fan of Razer keyboards, and this one has everything I've come to expect from the company's peripherals. While the Pro versions of this keyboard might have more features, I like the simplicity of this board, as it still delivers excellent performance. At $169, it's worth considering.</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/keyboards/logitech-g-g512-x-review">I became a keyboard tinkerer with the Logitech G G512 X</a></li><li><a href="https://www.tomsguide.com/computing/peripherals/i-just-got-my-first-gaming-keyboard-heres-why-ill-never-use-a-regular-board-again">I just got my first gaming keyboard — I’ll never use a regular board again</a></li><li><a href="https://www.tomsguide.com/computing/buying-a-gaming-keyboard-rapid-trigger-and-snap-tap-explained">Buying a gaming keyboard? Rapid Trigger and Snap Tap explained</a></li></ul><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=gaming+laptops&min_discount_ratio=0.95&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = this.getRowsLimit();          } else {             this.displayLimit += this.getRowsLimit();          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += this.getRowsLimit();                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');               document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I ditched my office chair for the Razer Iskur V2 NewGen and it finally sold me on gaming chairs ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I’ve been a gamer for as long as I can remember but when it came to my home office setup, I just couldn’t imagine using a gaming chair over an office chair.</p><p>While gaming chairs typically have racing bucket-style seats with a faux-leather finish, the <a href="https://www.tomsguide.com/home/home-office/best-office-chairs">best office chairs</a> come in a wider variety of designs and styles. From task chairs without headrests to ergonomic ones with dedicated lumbar support and my favorite, full-mesh office chairs with plenty of airflow, there are plenty of options to choose from.</p><p>Back when I first set up my home office, I wanted it to look as professional as possible. This meant a clean setup with few distractions. That’s why I opted for one of the <a href="https://www.tomsguide.com/home/home-office/best-standing-desks">best standing desks</a> and a nice ergonomic chair with a mesh backrest to go with it. Over the years, I’ve built countless desk setups while trying out dozens of different desks and chairs.</p><p>Still, I had yet to try a ‘true’ gaming chair, even if I did test out a few hybrid ones like the <a href="https://www.tomsguide.com/home/home-office/herman-miller-x-logitech-g-vantum-gaming-chair-review">Herman Miller Vantum</a>. That all changed recently when I reviewed the new <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-iskur-v2-newgen-review">Razer Iskur V2 NewGen</a> gaming chair. Although I’ve always considered myself an office chair purist, Razer’s latest finally won me over. Well, mostly.</p><h2 id="a-gaming-chair-with-an-ergonomic-twist">A gaming chair with an ergonomic 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="RZDhxRuHediv4jDwbB8mhT" name="Razer Iskur V2 NewGen-4" alt="A person slightly leaned back playing Death Stranding 2 on PC in the Razer Iskur V2 NewGen gaming chair" src="https://cdn.mos.cms.futurecdn.net/RZDhxRuHediv4jDwbB8mhT.jpg" mos="" align="middle" fullscreen="" width="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 Iskur V2 NewGen sits right at the top of Razer’s lineup as its flagship gaming chair, and for good reason. Alongside an upgraded EPU leather finish, this is the company’s most adjustable chair to date — and that’s exactly what drew me to it in the first place.</p><p>Compared to office chairs, gaming chairs often get a bad rap when it comes to their adjustability and fit. While many office chairs are engineered to conform to your spine’s natural curve and dynamically move with you as you shift throughout the day, a lot of gaming chairs feel rigid and stiff by comparison.</p><p>Although the original Iskur from 2020 suffered from these design flaws, Razer has since taken massive steps to completely overhaul its design and comfort. This started by completely reimagining the backrest and the adaptive lumbar support mechanism housed within 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="2mW7enrj7aToUTGbqYp7pX" name="Razer Iskur V2 NewGen-8" alt="A close-up shot of the lever and adjustment knobs on the right side of the Razer Iskur V2 NewGen gaming chair" src="https://cdn.mos.cms.futurecdn.net/2mW7enrj7aToUTGbqYp7pX.jpg" mos="" align="middle" fullscreen="" width="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>Instead of being static, the Iskur V2 NewGen’s lumbar support system now actively swivels and moves with you, while still allowing you to manually tweak it to your liking. A knob on the left side of the chair lets you move the mechanism up and down to align perfectly with the small of your back, while the knob on the right side allows you to control how far it extends out.</p><p>Not only is this a first for a gaming chair, it’s a feature you typically only find on premium office chairs — and even then, it’s not one I see all that often. What’s great about this updated system is that you can dial the lumbar support forward to keep your spine supported if you're leaning in close to your desk to focus. Then, when you want to sit back in a more relaxed position, you just turn the knob on the right to retract it so you can sit straight with plenty of lower back support.</p><h2 id="dead-simple-adjustments-and-recline">Dead simple adjustments (and recline)</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vPGm7wiDLePgH6xtodv43J" name="Razer Iskur V2 NewGen-3" alt="A close-up shot of a person pulling the handbrake-style lever used for reclining in the Razer Iskur V2 NewGen gaming chair" src="https://cdn.mos.cms.futurecdn.net/vPGm7wiDLePgH6xtodv43J.jpg" mos="" align="middle" fullscreen="" width="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 thing I’ve noticed with some of the higher-end office chairs I’ve reviewed is that their manufacturers often make them overly complicated — especially when it comes to their adjustments. The Iskur V2 NewGen, on the other hand, keeps things simple with a hand-brake style lever to adjust the chair’s recline and a series of buttons for its armrests.</p><p>These 4D armrests can be moved up/down, forward/backward, closer/further away from you and angled inward or outward. There’s nothing worse than having your chair’s armrests move on their own after you’ve painstakingly adjusted them to your liking, which is why I really like how the buttons on either side keep these ones from moving.</p><p>You don’t get a built-in footrest like with the <a href="https://www.tomsguide.com/home/home-office/hinomi-x1-review">Hinomi X1</a> or the <a href="https://www.tomsguide.com/home/home-office/hbada-x7-review">Hbada X7</a> I reviewed, nor is there a separate one like on the <a href="https://www.tomsguide.com/home/home-office/libernovo-omni-review">LiberNovo Omni</a>, but I still really enjoyed leaning back in the Iskur V2 NewGen. With the lever in hand, you just lean back as far as you want and when you let it go, the chair’s backrest stays locked in place. When it’s time to get up, you just grab the lever again and sit up.</p><p>With a max recline of 152 degrees, the Iskur V2 NewGen is great for kicking back, but it’s not really the kind of chair you’d want to take a nap in, especially without a built-in footrest.</p><h2 id="super-supportive-but-not-quite-mesh-cool">Super supportive but not quite mesh cool</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ehLV75tcXUtkBnU7Sqt97j" name="Steelcase Karman High Back-1" alt="A person sitting at a desk working from the Steelcase Karman High Back office chair" src="https://cdn.mos.cms.futurecdn.net/ehLV75tcXUtkBnU7Sqt97j.jpg" mos="" align="middle" fullscreen="" width="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 don’t get me wrong, I found the Iskur V2 NewGen’s backrest to be incredibly supportive — which makes sense given it’s a lot thicker than the backrests on the office chairs I routinely test. And while the cooling tech embedded in its EPU leather did help somewhat, it just couldn’t beat the airflow you get with a mesh office chair.</p><p>While a mesh backrest may be good enough for some people, I actually prefer an all-mesh chair that has a mesh seat too like the high-back version of the <a href="https://www.tomsguide.com/reviews/steelcase-karman">Steelcase Karman</a> pictured above. Since I live in Houston, Texas where it gets both hot and humid, I need as much airflow as possible year-round.</p><p>If you still prefer a gaming chair with a racing-style seat, there are things you can do to mitigate the extra heat that comes with a faux-leather finish. For instance, while testing the Iskur V2 NewGen, I had a tower fan pointed at me at all times. However, when I moved it into a smaller room with an overhead fan, that really did the trick.</p><p>Now after two months, would I daily drive a gaming chair? I still don’t think I would, given I live in a hotter climate. However, when the sun goes down and it finally gets cooler, kicking back in the Iskur V2 NewGen to play some games has been an absolute delight. It might not be the ideal work-from-home chair — at least for me — but it is an excellent chair to game in.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-made-one-of-the-best-gaming-chairs-even-better-by-turning-it-into-a-recliner-heres-how">I made one of the best gaming chairs even better by turning it into a recliner — here’s how</a></li><li><a href="https://www.tomsguide.com/opinion/i-tested-the-folding-gaming-chair-and-now-i-may-never-go-back-to-the-couch">I tested The Folding Gaming Chair and now I may never go back to the couch</a></li><li><a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-just-sat-on-my-dream-gaming-chair-and-now-im-fighting-the-urge-to-take-a-nap-to-tell-you-about-the-cougar-arker">I just sat on my dream gaming chair, and now I’m fighting the urge to take a nap to tell you about the Cougar Arker</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/i-ditched-my-office-chair-for-the-razer-iskur-v2-newgen-and-it-finally-sold-me-on-gaming-chairs</link>
                                                                            <description>
                            <![CDATA[ Gaming chairs get overlooked due to their design but you can still get one with the support and ergonomics of an office chair if you know what to look for. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">UFcZCDSHeTAopjsE67thRW</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/PU5kVTqMzSmEi3ZuGJ5DsD-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 12 Jul 2026 11:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Home Office]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                                                                <author><![CDATA[ anthony.spadafora@futurenet.com (Anthony Spadafora) ]]></author>                    <dc:creator><![CDATA[ Anthony Spadafora ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/z73LEoj7FkUjNG85GcWHtH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Anthony Spadafora is the managing editor for security and home office furniture at Tom’s Guide where he covers everything from data breaches and malware to password managers and the best way to cover your whole home or business with a strong Wi-Fi signal.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Before joining the team, he spent three years covering cybersecurity and B2B tech for ITProPortal while living in South Korea. After moving back to the US. Anthony joined the TechRadar Pro team where he covered these topics along with VPNs, web hosting, online collaboration software and video conferencing for four years. Anthony also has his ears to the ground and is on the lookout for the next major cyberattack or data breach.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Based in Houston, Texas, Anthony also handles VPN testing for both Tom’s Guide and TechRadar. As someone who has worked from home exclusively since 2018, he has reviewed dozens of standing desks as well as office chairs and has taken a closer look at other essential remote working accessories. As part of these reviews, Anthony frequently builds intricate desk setups which is why he’s such a big advocate for cable management and keeping things organized. When he’s not writing, he can be found tinkering with PCs and game consoles, managing cables and making upgrades to his smart home.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/PU5kVTqMzSmEi3ZuGJ5DsD-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A side by side shot with the Razer Iskur V2 NewGen on the left and the LiberNovo Omni on the right]]></media:description>                                                            <media:text><![CDATA[A side by side shot with the Razer Iskur V2 NewGen on the left and the LiberNovo Omni on the right]]></media:text>
                                <media:title type="plain"><![CDATA[A side by side shot with the Razer Iskur V2 NewGen on the left and the LiberNovo Omni on the right]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/PU5kVTqMzSmEi3ZuGJ5DsD-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I’ve been a gamer for as long as I can remember but when it came to my home office setup, I just couldn’t imagine using a gaming chair over an office chair.</p><p>While gaming chairs typically have racing bucket-style seats with a faux-leather finish, the <a href="https://www.tomsguide.com/home/home-office/best-office-chairs">best office chairs</a> come in a wider variety of designs and styles. From task chairs without headrests to ergonomic ones with dedicated lumbar support and my favorite, full-mesh office chairs with plenty of airflow, there are plenty of options to choose from.</p><p>Back when I first set up my home office, I wanted it to look as professional as possible. This meant a clean setup with few distractions. That’s why I opted for one of the <a href="https://www.tomsguide.com/home/home-office/best-standing-desks">best standing desks</a> and a nice ergonomic chair with a mesh backrest to go with it. Over the years, I’ve built countless desk setups while trying out dozens of different desks and chairs.</p><p>Still, I had yet to try a ‘true’ gaming chair, even if I did test out a few hybrid ones like the <a href="https://www.tomsguide.com/home/home-office/herman-miller-x-logitech-g-vantum-gaming-chair-review">Herman Miller Vantum</a>. That all changed recently when I reviewed the new <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-iskur-v2-newgen-review">Razer Iskur V2 NewGen</a> gaming chair. Although I’ve always considered myself an office chair purist, Razer’s latest finally won me over. Well, mostly.</p><h2 id="a-gaming-chair-with-an-ergonomic-twist">A gaming chair with an ergonomic 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="RZDhxRuHediv4jDwbB8mhT" name="Razer Iskur V2 NewGen-4" alt="A person slightly leaned back playing Death Stranding 2 on PC in the Razer Iskur V2 NewGen gaming chair" src="https://cdn.mos.cms.futurecdn.net/RZDhxRuHediv4jDwbB8mhT.jpg" mos="" align="middle" fullscreen="" width="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 Iskur V2 NewGen sits right at the top of Razer’s lineup as its flagship gaming chair, and for good reason. Alongside an upgraded EPU leather finish, this is the company’s most adjustable chair to date — and that’s exactly what drew me to it in the first place.</p><p>Compared to office chairs, gaming chairs often get a bad rap when it comes to their adjustability and fit. While many office chairs are engineered to conform to your spine’s natural curve and dynamically move with you as you shift throughout the day, a lot of gaming chairs feel rigid and stiff by comparison.</p><p>Although the original Iskur from 2020 suffered from these design flaws, Razer has since taken massive steps to completely overhaul its design and comfort. This started by completely reimagining the backrest and the adaptive lumbar support mechanism housed within 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="2mW7enrj7aToUTGbqYp7pX" name="Razer Iskur V2 NewGen-8" alt="A close-up shot of the lever and adjustment knobs on the right side of the Razer Iskur V2 NewGen gaming chair" src="https://cdn.mos.cms.futurecdn.net/2mW7enrj7aToUTGbqYp7pX.jpg" mos="" align="middle" fullscreen="" width="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>Instead of being static, the Iskur V2 NewGen’s lumbar support system now actively swivels and moves with you, while still allowing you to manually tweak it to your liking. A knob on the left side of the chair lets you move the mechanism up and down to align perfectly with the small of your back, while the knob on the right side allows you to control how far it extends out.</p><p>Not only is this a first for a gaming chair, it’s a feature you typically only find on premium office chairs — and even then, it’s not one I see all that often. What’s great about this updated system is that you can dial the lumbar support forward to keep your spine supported if you're leaning in close to your desk to focus. Then, when you want to sit back in a more relaxed position, you just turn the knob on the right to retract it so you can sit straight with plenty of lower back support.</p><h2 id="dead-simple-adjustments-and-recline">Dead simple adjustments (and recline)</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vPGm7wiDLePgH6xtodv43J" name="Razer Iskur V2 NewGen-3" alt="A close-up shot of a person pulling the handbrake-style lever used for reclining in the Razer Iskur V2 NewGen gaming chair" src="https://cdn.mos.cms.futurecdn.net/vPGm7wiDLePgH6xtodv43J.jpg" mos="" align="middle" fullscreen="" width="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 thing I’ve noticed with some of the higher-end office chairs I’ve reviewed is that their manufacturers often make them overly complicated — especially when it comes to their adjustments. The Iskur V2 NewGen, on the other hand, keeps things simple with a hand-brake style lever to adjust the chair’s recline and a series of buttons for its armrests.</p><p>These 4D armrests can be moved up/down, forward/backward, closer/further away from you and angled inward or outward. There’s nothing worse than having your chair’s armrests move on their own after you’ve painstakingly adjusted them to your liking, which is why I really like how the buttons on either side keep these ones from moving.</p><p>You don’t get a built-in footrest like with the <a href="https://www.tomsguide.com/home/home-office/hinomi-x1-review">Hinomi X1</a> or the <a href="https://www.tomsguide.com/home/home-office/hbada-x7-review">Hbada X7</a> I reviewed, nor is there a separate one like on the <a href="https://www.tomsguide.com/home/home-office/libernovo-omni-review">LiberNovo Omni</a>, but I still really enjoyed leaning back in the Iskur V2 NewGen. With the lever in hand, you just lean back as far as you want and when you let it go, the chair’s backrest stays locked in place. When it’s time to get up, you just grab the lever again and sit up.</p><p>With a max recline of 152 degrees, the Iskur V2 NewGen is great for kicking back, but it’s not really the kind of chair you’d want to take a nap in, especially without a built-in footrest.</p><h2 id="super-supportive-but-not-quite-mesh-cool">Super supportive but not quite mesh cool</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ehLV75tcXUtkBnU7Sqt97j" name="Steelcase Karman High Back-1" alt="A person sitting at a desk working from the Steelcase Karman High Back office chair" src="https://cdn.mos.cms.futurecdn.net/ehLV75tcXUtkBnU7Sqt97j.jpg" mos="" align="middle" fullscreen="" width="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 don’t get me wrong, I found the Iskur V2 NewGen’s backrest to be incredibly supportive — which makes sense given it’s a lot thicker than the backrests on the office chairs I routinely test. And while the cooling tech embedded in its EPU leather did help somewhat, it just couldn’t beat the airflow you get with a mesh office chair.</p><p>While a mesh backrest may be good enough for some people, I actually prefer an all-mesh chair that has a mesh seat too like the high-back version of the <a href="https://www.tomsguide.com/reviews/steelcase-karman">Steelcase Karman</a> pictured above. Since I live in Houston, Texas where it gets both hot and humid, I need as much airflow as possible year-round.</p><p>If you still prefer a gaming chair with a racing-style seat, there are things you can do to mitigate the extra heat that comes with a faux-leather finish. For instance, while testing the Iskur V2 NewGen, I had a tower fan pointed at me at all times. However, when I moved it into a smaller room with an overhead fan, that really did the trick.</p><p>Now after two months, would I daily drive a gaming chair? I still don’t think I would, given I live in a hotter climate. However, when the sun goes down and it finally gets cooler, kicking back in the Iskur V2 NewGen to play some games has been an absolute delight. It might not be the ideal work-from-home chair — at least for me — but it is an excellent chair to game in.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-made-one-of-the-best-gaming-chairs-even-better-by-turning-it-into-a-recliner-heres-how">I made one of the best gaming chairs even better by turning it into a recliner — here’s how</a></li><li><a href="https://www.tomsguide.com/opinion/i-tested-the-folding-gaming-chair-and-now-i-may-never-go-back-to-the-couch">I tested The Folding Gaming Chair and now I may never go back to the couch</a></li><li><a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-just-sat-on-my-dream-gaming-chair-and-now-im-fighting-the-urge-to-take-a-nap-to-tell-you-about-the-cougar-arker">I just sat on my dream gaming chair, and now I’m fighting the urge to take a nap to tell you about the Cougar Arker</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I ditched my office chair for the Razer Iskur V2 NewGen and it finally sold me on gaming chairs ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Just when I thought this flagship gaming chair couldn’t get any better, Razer has released its upgraded Iskur V2 NewGen. While the V2 had plenty of improvements, this new model features a comfier yet more supportive dual-density cold-cured foam cushion and upgraded EPU synthetic leather with built-in cooling tech.</p><p>I still remember <a href="https://www.tomsguide.com/opinion/i-tried-the-amazing-razer-iskur-v2-at-ces-2024-and-it-changes-the-game-for-gaming-chairs">trying out the Iskur V2</a> during my first trip to CES and walking away very impressed with its upgraded lumbar support system. The Iskur V2 NewGen isn’t a complete redesign as it retains what made that model one of the <a href="https://www.tomsguide.com/best-picks/best-gaming-chairs">best gaming chairs</a>. Instead, it’s more of a refinement designed to be more comfortable while feeling significantly more premium.</p><p>Although I typically spend my days (and my nights) sitting in one of the <a href="https://www.tomsguide.com/home/home-office/best-office-chairs">best office chairs</a>, the Razer Iskur V2 NewGen has been a nice change of pace. From the instant I sat in it, I really liked its stiffer backrest and wide, comfy seat. Likewise, it was a breeze to put together and locking in the perfect fit comes easily too, thanks to the knobs on either side and the lever to control its recline. Still though, this is a high-end gaming chair with a $649 price tag and unfortunately, there isn’t a fabric option like with most of Razer’s other chairs. </p><p>My Razer Iskur V2 NewGen review will help you decide if this is the right gaming chair for you or if you’d be better off going with the cheaper yet less full-featured Iskur V2 X instead.</p><h3 class="article-body__section" id="section-razer-iskur-v2-newgen-cheat-sheet"><span>Razer Iskur V2 NewGen: Cheat Sheet</span></h3><ul><li><strong>What is it? </strong>A premium gaming chair with a strong focus on ergonomics and cooling.</li><li><strong>Who is it for? </strong>People who want a very adjustable seat with dedicated lumbar support which they can use for long stretches at a time comfortably that still looks like a gaming chair.</li><li><strong>What does it cost? </strong>The Razer Iskur V2 NewGen <a href="https://www.razer.com/gaming-chairs/razer-iskur-v2-newgen" target="_blank" rel="nofollow">costs $649</a> regardless of which colorway you choose.</li><li><strong>What do we like? </strong>The adaptive lumbar support system, the wider backrest and seat base, the extra thick foam seat cushion and how easy it is to adjust using the built-in lever and knobs.</li><li><strong>What don’t we like? </strong>That the upgraded synthetic leather can still feel hot after extended periods and the higher price compared to other similarly-specced gaming chairs.</li></ul><h3 class="article-body__section" id="section-razer-iskur-v2-newgen-specs"><span>Razer Iskur V2 NewGen: Specs</span></h3><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$649</p></td></tr><tr><td class="firstcol " ><p><strong>Height range</strong></p></td><td  ><p>50.7 to 54.7 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Seat width</strong></p></td><td  ><p>20.9 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Seat depth</strong></p></td><td  ><p>19.1 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Maximum load</strong></p></td><td  ><p>299 pounds</p></td></tr><tr><td class="firstcol " ><p><strong>Maximum recline</strong></p></td><td  ><p>152 degrees</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>60 pounds</p></td></tr><tr><td class="firstcol " ><p><strong>Material</strong></p></td><td  ><p>EPU synthetic leather, high-density cold-cured foam, steel tube frame, 5-star powder-coated aluminum alloy base</p></td></tr><tr><td class="firstcol " ><p><strong>Adjustment points</strong></p></td><td  ><p>8</p></td></tr><tr><td class="firstcol " ><p><strong>Warranty</strong></p></td><td  ><p>3 years</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-razer-iskur-v2-newgen-the-ups"><span>Razer Iskur V2 NewGen: The ups</span></h3><p>The Razer Iskur V2 NewGen offers exactly what you’d expect from a premium gaming chair in terms of design and comfort. However, it doesn’t skimp on ergonomics either with an adjustable lumbar support system that moves with your back as you shift in your chair while gaming or even working from home.</p><h2 id="a-color-coded-build">A color-coded build</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XcyUnSDyaeSYryqKWNi7dX" name="Razer Iskur V2 NewGen-10" alt="The Razer Iskur V2 NewGen unboxed with all of the parts laid out on the floor" src="https://cdn.mos.cms.futurecdn.net/XcyUnSDyaeSYryqKWNi7dX.jpg" mos="" align="middle" fullscreen="" width="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 Razer Iskur V2 NewGen arrived in a single large brown box with everything packed neatly inside. While I wish it came as pre-assembled as the more expensive <a href="https://www.tomsguide.com/home/home-office/herman-miller-x-logitech-g-vantum-gaming-chair-review">Herman Miller Vantum</a>, it was surprisingly simple to put together.</p><p>With everything unpacked, I was left with the Iskur V2 NewGen’s backrest, frame, seat, casters and the rest of the parts needed to assemble it. <strong>One thing I really liked is that the armrests did come pre-attached, which is a nice touch given how tedious installing them yourself can be.</strong></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vBV4uQv5dRAnVRdRXc3pba" name="Razer Iskur V2 NewGen-11" alt="A person holding the Razer Iskur V2 NewGen's printed assembly instructions in hand" src="https://cdn.mos.cms.futurecdn.net/vBV4uQv5dRAnVRdRXc3pba.jpg" mos="" align="middle" fullscreen="" width="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 other companies will often have you scan a QR code to view their assembly instructions online, Razer includes a large printout with key steps highlighted in the company’s signature Razer green. Speaking of which, you also get a pair of black gloves with that same accent color in the box so you don’t get any grease on your hands when installing the chair’s lift mechanism.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="oUhDaiPSfKjyUzj3mCoJRd" name="Razer Iskur V2 NewGen-12" alt="A person building the Razer Iskur V2 NewGen gaming chair" src="https://cdn.mos.cms.futurecdn.net/oUhDaiPSfKjyUzj3mCoJRd.jpg" mos="" align="middle" fullscreen="" width="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>Building the Iskur V2 NewGen was a straightforward process using the included Allen wrench. I’d say the hardest part was connecting the seat to the backrest but honestly, this was quite easy to do compared to some of the office chairs I’ve built over the years.</p><p>With the Iskur V2 NewGen fully assembled, it was time to take it for a spin.</p><h2 id="wider-all-around">Wider all around</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ViFvDSrzqoY8MNpLRwiApg" name="Razer Iskur V2 NewGen-9" alt="The Razer Iskur V2 NewGen gaming chair fully assembled" src="https://cdn.mos.cms.futurecdn.net/ViFvDSrzqoY8MNpLRwiApg.jpg" mos="" align="middle" fullscreen="" width="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 looking at the Iskur V2 NewGen, it’s hard not to notice its curves. In fact, this gaming chair almost has an hourglass figure since it’s skinniest at the center where the seat meets the backrest and extends out in either direction.</p><p>This was intentional on Razer’s part as a big focus of this NewGen refresh is comfort. The chair is just under 16 inches at its skinniest point. However, the seat extends out to 20.9 inches at its edge while the backrest goes even wider at 21.3 inches. <strong>The extended seat allows you to sit cross-legged in this gaming chair while the extended backrest provides plenty of room for those with wider shoulders.</strong></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="pKjsse3jowu8F4npKRHKoj" name="Razer Iskur V2 NewGen-5" alt="The seat pan and armrests of the Razer Iskur V2 NewGen gaming chair" src="https://cdn.mos.cms.futurecdn.net/pKjsse3jowu8F4npKRHKoj.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As someone on the smaller side at 5’4”, I still found this extra space to be quite nice to have. I had plenty of room as I shifted from side to side in the Iskur V2 NewGen’s seat and the same was true for my shoulders when my back leaned from left to right.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="fseRQsN6r23nq2hHefv9w3" name="Razer Iskur V2 NewGen-6" alt="A close-up shot of the included memory foam head cushion that comes with the Razer Iskur V2 NewGen gaming chair" src="https://cdn.mos.cms.futurecdn.net/fseRQsN6r23nq2hHefv9w3.jpg" mos="" align="middle" fullscreen="" width="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 I would have preferred a magnetic head cushion like on the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/secretlab-titan-evo-2022-review">Secretlab Titan Evo</a>, I did find the included one made from sculpted memory foam to be quite comfortable even for long stretches. However, I did swap it for the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-ditched-my-headset-for-this-wireless-speaker-head-cushion-and-now-i-have-surround-sound-right-from-my-gaming-chair">Razer Clio</a> when playing PS5 at my desk since I had a pair of <a href="https://www.tomsguide.com/reviews/razer-nommo-v2-pro">Razer Nommo V2 Pro</a> speakers connected to my gaming PC via USB-C and to my Switch 2 over Bluetooth.</p><h2 id="just-the-pull-of-a-lever">Just the pull of a lever</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vPGm7wiDLePgH6xtodv43J" name="Razer Iskur V2 NewGen-3" alt="A close-up shot of a person pulling the handbrake-style lever used for reclining in the Razer Iskur V2 NewGen gaming chair" src="https://cdn.mos.cms.futurecdn.net/vPGm7wiDLePgH6xtodv43J.jpg" mos="" align="middle" fullscreen="" width="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 thing I really prefer with the Iskur V2 NewGen over some of the more over-designed office chairs I regularly test is the simplicity of its adjustments. Fine-tuning this chair for the perfect fit only takes a few minutes and the more complicated adjustments come with illustrations to further simplify the process.</p><p>There are adjustment knobs on the left and right side — but more on that later — and a lever that controls the chair’s recline. Everything is right there within reach and I never had to get out of the Iskur V2 NewGen to make adjustments.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="x3Nc8C2NBqsgSR3GZR5wz8" name="Razer Iskur V2 NewGen-7" alt="The backrest adjustment knob and height adjustment lever on the left side of the Razer Iskur V2 NewGen gaming chair" src="https://cdn.mos.cms.futurecdn.net/x3Nc8C2NBqsgSR3GZR5wz8.jpg" mos="" align="middle" fullscreen="" width="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 chair also comes with 4D armrests that you can move up or down, forward or backward, closer or farther away from you and angled inward or outward. Unlike some of the 4D or even 6D armrests I’ve tested on office chairs, I really like how the ones on the Iskur V2 NewGen stay firmly in place. One of my biggest gripes with Herman Miller’s Vantum gaming chair is that I’d need to readjust the pads of its armrests almost every time I sat down.</p><p>Given that a lot of office chairs require you to unlock a lever and then lean back whenever you want to recline, the larger, handbrake-style lever on the right side of the Iskur V2 NewGen was a welcome change for me. <strong>I’d just hold onto the lever and lean back to my preferred recline position with it in my hand.</strong></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JpXuoNXpyuCmoiSGCbMfkN" name="Razer Iskur V2 NewGen-2" alt="A person fully reclined in the Razer Iskur V2 NewGen gaming chair playing games remotely on a tablet using the Razer Kishi Ultra mobile game controller" src="https://cdn.mos.cms.futurecdn.net/JpXuoNXpyuCmoiSGCbMfkN.jpg" mos="" align="middle" fullscreen="" width="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 I spent a lot of my time gaming upright while trying out the Iskur V2 NewGen, I did put its recline to the test while using the <a href="https://www.tomsguide.com/gaming/i-built-the-ultimate-remote-play-setup-with-wi-fi-7-to-say-goodbye-to-stuttery-gameplay-for-good-heres-how">Razer Kishi Ultra</a> and my <a href="https://www.tomsguide.com/computing/tablets/i-thought-the-ipad-mini-was-the-perfect-small-tablet-until-i-tried-the-lenovo-legion-tab-3-heres-why">Lenovo Legion Tab 3</a> for some remote gaming. </p><p>While an integrated footrest like on the <a href="https://www.tomsguide.com/home/home-office/hbada-x7-review">Hbada X7</a> or even a standalone one like with the <a href="https://www.tomsguide.com/home/home-office/libernovo-omni-review">LiberNovo Omni</a> would have been nice, it was still quite comfortable playing some PC games using the Steam Link app while laying almost completely flat in the Iskur V2 NewGen.</p><h2 id="lumbar-that-moves-with-you">Lumbar that moves with 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RRWno8k9jftM45SbQCQvPS" name="BoxPlates-6" alt="A person playing AstroBot on a PS5 Pro outfitted with BoxPlates console covers" src="https://cdn.mos.cms.futurecdn.net/RRWno8k9jftM45SbQCQvPS.jpg" mos="" align="middle" fullscreen="" width="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 Iskur V2, the adaptive lumbar support is one of the standout features of this gaming chair. After using it as my daily driver for the past two months, it’s easy to see why.</p><div><blockquote><p>Unlike a traditional lumbar support mechanism, this one is able to move with you as you shift from side to side in the Iskur V2 NewGen. </p></blockquote></div><p>Unlike a traditional lumbar support mechanism, this one is able to move with you as you shift from side to side in the Iskur V2 NewGen. For instance, you can feel it move if you look over to either side from your desk. However, I found it to be even more useful in fast-paced games where I tend to move around a bit more than I normally would while working.</p><p>While the lumbar support systems in some of the office chairs I reviewed are completely static — meaning they don't pivot or track your spine dynamically as you shift — Razer's system lets you fine-tune its position both vertically and horizontally.</p><p>A knob on the left side of the Iskur V2 NewGen allows you to move the lumbar support up and down so it can perfectly align with the small of your back. The knob on the right side is what really impressed me with the original Iskur V2 and this refreshed model.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="fgyAYfGmhERoErHha5c8B8" name="Razer Iskur V2-1.jpg" alt="Dr. Hwu adjusting the knobs on the Razer Iskur V2" src="https://cdn.mos.cms.futurecdn.net/fgyAYfGmhERoErHha5c8B8.jpg" mos="" align="middle" fullscreen="" width="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 turn this knob, the lumbar support mechanism either extends or retracts. As 1HP’s Dr. Matthew Hwu explained to me a few years ago at Razer’s CES booth, if you tend to lean forward while playing the <a href="https://www.tomsguide.com/best-picks/best-PC-games">best PC games</a> at your desk, then you might want to extend the Iskur V2 NewGen’s lumbar support all the way forward. That way, you can sit in your preferred gaming position without hurting your 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="RZDhxRuHediv4jDwbB8mhT" name="Razer Iskur V2 NewGen-4" alt="A person slightly leaned back playing Death Stranding 2 on PC in the Razer Iskur V2 NewGen gaming chair" src="https://cdn.mos.cms.futurecdn.net/RZDhxRuHediv4jDwbB8mhT.jpg" mos="" align="middle" fullscreen="" width="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 for me, while I did play some <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 PC while seated in the Iskur V2 NewGen, I actually spent the majority of my time testing the chair out while playing <a href="https://www.tomsguide.com/gaming/nintendo/star-fox-review">Star Fox</a> on the Nintendo Switch 2 ahead of my review. During those epic interstellar dog fights with Star Wolf, I put the chair’s adaptive lumbar support to good use as I dodged incoming enemy laser fire.</p><h3 class="article-body__section" id="section-razer-iskur-v2-newgen-the-downs"><span>Razer Iskur V2 NewGen: The downs</span></h3><p>The Razer Iskur V2 NewGen certainly performs as a gaming chair but it isn’t without its downsides which include its higher price and how the upgraded cooling tech in its EPU leather just can’t match mesh. </p><h2 id="cooler-but-still-not-cool-enough">Cooler but still not cool enough</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="2mW7enrj7aToUTGbqYp7pX" name="Razer Iskur V2 NewGen-8" alt="A close-up shot of the lever and adjustment knobs on the right side of the Razer Iskur V2 NewGen gaming chair" src="https://cdn.mos.cms.futurecdn.net/2mW7enrj7aToUTGbqYp7pX.jpg" mos="" align="middle" fullscreen="" width="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 I live in Houston, Texas, using a mesh office chair like the <a href="https://www.tomsguide.com/reviews/steelcase-karman">Steelcase Karman</a> or the more affordable <a href="https://www.tomsguide.com/home/home-office/branch-aire-chair-review">Branch Aire Chair</a> really isn’t an option — it’s a must. </p><p>Given we’re at the start of what’s already looking to be a very hot and humid summer, I was initially a bit reluctant about testing the Iskur V2 NewGen. However, since I tried and really liked the standard Iskur V2, I figured I’d see how well this chair’s new cooling tech performed in a less than ideal situation.</p><p>To make this refreshed chair cooler, Razer switched to a new version of its EPU synthetic leather which has CoolTouch fibers embedded within it. On paper, this sounds like it should really make a difference but in my testing, even this high-tech new material fell a bit short for me.</p><p>When I was using the Iskur V2 NewGen out in my game room with just a tower fan — alongside central air — to keep me cool, I found that I got sweaty faster than I normally would with a mesh office chair. It got so bad that I moved my <a href="https://www.tomsguide.com/home/smart-home/i-bought-a-smart-fan-to-beat-the-heat-and-i-never-thought-id-have-this-much-fun-controlling-a-fan-from-my-phone">Govee Smart Tower Fan 2 Max</a> from in front of our couch over to my desk at the back of the room. That made things slightly better.</p><p>In my final week or so testing the Iskur V2 NewGen, I brought it into my office which has a large overhead fan. Maybe it’s due to the room being much smaller but this certainly made a difference.</p><p>Now, if you’re using the Iskur V2 NewGen in a more temperate climate, I doubt you’ll run into the issues I did with it. However, if you’re in a warmer and muggier location like I am, I’d recommend the <a href="https://www.tomsguide.com/reviews/razer-fujin-pro">Razer Fujin Pro</a>, which is designed more like a mesh office chair than a traditional gaming chair.</p><h2 id="upgrading-at-a-premium">Upgrading at a premium</h2><p>At $649, the Iskur V2 NewGen is certainly an investment. However, if you have a bad back or want a chair with a wider seat and backrest, it could definitely be worth it. While you might look a tad silly in video calls, I found the Iskur V2 NewGen just as comfortable to work in as it was to game in.</p><p>If you’re after a premium gaming chair but want to pick one up at a slightly lower price, the Secretlab Titan Evo starts at $549 and unlike the Iskur V2 NewGen, it’s available in both fabric and leather. Then again, if you like the design of this chair and don’t necessarily need adaptive lumbar support or 4D armrests, you could always opt for the less expensive Razer Iskur V2 X NewGen for $349.</p><p>While the Iskur V2 NewGen is on the expensive side, it is cheaper than the Herman Miller Vantum which costs nearly $1,000. On the other hand though, the Vantum won’t look out of place in a video call for work as from the front, it looks just like any other mesh office chair.</p><h3 class="article-body__section" id="section-razer-iskur-v2-newgen-verdict"><span>Razer Iskur V2 NewGen: Verdict</span></h3><p>The Razer Iskur V2 NewGen is an excellent gaming chair with a one-of-a-kind adaptive lumbar support system that makes a major difference every time you sit in it. While its high-tech EPU synthetic leather left a bit to be desired for me personally, this new material is still a significant upgrade over past versions and under the right conditions, it can keep you cool while gaming for longer. Likewise, the Iskur V2 NewGen is incredibly easy to put together and to fine-tune its adjustments to your liking.</p><p>If you’re looking for a traditional, racing-style gaming chair but still want the ergonomic support you get from an office chair, you’d be hard-pressed to find this level of comfort and polish anywhere else. Still, you are paying a bit more for the privilege. However, if you game for long hours daily or plan to have the Iskur V2 NewGen serve double duty as your work-from-home chair, then it could certainly be worth it.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/razer-iskur-v2-newgen-review</link>
                                                                            <description>
                            <![CDATA[ The Razer Iskur V2 NewGen takes the original’s design a step further to make for a more comfortable (and cooler) gaming chair. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">GkWhGHS6x7hbbQ3sbPxmgC</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/j6Zwjr3KGXwEioN8NJkpmQ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 09 Jul 2026 10:00:00 +0000</pubDate>                                                                                                                                <updated>Sat, 11 Jul 2026 01:17:07 +0000</updated>
                                                                                                                                            <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Home Office]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                                                                <author><![CDATA[ anthony.spadafora@futurenet.com (Anthony Spadafora) ]]></author>                    <dc:creator><![CDATA[ Anthony Spadafora ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/z73LEoj7FkUjNG85GcWHtH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Anthony Spadafora is the managing editor for security and home office furniture at Tom’s Guide where he covers everything from data breaches and malware to password managers and the best way to cover your whole home or business with a strong Wi-Fi signal.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Before joining the team, he spent three years covering cybersecurity and B2B tech for ITProPortal while living in South Korea. After moving back to the US. Anthony joined the TechRadar Pro team where he covered these topics along with VPNs, web hosting, online collaboration software and video conferencing for four years. Anthony also has his ears to the ground and is on the lookout for the next major cyberattack or data breach.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Based in Houston, Texas, Anthony also handles VPN testing for both Tom’s Guide and TechRadar. As someone who has worked from home exclusively since 2018, he has reviewed dozens of standing desks as well as office chairs and has taken a closer look at other essential remote working accessories. As part of these reviews, Anthony frequently builds intricate desk setups which is why he’s such a big advocate for cable management and keeping things organized. When he’s not writing, he can be found tinkering with PCs and game consoles, managing cables and making upgrades to his smart home.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/j6Zwjr3KGXwEioN8NJkpmQ-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Razer Iskur V2 NewGen gaming chair in front of a desk]]></media:description>                                                            <media:text><![CDATA[The Razer Iskur V2 NewGen gaming chair in front of a desk]]></media:text>
                                <media:title type="plain"><![CDATA[The Razer Iskur V2 NewGen gaming chair in front of a desk]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/j6Zwjr3KGXwEioN8NJkpmQ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Just when I thought this flagship gaming chair couldn’t get any better, Razer has released its upgraded Iskur V2 NewGen. While the V2 had plenty of improvements, this new model features a comfier yet more supportive dual-density cold-cured foam cushion and upgraded EPU synthetic leather with built-in cooling tech.</p><p>I still remember <a href="https://www.tomsguide.com/opinion/i-tried-the-amazing-razer-iskur-v2-at-ces-2024-and-it-changes-the-game-for-gaming-chairs">trying out the Iskur V2</a> during my first trip to CES and walking away very impressed with its upgraded lumbar support system. The Iskur V2 NewGen isn’t a complete redesign as it retains what made that model one of the <a href="https://www.tomsguide.com/best-picks/best-gaming-chairs">best gaming chairs</a>. Instead, it’s more of a refinement designed to be more comfortable while feeling significantly more premium.</p><p>Although I typically spend my days (and my nights) sitting in one of the <a href="https://www.tomsguide.com/home/home-office/best-office-chairs">best office chairs</a>, the Razer Iskur V2 NewGen has been a nice change of pace. From the instant I sat in it, I really liked its stiffer backrest and wide, comfy seat. Likewise, it was a breeze to put together and locking in the perfect fit comes easily too, thanks to the knobs on either side and the lever to control its recline. Still though, this is a high-end gaming chair with a $649 price tag and unfortunately, there isn’t a fabric option like with most of Razer’s other chairs. </p><p>My Razer Iskur V2 NewGen review will help you decide if this is the right gaming chair for you or if you’d be better off going with the cheaper yet less full-featured Iskur V2 X instead.</p><h3 class="article-body__section" id="section-razer-iskur-v2-newgen-cheat-sheet"><span>Razer Iskur V2 NewGen: Cheat Sheet</span></h3><ul><li><strong>What is it? </strong>A premium gaming chair with a strong focus on ergonomics and cooling.</li><li><strong>Who is it for? </strong>People who want a very adjustable seat with dedicated lumbar support which they can use for long stretches at a time comfortably that still looks like a gaming chair.</li><li><strong>What does it cost? </strong>The Razer Iskur V2 NewGen <a href="https://www.razer.com/gaming-chairs/razer-iskur-v2-newgen" target="_blank" rel="nofollow">costs $649</a> regardless of which colorway you choose.</li><li><strong>What do we like? </strong>The adaptive lumbar support system, the wider backrest and seat base, the extra thick foam seat cushion and how easy it is to adjust using the built-in lever and knobs.</li><li><strong>What don’t we like? </strong>That the upgraded synthetic leather can still feel hot after extended periods and the higher price compared to other similarly-specced gaming chairs.</li></ul><h3 class="article-body__section" id="section-razer-iskur-v2-newgen-specs"><span>Razer Iskur V2 NewGen: Specs</span></h3><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$649</p></td></tr><tr><td class="firstcol " ><p><strong>Height range</strong></p></td><td  ><p>50.7 to 54.7 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Seat width</strong></p></td><td  ><p>20.9 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Seat depth</strong></p></td><td  ><p>19.1 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Maximum load</strong></p></td><td  ><p>299 pounds</p></td></tr><tr><td class="firstcol " ><p><strong>Maximum recline</strong></p></td><td  ><p>152 degrees</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>60 pounds</p></td></tr><tr><td class="firstcol " ><p><strong>Material</strong></p></td><td  ><p>EPU synthetic leather, high-density cold-cured foam, steel tube frame, 5-star powder-coated aluminum alloy base</p></td></tr><tr><td class="firstcol " ><p><strong>Adjustment points</strong></p></td><td  ><p>8</p></td></tr><tr><td class="firstcol " ><p><strong>Warranty</strong></p></td><td  ><p>3 years</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-razer-iskur-v2-newgen-the-ups"><span>Razer Iskur V2 NewGen: The ups</span></h3><p>The Razer Iskur V2 NewGen offers exactly what you’d expect from a premium gaming chair in terms of design and comfort. However, it doesn’t skimp on ergonomics either with an adjustable lumbar support system that moves with your back as you shift in your chair while gaming or even working from home.</p><h2 id="a-color-coded-build">A color-coded build</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XcyUnSDyaeSYryqKWNi7dX" name="Razer Iskur V2 NewGen-10" alt="The Razer Iskur V2 NewGen unboxed with all of the parts laid out on the floor" src="https://cdn.mos.cms.futurecdn.net/XcyUnSDyaeSYryqKWNi7dX.jpg" mos="" align="middle" fullscreen="" width="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 Razer Iskur V2 NewGen arrived in a single large brown box with everything packed neatly inside. While I wish it came as pre-assembled as the more expensive <a href="https://www.tomsguide.com/home/home-office/herman-miller-x-logitech-g-vantum-gaming-chair-review">Herman Miller Vantum</a>, it was surprisingly simple to put together.</p><p>With everything unpacked, I was left with the Iskur V2 NewGen’s backrest, frame, seat, casters and the rest of the parts needed to assemble it. <strong>One thing I really liked is that the armrests did come pre-attached, which is a nice touch given how tedious installing them yourself can be.</strong></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vBV4uQv5dRAnVRdRXc3pba" name="Razer Iskur V2 NewGen-11" alt="A person holding the Razer Iskur V2 NewGen's printed assembly instructions in hand" src="https://cdn.mos.cms.futurecdn.net/vBV4uQv5dRAnVRdRXc3pba.jpg" mos="" align="middle" fullscreen="" width="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 other companies will often have you scan a QR code to view their assembly instructions online, Razer includes a large printout with key steps highlighted in the company’s signature Razer green. Speaking of which, you also get a pair of black gloves with that same accent color in the box so you don’t get any grease on your hands when installing the chair’s lift mechanism.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="oUhDaiPSfKjyUzj3mCoJRd" name="Razer Iskur V2 NewGen-12" alt="A person building the Razer Iskur V2 NewGen gaming chair" src="https://cdn.mos.cms.futurecdn.net/oUhDaiPSfKjyUzj3mCoJRd.jpg" mos="" align="middle" fullscreen="" width="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>Building the Iskur V2 NewGen was a straightforward process using the included Allen wrench. I’d say the hardest part was connecting the seat to the backrest but honestly, this was quite easy to do compared to some of the office chairs I’ve built over the years.</p><p>With the Iskur V2 NewGen fully assembled, it was time to take it for a spin.</p><h2 id="wider-all-around">Wider all around</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ViFvDSrzqoY8MNpLRwiApg" name="Razer Iskur V2 NewGen-9" alt="The Razer Iskur V2 NewGen gaming chair fully assembled" src="https://cdn.mos.cms.futurecdn.net/ViFvDSrzqoY8MNpLRwiApg.jpg" mos="" align="middle" fullscreen="" width="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 looking at the Iskur V2 NewGen, it’s hard not to notice its curves. In fact, this gaming chair almost has an hourglass figure since it’s skinniest at the center where the seat meets the backrest and extends out in either direction.</p><p>This was intentional on Razer’s part as a big focus of this NewGen refresh is comfort. The chair is just under 16 inches at its skinniest point. However, the seat extends out to 20.9 inches at its edge while the backrest goes even wider at 21.3 inches. <strong>The extended seat allows you to sit cross-legged in this gaming chair while the extended backrest provides plenty of room for those with wider shoulders.</strong></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="pKjsse3jowu8F4npKRHKoj" name="Razer Iskur V2 NewGen-5" alt="The seat pan and armrests of the Razer Iskur V2 NewGen gaming chair" src="https://cdn.mos.cms.futurecdn.net/pKjsse3jowu8F4npKRHKoj.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As someone on the smaller side at 5’4”, I still found this extra space to be quite nice to have. I had plenty of room as I shifted from side to side in the Iskur V2 NewGen’s seat and the same was true for my shoulders when my back leaned from left to right.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="fseRQsN6r23nq2hHefv9w3" name="Razer Iskur V2 NewGen-6" alt="A close-up shot of the included memory foam head cushion that comes with the Razer Iskur V2 NewGen gaming chair" src="https://cdn.mos.cms.futurecdn.net/fseRQsN6r23nq2hHefv9w3.jpg" mos="" align="middle" fullscreen="" width="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 I would have preferred a magnetic head cushion like on the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/secretlab-titan-evo-2022-review">Secretlab Titan Evo</a>, I did find the included one made from sculpted memory foam to be quite comfortable even for long stretches. However, I did swap it for the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-ditched-my-headset-for-this-wireless-speaker-head-cushion-and-now-i-have-surround-sound-right-from-my-gaming-chair">Razer Clio</a> when playing PS5 at my desk since I had a pair of <a href="https://www.tomsguide.com/reviews/razer-nommo-v2-pro">Razer Nommo V2 Pro</a> speakers connected to my gaming PC via USB-C and to my Switch 2 over Bluetooth.</p><h2 id="just-the-pull-of-a-lever">Just the pull of a lever</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vPGm7wiDLePgH6xtodv43J" name="Razer Iskur V2 NewGen-3" alt="A close-up shot of a person pulling the handbrake-style lever used for reclining in the Razer Iskur V2 NewGen gaming chair" src="https://cdn.mos.cms.futurecdn.net/vPGm7wiDLePgH6xtodv43J.jpg" mos="" align="middle" fullscreen="" width="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 thing I really prefer with the Iskur V2 NewGen over some of the more over-designed office chairs I regularly test is the simplicity of its adjustments. Fine-tuning this chair for the perfect fit only takes a few minutes and the more complicated adjustments come with illustrations to further simplify the process.</p><p>There are adjustment knobs on the left and right side — but more on that later — and a lever that controls the chair’s recline. Everything is right there within reach and I never had to get out of the Iskur V2 NewGen to make adjustments.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="x3Nc8C2NBqsgSR3GZR5wz8" name="Razer Iskur V2 NewGen-7" alt="The backrest adjustment knob and height adjustment lever on the left side of the Razer Iskur V2 NewGen gaming chair" src="https://cdn.mos.cms.futurecdn.net/x3Nc8C2NBqsgSR3GZR5wz8.jpg" mos="" align="middle" fullscreen="" width="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 chair also comes with 4D armrests that you can move up or down, forward or backward, closer or farther away from you and angled inward or outward. Unlike some of the 4D or even 6D armrests I’ve tested on office chairs, I really like how the ones on the Iskur V2 NewGen stay firmly in place. One of my biggest gripes with Herman Miller’s Vantum gaming chair is that I’d need to readjust the pads of its armrests almost every time I sat down.</p><p>Given that a lot of office chairs require you to unlock a lever and then lean back whenever you want to recline, the larger, handbrake-style lever on the right side of the Iskur V2 NewGen was a welcome change for me. <strong>I’d just hold onto the lever and lean back to my preferred recline position with it in my hand.</strong></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JpXuoNXpyuCmoiSGCbMfkN" name="Razer Iskur V2 NewGen-2" alt="A person fully reclined in the Razer Iskur V2 NewGen gaming chair playing games remotely on a tablet using the Razer Kishi Ultra mobile game controller" src="https://cdn.mos.cms.futurecdn.net/JpXuoNXpyuCmoiSGCbMfkN.jpg" mos="" align="middle" fullscreen="" width="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 I spent a lot of my time gaming upright while trying out the Iskur V2 NewGen, I did put its recline to the test while using the <a href="https://www.tomsguide.com/gaming/i-built-the-ultimate-remote-play-setup-with-wi-fi-7-to-say-goodbye-to-stuttery-gameplay-for-good-heres-how">Razer Kishi Ultra</a> and my <a href="https://www.tomsguide.com/computing/tablets/i-thought-the-ipad-mini-was-the-perfect-small-tablet-until-i-tried-the-lenovo-legion-tab-3-heres-why">Lenovo Legion Tab 3</a> for some remote gaming. </p><p>While an integrated footrest like on the <a href="https://www.tomsguide.com/home/home-office/hbada-x7-review">Hbada X7</a> or even a standalone one like with the <a href="https://www.tomsguide.com/home/home-office/libernovo-omni-review">LiberNovo Omni</a> would have been nice, it was still quite comfortable playing some PC games using the Steam Link app while laying almost completely flat in the Iskur V2 NewGen.</p><h2 id="lumbar-that-moves-with-you">Lumbar that moves with 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RRWno8k9jftM45SbQCQvPS" name="BoxPlates-6" alt="A person playing AstroBot on a PS5 Pro outfitted with BoxPlates console covers" src="https://cdn.mos.cms.futurecdn.net/RRWno8k9jftM45SbQCQvPS.jpg" mos="" align="middle" fullscreen="" width="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 Iskur V2, the adaptive lumbar support is one of the standout features of this gaming chair. After using it as my daily driver for the past two months, it’s easy to see why.</p><div><blockquote><p>Unlike a traditional lumbar support mechanism, this one is able to move with you as you shift from side to side in the Iskur V2 NewGen. </p></blockquote></div><p>Unlike a traditional lumbar support mechanism, this one is able to move with you as you shift from side to side in the Iskur V2 NewGen. For instance, you can feel it move if you look over to either side from your desk. However, I found it to be even more useful in fast-paced games where I tend to move around a bit more than I normally would while working.</p><p>While the lumbar support systems in some of the office chairs I reviewed are completely static — meaning they don't pivot or track your spine dynamically as you shift — Razer's system lets you fine-tune its position both vertically and horizontally.</p><p>A knob on the left side of the Iskur V2 NewGen allows you to move the lumbar support up and down so it can perfectly align with the small of your back. The knob on the right side is what really impressed me with the original Iskur V2 and this refreshed model.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="fgyAYfGmhERoErHha5c8B8" name="Razer Iskur V2-1.jpg" alt="Dr. Hwu adjusting the knobs on the Razer Iskur V2" src="https://cdn.mos.cms.futurecdn.net/fgyAYfGmhERoErHha5c8B8.jpg" mos="" align="middle" fullscreen="" width="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 turn this knob, the lumbar support mechanism either extends or retracts. As 1HP’s Dr. Matthew Hwu explained to me a few years ago at Razer’s CES booth, if you tend to lean forward while playing the <a href="https://www.tomsguide.com/best-picks/best-PC-games">best PC games</a> at your desk, then you might want to extend the Iskur V2 NewGen’s lumbar support all the way forward. That way, you can sit in your preferred gaming position without hurting your 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="RZDhxRuHediv4jDwbB8mhT" name="Razer Iskur V2 NewGen-4" alt="A person slightly leaned back playing Death Stranding 2 on PC in the Razer Iskur V2 NewGen gaming chair" src="https://cdn.mos.cms.futurecdn.net/RZDhxRuHediv4jDwbB8mhT.jpg" mos="" align="middle" fullscreen="" width="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 for me, while I did play some <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 PC while seated in the Iskur V2 NewGen, I actually spent the majority of my time testing the chair out while playing <a href="https://www.tomsguide.com/gaming/nintendo/star-fox-review">Star Fox</a> on the Nintendo Switch 2 ahead of my review. During those epic interstellar dog fights with Star Wolf, I put the chair’s adaptive lumbar support to good use as I dodged incoming enemy laser fire.</p><h3 class="article-body__section" id="section-razer-iskur-v2-newgen-the-downs"><span>Razer Iskur V2 NewGen: The downs</span></h3><p>The Razer Iskur V2 NewGen certainly performs as a gaming chair but it isn’t without its downsides which include its higher price and how the upgraded cooling tech in its EPU leather just can’t match mesh. </p><h2 id="cooler-but-still-not-cool-enough">Cooler but still not cool enough</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="2mW7enrj7aToUTGbqYp7pX" name="Razer Iskur V2 NewGen-8" alt="A close-up shot of the lever and adjustment knobs on the right side of the Razer Iskur V2 NewGen gaming chair" src="https://cdn.mos.cms.futurecdn.net/2mW7enrj7aToUTGbqYp7pX.jpg" mos="" align="middle" fullscreen="" width="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 I live in Houston, Texas, using a mesh office chair like the <a href="https://www.tomsguide.com/reviews/steelcase-karman">Steelcase Karman</a> or the more affordable <a href="https://www.tomsguide.com/home/home-office/branch-aire-chair-review">Branch Aire Chair</a> really isn’t an option — it’s a must. </p><p>Given we’re at the start of what’s already looking to be a very hot and humid summer, I was initially a bit reluctant about testing the Iskur V2 NewGen. However, since I tried and really liked the standard Iskur V2, I figured I’d see how well this chair’s new cooling tech performed in a less than ideal situation.</p><p>To make this refreshed chair cooler, Razer switched to a new version of its EPU synthetic leather which has CoolTouch fibers embedded within it. On paper, this sounds like it should really make a difference but in my testing, even this high-tech new material fell a bit short for me.</p><p>When I was using the Iskur V2 NewGen out in my game room with just a tower fan — alongside central air — to keep me cool, I found that I got sweaty faster than I normally would with a mesh office chair. It got so bad that I moved my <a href="https://www.tomsguide.com/home/smart-home/i-bought-a-smart-fan-to-beat-the-heat-and-i-never-thought-id-have-this-much-fun-controlling-a-fan-from-my-phone">Govee Smart Tower Fan 2 Max</a> from in front of our couch over to my desk at the back of the room. That made things slightly better.</p><p>In my final week or so testing the Iskur V2 NewGen, I brought it into my office which has a large overhead fan. Maybe it’s due to the room being much smaller but this certainly made a difference.</p><p>Now, if you’re using the Iskur V2 NewGen in a more temperate climate, I doubt you’ll run into the issues I did with it. However, if you’re in a warmer and muggier location like I am, I’d recommend the <a href="https://www.tomsguide.com/reviews/razer-fujin-pro">Razer Fujin Pro</a>, which is designed more like a mesh office chair than a traditional gaming chair.</p><h2 id="upgrading-at-a-premium">Upgrading at a premium</h2><p>At $649, the Iskur V2 NewGen is certainly an investment. However, if you have a bad back or want a chair with a wider seat and backrest, it could definitely be worth it. While you might look a tad silly in video calls, I found the Iskur V2 NewGen just as comfortable to work in as it was to game in.</p><p>If you’re after a premium gaming chair but want to pick one up at a slightly lower price, the Secretlab Titan Evo starts at $549 and unlike the Iskur V2 NewGen, it’s available in both fabric and leather. Then again, if you like the design of this chair and don’t necessarily need adaptive lumbar support or 4D armrests, you could always opt for the less expensive Razer Iskur V2 X NewGen for $349.</p><p>While the Iskur V2 NewGen is on the expensive side, it is cheaper than the Herman Miller Vantum which costs nearly $1,000. On the other hand though, the Vantum won’t look out of place in a video call for work as from the front, it looks just like any other mesh office chair.</p><h3 class="article-body__section" id="section-razer-iskur-v2-newgen-verdict"><span>Razer Iskur V2 NewGen: Verdict</span></h3><p>The Razer Iskur V2 NewGen is an excellent gaming chair with a one-of-a-kind adaptive lumbar support system that makes a major difference every time you sit in it. While its high-tech EPU synthetic leather left a bit to be desired for me personally, this new material is still a significant upgrade over past versions and under the right conditions, it can keep you cool while gaming for longer. Likewise, the Iskur V2 NewGen is incredibly easy to put together and to fine-tune its adjustments to your liking.</p><p>If you’re looking for a traditional, racing-style gaming chair but still want the ergonomic support you get from an office chair, you’d be hard-pressed to find this level of comfort and polish anywhere else. Still, you are paying a bit more for the privilege. However, if you game for long hours daily or plan to have the Iskur V2 NewGen serve double duty as your work-from-home chair, then it could certainly be worth it.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Razer's summer sale beats Prime Day for gaming gear — here are the 5 best deals ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Prime Day gets all the hype, but you don't need an Amazon membership to score the best gaming deals this week. Razer is hitting back with its own massive <a href="https://www.razer.com/">summer specials sale</a>, slashing up to 50% off top-tier gear, and frankly, the discounts are too good to ignore. </p><p>Whether you need a wireless headset that sounds as good with Spotify as it does in Valorant, or a tournament-ready compact keyboard, here are the five Razer upgrades worth your cash right now. </p><p>And if you want to make sure you aren't missing out on any other massive discounts, our Tom's Guide Savings Squad is tracking all the best deals across every major retailer in real time on our <a href="https://www.tomsguide.com/live/news/anti-prime-day-2026-best-buy-walmart">live blog</a>.</p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><strong>Razer Cobra Pro Wireless Gaming Mouse — </strong><a href="https://www.razer.com/gaming-mice/razer-cobra-pro" target="_blank" rel="nofollow"><strong>was $129 now $69</strong></a></li><li><strong>Razer Huntsman Mini - Linear Optical Switch</strong> <strong> — </strong><a href="https://www.razer.com/gaming-keyboards/razer-huntsman-mini/RZ03-03393400-R3U1" target="_blank" rel="nofollow"><strong>was $129 now $74</strong></a></li><li><strong>Razer Viper V3 Pro Wireless Gaming Mouse — </strong><a href="https://www.razer.com/gaming-mice/razer-viper-v3-pro/RZ01-05120100-R3U1" target="_blank" rel="nofollow"><strong>was $159 now $109</strong></a></li><li><strong>Razer BlackShark V2 Pro Wireless Gaming Headset — </strong><a href="https://www.razer.com/gaming-headsets/razer-blackshark-v2-pro" target="_blank" rel="nofollow"><strong>was $199 now $129</strong></a></li><li><strong>Razer Barracuda Pro Wireless Headset — </strong><a href="https://www.razer.com/gaming-headsets/razer-barracuda-pro/RZ04-03780100-R3M1" target="_blank" rel="nofollow"><strong>was $249 now $129</strong></a></li></ul><h3 class="article-body__section" id="section-best-razer-gaming-deals"><span>Best Razer gaming deals </span></h3><div class="product"><a data-dimension112="d88eb848-f610-42b7-99fa-0482fda3859a" data-action="Deal Block" data-label="Cobra Pro Wireless Gaming Mouse" data-dimension48="Cobra Pro Wireless Gaming Mouse" data-dimension25="$68" href="https://www.razer.com/gaming-mice/razer-cobra-pro" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1482px;"><p class="vanilla-image-block" style="padding-top:77.06%;"><img id="iubqd5iuodTs6wm8PqJc6D" name="Razer Cobra Pro Wireless Gaming Mouse" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/iubqd5iuodTs6wm8PqJc6D.png" mos="" align="middle" fullscreen="" width="1482" height="1142" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.razer.com/gaming-mice/razer-cobra-pro" target="_blank" rel="nofollow" data-dimension112="d88eb848-f610-42b7-99fa-0482fda3859a" data-action="Deal Block" data-label="Cobra Pro Wireless Gaming Mouse" data-dimension48="Cobra Pro Wireless Gaming Mouse" data-dimension25="$68">Cobra Pro Wireless Gaming Mouse: was $129 now $68</a></strong><br>A lightweight, compact wireless mouse that's built to perform. The Cobra Pro weighs just 77g and feels comfortable no matter how you hold it. It connects wirelessly with ultra-low latency so there's no noticeable lag during play; tracks accurately across pretty much any surface including glass; and the clicks are fast and reliable with a rated lifespan of 90 million. Eleven individually programmable RGB lighting zones and five onboard memory profiles round it out nicely. <a class="view-deal button" href="https://www.razer.com/gaming-mice/razer-cobra-pro" target="_blank" rel="nofollow" data-dimension112="d88eb848-f610-42b7-99fa-0482fda3859a" data-action="Deal Block" data-label="Cobra Pro Wireless Gaming Mouse" data-dimension48="Cobra Pro Wireless Gaming Mouse" data-dimension25="$68">View Deal</a></p></div><div class="product"><a data-dimension112="aa92d53e-4617-48a9-9252-aa0298e6e059" data-action="Deal Block" data-label="Huntsman Mini - Linear Optical Switch" data-dimension48="Huntsman Mini - Linear Optical Switch" data-dimension25="$74" href="https://www.razer.com/gaming-keyboards/razer-huntsman-mini/RZ03-03393400-R3U1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2210px;"><p class="vanilla-image-block" style="padding-top:72.13%;"><img id="dJ4tmE59F4AHvDxmHMxNeH" name="Razer Huntsman Mini - Linear Optical Switch" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/dJ4tmE59F4AHvDxmHMxNeH.png" mos="" align="middle" fullscreen="" width="2210" height="1594" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.razer.com/gaming-keyboards/razer-huntsman-mini/RZ03-03393400-R3U1" target="_blank" rel="nofollow" data-dimension112="aa92d53e-4617-48a9-9252-aa0298e6e059" data-action="Deal Block" data-label="Huntsman Mini - Linear Optical Switch" data-dimension48="Huntsman Mini - Linear Optical Switch" data-dimension25="$74">Huntsman Mini - Linear Optical Switch: was $129 now $74</a></strong><br>The Huntsman Mini is a compact keyboard that cuts out the numpad and navigation keys to save desk space without sacrificing performance. The switches are light and responsive with an instant actuation that makes typing and gaming feel snappy and precise. It's built from aluminium so it feels solid and premium, and the keycaps are high quality and designed to last. Everything is fully programmable and it connects via a detachable USB-C cable. A great option if you want a smaller, cleaner desk setup without compromising on quality.<a class="view-deal button" href="https://www.razer.com/gaming-keyboards/razer-huntsman-mini/RZ03-03393400-R3U1" target="_blank" rel="nofollow" data-dimension112="aa92d53e-4617-48a9-9252-aa0298e6e059" data-action="Deal Block" data-label="Huntsman Mini - Linear Optical Switch" data-dimension48="Huntsman Mini - Linear Optical Switch" data-dimension25="$74">View Deal</a></p></div><div class="product"><a data-dimension112="97b963c3-2657-47a1-ac40-953c3fd2b371" data-action="Deal Block" data-label="Viper V3 Pro Wireless Gaming Mouse" data-dimension48="Viper V3 Pro Wireless Gaming Mouse" data-dimension25="$109" href="https://www.razer.com/gaming-mice/razer-viper-v3-pro/RZ01-05120100-R3U1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:946px;"><p class="vanilla-image-block" style="padding-top:79.49%;"><img id="QgJbb5ymEaEVMrU9UaGP8" name="Razer Viper V3 Pro Wireless Gaming Mouse" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/QgJbb5ymEaEVMrU9UaGP8.png" mos="" align="middle" fullscreen="" width="946" height="752" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.razer.com/gaming-mice/razer-viper-v3-pro/RZ01-05120100-R3U1" target="_blank" rel="nofollow" data-dimension112="97b963c3-2657-47a1-ac40-953c3fd2b371" data-action="Deal Block" data-label="Viper V3 Pro Wireless Gaming Mouse" data-dimension48="Viper V3 Pro Wireless Gaming Mouse" data-dimension25="$109">Viper V3 Pro Wireless Gaming Mouse: was $159 now $109</a></strong><br>The Viper V3 Pro checks its position 8,000 times per second, which in practice means exceptionally precise, responsive tracking that serious gamers will notice immediately. It's not the most budget-friendly mouse on this list, but if accurate, responsive wireless performance is what you're after, it delivers.<a class="view-deal button" href="https://www.razer.com/gaming-mice/razer-viper-v3-pro/RZ01-05120100-R3U1" target="_blank" rel="nofollow" data-dimension112="97b963c3-2657-47a1-ac40-953c3fd2b371" data-action="Deal Block" data-label="Viper V3 Pro Wireless Gaming Mouse" data-dimension48="Viper V3 Pro Wireless Gaming Mouse" data-dimension25="$109">View Deal</a></p></div><div class="product"><a data-dimension112="a38acd1d-c599-476d-b449-33cb91d60a9e" data-action="Deal Block" data-label="BlackShark V2 Pro Wireless Gaming Headset" data-dimension48="BlackShark V2 Pro Wireless Gaming Headset" data-dimension25="$129" href="https://www.razer.com/gaming-headsets/razer-blackshark-v2-pro" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1090px;"><p class="vanilla-image-block" style="padding-top:94.31%;"><img id="mCGJ5Mwnez6DbWTFvFq7fN" name="BlackShark V2 Pro Wireless Gaming Headset" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/mCGJ5Mwnez6DbWTFvFq7fN.png" mos="" align="middle" fullscreen="" width="1090" height="1028" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.razer.com/gaming-headsets/razer-blackshark-v2-pro" target="_blank" rel="nofollow" data-dimension112="a38acd1d-c599-476d-b449-33cb91d60a9e" data-action="Deal Block" data-label="BlackShark V2 Pro Wireless Gaming Headset" data-dimension48="BlackShark V2 Pro Wireless Gaming Headset" data-dimension25="$129">BlackShark V2 Pro Wireless Gaming Headset: was $199 now $129</a></strong><br>Designed in collaboration with esports professionals, the BlackShark V2 Pro is built for competitive play without skimping on comfort. The drivers are split into three separately tuned sections for highs, mids, and lows — which just means the audio is detailed and clear rather than flat or muddy. The detachable mic picks up your voice naturally and accurately, and the memory foam ear cushions are soft and breathable enough for long sessions. Available across PC, Xbox, and PlayStation in black or white.<a class="view-deal button" href="https://www.razer.com/gaming-headsets/razer-blackshark-v2-pro" target="_blank" rel="nofollow" data-dimension112="a38acd1d-c599-476d-b449-33cb91d60a9e" data-action="Deal Block" data-label="BlackShark V2 Pro Wireless Gaming Headset" data-dimension48="BlackShark V2 Pro Wireless Gaming Headset" data-dimension25="$129">View Deal</a></p></div><div class="product"><a data-dimension112="8b9199b6-c4ce-4fad-9830-ff8c793ce8e5" data-action="Deal Block" data-label="Barracuda Pro Wireless Headset" data-dimension48="Barracuda Pro Wireless Headset" data-dimension25="$129" href="https://www.razer.com/gaming-headsets/razer-barracuda-pro/RZ04-03780100-R3M1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1376px;"><p class="vanilla-image-block" style="padding-top:78.20%;"><img id="7MaUkq8rYE2Q7hbVWTmwpi" name="Razer Barracuda Pro" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/7MaUkq8rYE2Q7hbVWTmwpi.png" mos="" align="middle" fullscreen="" width="1376" height="1076" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.razer.com/gaming-headsets/razer-barracuda-pro/RZ04-03780100-R3M1" target="_blank" rel="nofollow" data-dimension112="8b9199b6-c4ce-4fad-9830-ff8c793ce8e5" data-action="Deal Block" data-label="Barracuda Pro Wireless Headset" data-dimension48="Barracuda Pro Wireless Headset" data-dimension25="$129">Barracuda Pro Wireless Headset: was $249 now $129</a></strong><br>The Barracuda Pro is a wireless headset with adaptive noise-cancelling, a noise-cancelling mic, and configuration via the Razer Synapse app. At 48% off it's the biggest discount in this entire roundup, and at $129 it's worth considering if you're in the market for a versatile wireless headset.<a class="view-deal button" href="https://www.razer.com/gaming-headsets/razer-barracuda-pro/RZ04-03780100-R3M1" target="_blank" rel="nofollow" data-dimension112="8b9199b6-c4ce-4fad-9830-ff8c793ce8e5" data-action="Deal Block" data-label="Barracuda Pro Wireless Headset" data-dimension48="Barracuda Pro Wireless Headset" data-dimension25="$129">View Deal</a></p></div><h3 class="article-body__section" id="section-we-re-tracking-all-the-best-prime-day-deals"><span>We're tracking all the best Prime Day deals</span></h3><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Everything&min_discount_ratio=0.95&offer_type=all&view_mode=carousel&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=light_blue" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right {      right: 0;      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.previousElementSibling.scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>\n        \x3C/div>\n      \x3C/div>\n    \x3C/div>          \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                if(!r) return;                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          } else {             this.displayLimit += (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const encodedTag = encodeURIComponent(this.activeDealTag.toLowerCase().replace(/\s+/g, '-'));             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    if (this.rowsSelect && this.rowsSelect.value) {            url.searchParams.append('rows', this.rowsSelect.value);          } else {             url.searchParams.append('rows', '12'); // default          }          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = 12;          if (this.rowsSelect && this.rowsSelect.value) {            rowLimit = parseInt(this.rowsSelect.value, 10) || 12;          }          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map(v => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              return `                \x3Ca href="${this.escapeHTML(linkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item">                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let existingChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             if (this.getViewMode() === 'carousel') {                 if (!existingChevron) {                     gridWrapper.insertAdjacentHTML('beforeend', '\n                 \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.previousElementSibling.scrollBy({left: 200, behavior: \'smooth\'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>');                 }             } else {                 if (existingChevron) {                     existingChevron.remove();                 }             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12);                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/razers-summer-sale-beats-prime-day-for-gaming-gear-here-are-the-5-best-deals</link>
                                                                            <description>
                            <![CDATA[ Skip the Prime Day noise. Razer's summer sale has some of the best gaming deals running right now, here are my favorite five. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">v9LpQy7RTuvAGvrAuZZnrQ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/DAWasBF2ymLrtA7DMbUGrc-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 26 Jun 2026 07:06:17 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                <author><![CDATA[ kaycee.hill@futurenet.com (Kaycee Hill) ]]></author>                    <dc:creator><![CDATA[ Kaycee Hill ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xHn6RmpEqg87cvtLwrBu9G.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/DAWasBF2ymLrtA7DMbUGrc-1280-80.jpg">
                                                            <media:credit><![CDATA[Razer]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Razer headphones]]></media:description>                                                            <media:text><![CDATA[Razer headphones]]></media:text>
                                <media:title type="plain"><![CDATA[Razer headphones]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/DAWasBF2ymLrtA7DMbUGrc-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Prime Day gets all the hype, but you don't need an Amazon membership to score the best gaming deals this week. Razer is hitting back with its own massive <a href="https://www.razer.com/">summer specials sale</a>, slashing up to 50% off top-tier gear, and frankly, the discounts are too good to ignore. </p><p>Whether you need a wireless headset that sounds as good with Spotify as it does in Valorant, or a tournament-ready compact keyboard, here are the five Razer upgrades worth your cash right now. </p><p>And if you want to make sure you aren't missing out on any other massive discounts, our Tom's Guide Savings Squad is tracking all the best deals across every major retailer in real time on our <a href="https://www.tomsguide.com/live/news/anti-prime-day-2026-best-buy-walmart">live blog</a>.</p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><strong>Razer Cobra Pro Wireless Gaming Mouse — </strong><a href="https://www.razer.com/gaming-mice/razer-cobra-pro" target="_blank" rel="nofollow"><strong>was $129 now $69</strong></a></li><li><strong>Razer Huntsman Mini - Linear Optical Switch</strong> <strong> — </strong><a href="https://www.razer.com/gaming-keyboards/razer-huntsman-mini/RZ03-03393400-R3U1" target="_blank" rel="nofollow"><strong>was $129 now $74</strong></a></li><li><strong>Razer Viper V3 Pro Wireless Gaming Mouse — </strong><a href="https://www.razer.com/gaming-mice/razer-viper-v3-pro/RZ01-05120100-R3U1" target="_blank" rel="nofollow"><strong>was $159 now $109</strong></a></li><li><strong>Razer BlackShark V2 Pro Wireless Gaming Headset — </strong><a href="https://www.razer.com/gaming-headsets/razer-blackshark-v2-pro" target="_blank" rel="nofollow"><strong>was $199 now $129</strong></a></li><li><strong>Razer Barracuda Pro Wireless Headset — </strong><a href="https://www.razer.com/gaming-headsets/razer-barracuda-pro/RZ04-03780100-R3M1" target="_blank" rel="nofollow"><strong>was $249 now $129</strong></a></li></ul><h3 class="article-body__section" id="section-best-razer-gaming-deals"><span>Best Razer gaming deals </span></h3><div class="product"><a data-dimension112="d88eb848-f610-42b7-99fa-0482fda3859a" data-action="Deal Block" data-label="Cobra Pro Wireless Gaming Mouse" data-dimension48="Cobra Pro Wireless Gaming Mouse" data-dimension25="$68" href="https://www.razer.com/gaming-mice/razer-cobra-pro" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1482px;"><p class="vanilla-image-block" style="padding-top:77.06%;"><img id="iubqd5iuodTs6wm8PqJc6D" name="Razer Cobra Pro Wireless Gaming Mouse" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/iubqd5iuodTs6wm8PqJc6D.png" mos="" align="middle" fullscreen="" width="1482" height="1142" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.razer.com/gaming-mice/razer-cobra-pro" target="_blank" rel="nofollow" data-dimension112="d88eb848-f610-42b7-99fa-0482fda3859a" data-action="Deal Block" data-label="Cobra Pro Wireless Gaming Mouse" data-dimension48="Cobra Pro Wireless Gaming Mouse" data-dimension25="$68">Cobra Pro Wireless Gaming Mouse: was $129 now $68</a></strong><br>A lightweight, compact wireless mouse that's built to perform. The Cobra Pro weighs just 77g and feels comfortable no matter how you hold it. It connects wirelessly with ultra-low latency so there's no noticeable lag during play; tracks accurately across pretty much any surface including glass; and the clicks are fast and reliable with a rated lifespan of 90 million. Eleven individually programmable RGB lighting zones and five onboard memory profiles round it out nicely. <a class="view-deal button" href="https://www.razer.com/gaming-mice/razer-cobra-pro" target="_blank" rel="nofollow" data-dimension112="d88eb848-f610-42b7-99fa-0482fda3859a" data-action="Deal Block" data-label="Cobra Pro Wireless Gaming Mouse" data-dimension48="Cobra Pro Wireless Gaming Mouse" data-dimension25="$68">View Deal</a></p></div><div class="product"><a data-dimension112="aa92d53e-4617-48a9-9252-aa0298e6e059" data-action="Deal Block" data-label="Huntsman Mini - Linear Optical Switch" data-dimension48="Huntsman Mini - Linear Optical Switch" data-dimension25="$74" href="https://www.razer.com/gaming-keyboards/razer-huntsman-mini/RZ03-03393400-R3U1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2210px;"><p class="vanilla-image-block" style="padding-top:72.13%;"><img id="dJ4tmE59F4AHvDxmHMxNeH" name="Razer Huntsman Mini - Linear Optical Switch" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/dJ4tmE59F4AHvDxmHMxNeH.png" mos="" align="middle" fullscreen="" width="2210" height="1594" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.razer.com/gaming-keyboards/razer-huntsman-mini/RZ03-03393400-R3U1" target="_blank" rel="nofollow" data-dimension112="aa92d53e-4617-48a9-9252-aa0298e6e059" data-action="Deal Block" data-label="Huntsman Mini - Linear Optical Switch" data-dimension48="Huntsman Mini - Linear Optical Switch" data-dimension25="$74">Huntsman Mini - Linear Optical Switch: was $129 now $74</a></strong><br>The Huntsman Mini is a compact keyboard that cuts out the numpad and navigation keys to save desk space without sacrificing performance. The switches are light and responsive with an instant actuation that makes typing and gaming feel snappy and precise. It's built from aluminium so it feels solid and premium, and the keycaps are high quality and designed to last. Everything is fully programmable and it connects via a detachable USB-C cable. A great option if you want a smaller, cleaner desk setup without compromising on quality.<a class="view-deal button" href="https://www.razer.com/gaming-keyboards/razer-huntsman-mini/RZ03-03393400-R3U1" target="_blank" rel="nofollow" data-dimension112="aa92d53e-4617-48a9-9252-aa0298e6e059" data-action="Deal Block" data-label="Huntsman Mini - Linear Optical Switch" data-dimension48="Huntsman Mini - Linear Optical Switch" data-dimension25="$74">View Deal</a></p></div><div class="product"><a data-dimension112="97b963c3-2657-47a1-ac40-953c3fd2b371" data-action="Deal Block" data-label="Viper V3 Pro Wireless Gaming Mouse" data-dimension48="Viper V3 Pro Wireless Gaming Mouse" data-dimension25="$109" href="https://www.razer.com/gaming-mice/razer-viper-v3-pro/RZ01-05120100-R3U1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:946px;"><p class="vanilla-image-block" style="padding-top:79.49%;"><img id="QgJbb5ymEaEVMrU9UaGP8" name="Razer Viper V3 Pro Wireless Gaming Mouse" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/QgJbb5ymEaEVMrU9UaGP8.png" mos="" align="middle" fullscreen="" width="946" height="752" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.razer.com/gaming-mice/razer-viper-v3-pro/RZ01-05120100-R3U1" target="_blank" rel="nofollow" data-dimension112="97b963c3-2657-47a1-ac40-953c3fd2b371" data-action="Deal Block" data-label="Viper V3 Pro Wireless Gaming Mouse" data-dimension48="Viper V3 Pro Wireless Gaming Mouse" data-dimension25="$109">Viper V3 Pro Wireless Gaming Mouse: was $159 now $109</a></strong><br>The Viper V3 Pro checks its position 8,000 times per second, which in practice means exceptionally precise, responsive tracking that serious gamers will notice immediately. It's not the most budget-friendly mouse on this list, but if accurate, responsive wireless performance is what you're after, it delivers.<a class="view-deal button" href="https://www.razer.com/gaming-mice/razer-viper-v3-pro/RZ01-05120100-R3U1" target="_blank" rel="nofollow" data-dimension112="97b963c3-2657-47a1-ac40-953c3fd2b371" data-action="Deal Block" data-label="Viper V3 Pro Wireless Gaming Mouse" data-dimension48="Viper V3 Pro Wireless Gaming Mouse" data-dimension25="$109">View Deal</a></p></div><div class="product"><a data-dimension112="a38acd1d-c599-476d-b449-33cb91d60a9e" data-action="Deal Block" data-label="BlackShark V2 Pro Wireless Gaming Headset" data-dimension48="BlackShark V2 Pro Wireless Gaming Headset" data-dimension25="$129" href="https://www.razer.com/gaming-headsets/razer-blackshark-v2-pro" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1090px;"><p class="vanilla-image-block" style="padding-top:94.31%;"><img id="mCGJ5Mwnez6DbWTFvFq7fN" name="BlackShark V2 Pro Wireless Gaming Headset" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/mCGJ5Mwnez6DbWTFvFq7fN.png" mos="" align="middle" fullscreen="" width="1090" height="1028" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.razer.com/gaming-headsets/razer-blackshark-v2-pro" target="_blank" rel="nofollow" data-dimension112="a38acd1d-c599-476d-b449-33cb91d60a9e" data-action="Deal Block" data-label="BlackShark V2 Pro Wireless Gaming Headset" data-dimension48="BlackShark V2 Pro Wireless Gaming Headset" data-dimension25="$129">BlackShark V2 Pro Wireless Gaming Headset: was $199 now $129</a></strong><br>Designed in collaboration with esports professionals, the BlackShark V2 Pro is built for competitive play without skimping on comfort. The drivers are split into three separately tuned sections for highs, mids, and lows — which just means the audio is detailed and clear rather than flat or muddy. The detachable mic picks up your voice naturally and accurately, and the memory foam ear cushions are soft and breathable enough for long sessions. Available across PC, Xbox, and PlayStation in black or white.<a class="view-deal button" href="https://www.razer.com/gaming-headsets/razer-blackshark-v2-pro" target="_blank" rel="nofollow" data-dimension112="a38acd1d-c599-476d-b449-33cb91d60a9e" data-action="Deal Block" data-label="BlackShark V2 Pro Wireless Gaming Headset" data-dimension48="BlackShark V2 Pro Wireless Gaming Headset" data-dimension25="$129">View Deal</a></p></div><div class="product"><a data-dimension112="8b9199b6-c4ce-4fad-9830-ff8c793ce8e5" data-action="Deal Block" data-label="Barracuda Pro Wireless Headset" data-dimension48="Barracuda Pro Wireless Headset" data-dimension25="$129" href="https://www.razer.com/gaming-headsets/razer-barracuda-pro/RZ04-03780100-R3M1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1376px;"><p class="vanilla-image-block" style="padding-top:78.20%;"><img id="7MaUkq8rYE2Q7hbVWTmwpi" name="Razer Barracuda Pro" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/7MaUkq8rYE2Q7hbVWTmwpi.png" mos="" align="middle" fullscreen="" width="1376" height="1076" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.razer.com/gaming-headsets/razer-barracuda-pro/RZ04-03780100-R3M1" target="_blank" rel="nofollow" data-dimension112="8b9199b6-c4ce-4fad-9830-ff8c793ce8e5" data-action="Deal Block" data-label="Barracuda Pro Wireless Headset" data-dimension48="Barracuda Pro Wireless Headset" data-dimension25="$129">Barracuda Pro Wireless Headset: was $249 now $129</a></strong><br>The Barracuda Pro is a wireless headset with adaptive noise-cancelling, a noise-cancelling mic, and configuration via the Razer Synapse app. At 48% off it's the biggest discount in this entire roundup, and at $129 it's worth considering if you're in the market for a versatile wireless headset.<a class="view-deal button" href="https://www.razer.com/gaming-headsets/razer-barracuda-pro/RZ04-03780100-R3M1" target="_blank" rel="nofollow" data-dimension112="8b9199b6-c4ce-4fad-9830-ff8c793ce8e5" data-action="Deal Block" data-label="Barracuda Pro Wireless Headset" data-dimension48="Barracuda Pro Wireless Headset" data-dimension25="$129">View Deal</a></p></div><h3 class="article-body__section" id="section-we-re-tracking-all-the-best-prime-day-deals"><span>We're tracking all the best Prime Day deals</span></h3><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Everything&min_discount_ratio=0.95&offer_type=all&view_mode=carousel&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=light_blue" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right {      right: 0;      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.previousElementSibling.scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>\n        \x3C/div>\n      \x3C/div>\n    \x3C/div>          \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                if(!r) return;                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          } else {             this.displayLimit += (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const encodedTag = encodeURIComponent(this.activeDealTag.toLowerCase().replace(/\s+/g, '-'));             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    if (this.rowsSelect && this.rowsSelect.value) {            url.searchParams.append('rows', this.rowsSelect.value);          } else {             url.searchParams.append('rows', '12'); // default          }          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = 12;          if (this.rowsSelect && this.rowsSelect.value) {            rowLimit = parseInt(this.rowsSelect.value, 10) || 12;          }          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map(v => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              return `                \x3Ca href="${this.escapeHTML(linkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item">                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let existingChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             if (this.getViewMode() === 'carousel') {                 if (!existingChevron) {                     gridWrapper.insertAdjacentHTML('beforeend', '\n                 \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.previousElementSibling.scrollBy({left: 200, behavior: \'smooth\'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>');                 }             } else {                 if (existingChevron) {                     existingChevron.remove();                 }             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12);                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The game I always play to test gaming headsets is getting a sequel — here’s why Control is the best test for bass, treble and spatial audio ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I'm blessed and privileged to have a few loves in my life. There's my partner who I wouldn't change a thing about. My family and family dog who I'm thousands of miles away from and miss every day. And then there's gaming. I've loved gaming for as long as I can remember, and I'm one of the lucky few who get to incorporate their love for something into their job.</p><p>As a reviews writer, I test the <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">best gaming headsets</a>, which gives me an excuse to skip social obligations and stay home to play my favorite games. It's for work, am I right? Over the years, I've curated a selection of video games I always play to test gaming cans. New titles get added to that list as and when they come out (if I like them, of course) — but there's one game I never skip, and its sequel is finally dropping in September.</p><div class="product"><a data-dimension112="0948bca3-bf5f-4450-9a68-d5263e011e7b" data-action="Deal Block" data-label="Resonant (PS5)" data-dimension48="Resonant (PS5)" data-dimension25="$69" href="https://www.amazon.com/CONTROL-Resonant-Steelbook-PlayStation-5/dp/B0H3WTH82X/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1298px;"><p class="vanilla-image-block" style="padding-top:115.56%;"><img id="Pocqm9saJsFPesk4wdD6RW" name="Control-2-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Pocqm9saJsFPesk4wdD6RW.jpg" mos="" align="middle" fullscreen="" width="1298" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/CONTROL-Resonant-Steelbook-PlayStation-5/dp/B0H3WTH82X/" target="_blank" rel="nofollow" data-dimension112="0948bca3-bf5f-4450-9a68-d5263e011e7b" data-action="Deal Block" data-label="Resonant (PS5)" data-dimension48="Resonant (PS5)" data-dimension25="$69">Resonant (PS5): $69</a></strong><br>Control Resonant drops on September 24 and this time around, players will control Dylan, Jesse's brother, who navigates the warped, supernatural-themed streets of Manhattan, New York. The game will introduce new combat and traversal mechanics, and it's the 2026 title I'm most excited for.<a class="view-deal button" href="https://www.amazon.com/CONTROL-Resonant-Steelbook-PlayStation-5/dp/B0H3WTH82X/" target="_blank" rel="nofollow" data-dimension112="0948bca3-bf5f-4450-9a68-d5263e011e7b" data-action="Deal Block" data-label="Resonant (PS5)" data-dimension48="Resonant (PS5)" data-dimension25="$69">View Deal</a></p></div><p>Control Resonant, the sequel to the 2019 supernatural Control, drops on September 24, 2026. I've recently been playing a lot of Control, especially when testing gaming headsets, and it's the best test for bass, treble, directional audio, and spatial audio. It's also a game you shouldn't sleep on, and if you want to experience its stunning soundscapes it in all their glory, you need to grab a competent headset for yourself.</p><h2 id="an-unsettling-intense-eerie-incredible-soundtrack">An unsettling, intense, eerie, incredible soundtrack</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="a3aFMnuJHcuAk97hnRJCBd" name="Control-LEDE.jpg" alt="control best games august 2019" src="https://cdn.mos.cms.futurecdn.net/a3aFMnuJHcuAk97hnRJCBd.jpg" mos="" align="middle" fullscreen="" width="1500" height="844" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: 505 Games)</span></figcaption></figure><p>As someone who has played many, many video games, I believe Control has one of the most underrated soundtracks and background music. The background music isn't loud or bass-heavy; it's more ambient, subtle and otherworldly which makes it unsettling and eerie. Combine that with the supernatural Hiss spawning out of nowhere and you've got a winning (and terrifying) combination.</p><p>Speaking of music, if you're familiar with any of Remedy Entertainment's games, you'll know that the developer loves including songs by Old Gods of Asgard, or Poets of the Fall as they're known in real life (one of my favorite bands, by the way), in its games. Control is no exception to that rule, and 'Take Control' is one of the best video game songs I've listened to.</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/k0QsHKH77MI" allowfullscreen></iframe></div></div><p>Ashtray Maze, the level the song soundtracks, is in itself one of the best video game missions I've ever played, and one of the reasons is 'Take Control.' That level, complete with the heavy rock/metal track, combat sounds, and the sounds of the warping landscape, make for a great stress test when I'm testing a headset's balance.</p><p>Control features excellent combat and battle sounds too, from Jesse Faden's parautilitarian abilities to the Hiss' distorted, high-pitched shrieks. </p><p>Jesse's Launch ability makes for a fantastic treble test, as grabbing objects with it makes a shrill suction-like sound that can easily overpower the rest of the soundstage. Throwing (or launching) those objects creates a loud, bass-first sound, and if they land with an <em>oomph </em>akin to a thud<em>, </em>the headset's done its job well.</p><p>All of these different elements — the chaotic combat, the otherworldly weapon effects, crumbling environmental sounds when objects are yanked of walls via telekinesis — come together to create a surreal yet highly satisfying soundscape. Because of how busy the soundscape can get, Control is a game I will never skip when testing gaming headsets (and I hope I'll feel the same way about Resonant, too).</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WVa5me"></div>                            </div>                            <script src="https://kwizly.com/embed/WVa5me.js" async></script><h2 id="the-mark-of-a-good-set-of-cans">The mark of a good set of cans</h2><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="skoP94KMiqvntbEaXfgeqY" name="Control_Screenshot_11.png" alt="A screenshot from Control" src="https://cdn.mos.cms.futurecdn.net/skoP94KMiqvntbEaXfgeqY.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: 505 Games)</span></figcaption></figure><p>So, how can Control and its various sounds help me determine whether a gaming headset is worth the money? There are a few things I look out for, depending on the features a set of cans offers. For instance, to test imaging and directionality, I see if I can accurately tell if an enemy is shooting from above, behind or to my left or right.</p><p>Can I also hear the Hiss spawning around me, and can I pinpoint the exact direction <em>where </em>they've just spawned? If the answer to those question is yes, then the headset's got fantastic directional audio — like my trusty <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-blackshark-v3-pro-review">Razer BlackShark V3 Pro</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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="KMTWhkjapeNEUzbH3WKd6X" name="Razer_Blackshark_pro 10.JPG" alt="A black Razer BlackShark V3 Pro wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/KMTWhkjapeNEUzbH3WKd6X.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>Control's superb for testing sound separation too. If a headset is competent, like the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/alienware-pro-wireless-gaming-headset-review">Alienware Pro Wireless</a>, I'll be able to hear Jesse's Service Weapon firing and bullets whizzing through the air, even as the music swells and the Hiss bombers fly at me. If it all sounds like a messy wall of noise, then the headset isn't worth it. As I mentioned earlier, the combat helps me determine whether the treble is crisp and vibrant and if the bass is powerful with low-end impact, too.</p><p>Then there's dialogue clarity. Although Control isn't a dialogue-heavy game, like <a href="https://www.tomsguide.com/gaming/nintendo/i-didnt-pre-order-the-nintendo-switch-2-but-it-would-be-an-instant-buy-if-they-ported-this-game">Baldur's Gate 3</a> or <a href="https://www.tomsguide.com/gaming/replaying-detroit-become-human-in-2026">Detroit: Become Human</a>, there's still plenty of human and supernatural spoken word to test a headset's mids and vocal clarity. The Hiss often whisper and speak in overlapping, surreal dialogue and a well-tuned headset, like the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/asus-rog-pelta-gaming-headset-review">Asus ROG Pelta</a>, should render the vocal layer crisp and intelligible while retaining its eeriness.</p><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="x49TPj7jjbrzfZ5qRWvh5a" name="Inzone_H6_ 11.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/x49TPj7jjbrzfZ5qRWvh5a.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>But it's not just the game's loudness that helps me test gaming headsets; it's also the quiet moments when I'm navigating the ever-shifting halls of the Oldest House. </p><p>The low droning of the fans in the Maintenance sector, the echoing chimes of nearby Control Points, Polaris' gentle, soothing and guiding hum — all of these add to the game's charm. Any headset worth its salt, like the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/sony-inzone-h6-air-review">Sony Inzone H6 Air</a>, will make the game sound extremely immersive, spacious, and airy.</p><p>Everything I've mentioned up until now explains why I always play Control to test gaming headsets. Before we dive into my recommendations for the best cans, is there any game <em>you </em>think I should be playing to test gaming headsets? Tell me in the comments below!</p><h2 id="the-best-gaming-headsets-for-control-and-other-horror-games">The best gaming headsets for Control (and other horror games)</h2><div class="product"><a data-dimension112="8c4e44a9-470a-426c-856d-7fe22ded911e" data-action="Deal Block" data-label="Wireless Gaming Headset" data-dimension48="Wireless Gaming Headset" data-dimension25="$199" href="https://www.amazon.com/Alienware-Pro-Wireless-Gaming-Headset/dp/B0DHWFYX62/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1245px;"><p class="vanilla-image-block" style="padding-top:120.48%;"><img id="d6rYExHTcikkHXCyedszST" name="Alienware-Pro-Wireless-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/d6rYExHTcikkHXCyedszST.jpg" mos="" align="middle" fullscreen="" width="1245" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>5-star ratings at Tom's Guide are rare, so when a headset gets one, you can rest assured that it is <em>really </em>very good — and the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/alienware-pro-wireless-gaming-headset-review" data-dimension112="8c4e44a9-470a-426c-856d-7fe22ded911e" data-action="Deal Block" data-label="Wireless Gaming Headset" data-dimension48="Wireless Gaming Headset" data-dimension25="$199">Alienware Pro Wireless Gaming Headset</a> is fantastic, especially for PS5 owners. Its 50mm drivers accurately reproduce in-game sounds, offering an immersive gaming experience, while the highly effective ANC isolates and pulls you right into the action. With long, reliable battery life and multi-platform compatibility, this set of cans is worth paying a premium for.<a class="view-deal button" href="https://www.amazon.com/Alienware-Pro-Wireless-Gaming-Headset/dp/B0DHWFYX62/" target="_blank" rel="nofollow" data-dimension112="8c4e44a9-470a-426c-856d-7fe22ded911e" data-action="Deal Block" data-label="Wireless Gaming Headset" data-dimension48="Wireless Gaming Headset" data-dimension25="$199">View Deal</a></p></div><div class="product"><a data-dimension112="c1dfd38c-ed0e-434a-bea8-55b1410aa920" data-action="Deal Block" data-label="BlackShark V3 Pro" data-dimension48="BlackShark V3 Pro" data-dimension25="$249" href="https://www.amazon.com/Razer-BlackShark-Wireless-Gaming-Headset-Xbox/dp/B0F3QKLDLM/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="iFdB8fgzyU6X4P2WfMj9QN" name="Razer-BlackShark-V3-Pro-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/iFdB8fgzyU6X4P2WfMj9QN.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>When I tested the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-blackshark-v3-pro-review" data-dimension112="c1dfd38c-ed0e-434a-bea8-55b1410aa920" data-action="Deal Block" data-label="BlackShark V3 Pro" data-dimension48="BlackShark V3 Pro" data-dimension25="$249">Razer BlackShark V3 Pro</a>, I felt it upstaged every other headset. Designed for professional gamers (or those who want best-in-class sound), it boasts fantastic sound with spatial audio support that gives you a competitive edge. It’s extremely comfortable, features highly effective ANC, and comes with a detachable mic that makes you sound loud and clear. No compromises have been made, and you’re getting your money’s worth.<a class="view-deal button" href="https://www.amazon.com/Razer-BlackShark-Wireless-Gaming-Headset-Xbox/dp/B0F3QKLDLM/" target="_blank" rel="nofollow" data-dimension112="c1dfd38c-ed0e-434a-bea8-55b1410aa920" data-action="Deal Block" data-label="BlackShark V3 Pro" data-dimension48="BlackShark V3 Pro" data-dimension25="$249">View Deal</a></p></div><div class="product"><a data-dimension112="de7e53cf-6d82-4a52-94f5-937e41bdf40f" data-action="Deal Block" data-label="Inzone H6 Air" data-dimension48="Inzone H6 Air" data-dimension25="$199" href="https://www.amazon.com/Sony-INZONE-Open-Back-Gaming-Headset/dp/B0GT6CX8MV/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1188px;"><p class="vanilla-image-block" style="padding-top:126.26%;"><img id="zpnC9Hg9M6JRpLQeVtGy44" name="Inzone-h6-air-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/zpnC9Hg9M6JRpLQeVtGy44.jpg" mos="" align="middle" fullscreen="" width="1188" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/gaming/gaming-peripherals/sony-inzone-h6-air-review" data-dimension112="de7e53cf-6d82-4a52-94f5-937e41bdf40f" data-action="Deal Block" data-label="Inzone H6 Air" data-dimension48="Inzone H6 Air" data-dimension25="$199">Sony Inzone H6 Air</a> makes a compelling case for using open-back headphones in gaming, and you might not want to go back to wireless cans after trying it. This headset is fitted with 40mm drivers also found in studio monitor headphones, and they deliver outstanding sound quality in games and while listening to music.<a class="view-deal button" href="https://www.amazon.com/Sony-INZONE-Open-Back-Gaming-Headset/dp/B0GT6CX8MV/" target="_blank" rel="nofollow" data-dimension112="de7e53cf-6d82-4a52-94f5-937e41bdf40f" data-action="Deal Block" data-label="Inzone H6 Air" data-dimension48="Inzone H6 Air" data-dimension25="$199">View Deal</a></p></div><div class="product"><a data-dimension112="cc66c657-64d1-462f-b8aa-b38ef8883af2" data-action="Deal Block" data-label="ROG Pelta" data-dimension48="ROG Pelta" data-dimension25="$119" href="https://www.amazon.com/ASUS-ROG-Lightweight-Titanium-Plated-Super-Wideband/dp/B0DNTLYK6Z/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:93.67%;"><img id="KYZetdPTEMLdhLZt8jQTvc" name="Asus ROG Pelta" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/KYZetdPTEMLdhLZt8jQTvc.jpg" mos="" align="middle" fullscreen="" width="1500" height="1405" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>With 50mm drivers and virtual surround sound, the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/asus-rog-pelta-gaming-headset-review" data-dimension112="cc66c657-64d1-462f-b8aa-b38ef8883af2" data-action="Deal Block" data-label="ROG Pelta" data-dimension48="ROG Pelta" data-dimension25="$119">Asus ROG Pelta</a> is a fantastic gaming headset for horror, RPGs and FPS titles. It’s extremely comfortable for long gaming sessions, and it’s compatible with many devices. Offering a lot of customization potential, you can tailor the sound according to your preferences, too.<a class="view-deal button" href="https://www.amazon.com/ASUS-ROG-Lightweight-Titanium-Plated-Super-Wideband/dp/B0DNTLYK6Z/" target="_blank" rel="nofollow" data-dimension112="cc66c657-64d1-462f-b8aa-b38ef8883af2" data-action="Deal Block" data-label="ROG Pelta" data-dimension48="ROG Pelta" data-dimension25="$119">View Deal</a></p></div><div class="product"><a data-dimension112="3aadb3d0-3833-4d2b-a1f0-ca8cd83ab3cd" data-action="Deal Block" data-label="Cloud Alpha 2" data-dimension48="Cloud Alpha 2" data-dimension25="$299" href="https://www.hp.com/us-en/shop/pdp/hyperx-cloud-alpha-2-wireless-gaming-headset" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1659px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="4MiLKG3fvQmCnWFEtgE2cg" name="HyperX-CA2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4MiLKG3fvQmCnWFEtgE2cg.png" mos="" align="middle" fullscreen="" width="1659" height="1659" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/gaming/gaming-peripherals/hyperx-cloud-alpha-2-review" data-dimension112="3aadb3d0-3833-4d2b-a1f0-ca8cd83ab3cd" data-action="Deal Block" data-label="Cloud Alpha 2" data-dimension48="Cloud Alpha 2" data-dimension25="$299">HyperX Cloud Alpha 2</a> is a premium gaming headset that costs a premium. It boasts audiophile-quality in-game sound thanks to dual 53mm drivers, and it’s fitted with a massive battery that lasts up to 250 hours, easily outclassing rivals from SteelSeries and Razer. The detachable mic works well as does the included RGB Base Station.<a class="view-deal button" href="https://www.hp.com/us-en/shop/pdp/hyperx-cloud-alpha-2-wireless-gaming-headset" target="_blank" rel="nofollow" data-dimension112="3aadb3d0-3833-4d2b-a1f0-ca8cd83ab3cd" data-action="Deal Block" data-label="Cloud Alpha 2" data-dimension48="Cloud Alpha 2" data-dimension25="$299">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/gaming/nearly-a-year-later-clair-obscur-expedition-33-still-has-the-best-game-soundtrack-of-all-time-and-hearing-it-live-confirmed-it-further-for-me">Nearly a year later, Clair Obscur Expedition 33 still has the best game soundtrack of all time — and hearing it live confirmed it further for me</a></li><li><a href="https://www.tomsguide.com/best-picks/the-best-ps5-games">The best PS5 games in 2026</a></li><li><a href="https://www.tomsguide.com/gaming/playstations-wireless-flexstrike-fight-stick-is-coming-these-are-the-9-best-and-cheapest-ps5-fighting-games-worth-getting">PlayStation’s Wireless FlexStrike Fight Stick is coming — these are the 9 best (and cheapest) PS5 fighting games worth getting</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/the-game-i-always-play-to-test-gaming-headsets-is-getting-a-sequel-heres-why-control-is-the-best-test-for-bass-treble-and-spatial-audio</link>
                                                                            <description>
                            <![CDATA[ I play a lot of games to test gaming headsets, from Expedition 33 to F1 25, but I never skip Control because of its eerie soundscape and great combat sounds. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">vgQmyDEuEAPGMu2beKnfKa</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/g5ohpbLVyyNVTT4QciCZWM-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 13 Jun 2026 10:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres.&lt;/p&gt;&lt;p&gt;A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/g5ohpbLVyyNVTT4QciCZWM-1280-80.jpg">
                                                            <media:credit><![CDATA[Nikita Achanta / Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A photo of a person holding a DualSense controller in front of a TV displaying the PS5 homescreen]]></media:description>                                                            <media:text><![CDATA[A photo of a person holding a DualSense controller in front of a TV displaying the PS5 homescreen]]></media:text>
                                <media:title type="plain"><![CDATA[A photo of a person holding a DualSense controller in front of a TV displaying the PS5 homescreen]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/g5ohpbLVyyNVTT4QciCZWM-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I'm blessed and privileged to have a few loves in my life. There's my partner who I wouldn't change a thing about. My family and family dog who I'm thousands of miles away from and miss every day. And then there's gaming. I've loved gaming for as long as I can remember, and I'm one of the lucky few who get to incorporate their love for something into their job.</p><p>As a reviews writer, I test the <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">best gaming headsets</a>, which gives me an excuse to skip social obligations and stay home to play my favorite games. It's for work, am I right? Over the years, I've curated a selection of video games I always play to test gaming cans. New titles get added to that list as and when they come out (if I like them, of course) — but there's one game I never skip, and its sequel is finally dropping in September.</p><div class="product"><a data-dimension112="0948bca3-bf5f-4450-9a68-d5263e011e7b" data-action="Deal Block" data-label="Resonant (PS5)" data-dimension48="Resonant (PS5)" data-dimension25="$69" href="https://www.amazon.com/CONTROL-Resonant-Steelbook-PlayStation-5/dp/B0H3WTH82X/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1298px;"><p class="vanilla-image-block" style="padding-top:115.56%;"><img id="Pocqm9saJsFPesk4wdD6RW" name="Control-2-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Pocqm9saJsFPesk4wdD6RW.jpg" mos="" align="middle" fullscreen="" width="1298" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/CONTROL-Resonant-Steelbook-PlayStation-5/dp/B0H3WTH82X/" target="_blank" rel="nofollow" data-dimension112="0948bca3-bf5f-4450-9a68-d5263e011e7b" data-action="Deal Block" data-label="Resonant (PS5)" data-dimension48="Resonant (PS5)" data-dimension25="$69">Resonant (PS5): $69</a></strong><br>Control Resonant drops on September 24 and this time around, players will control Dylan, Jesse's brother, who navigates the warped, supernatural-themed streets of Manhattan, New York. The game will introduce new combat and traversal mechanics, and it's the 2026 title I'm most excited for.<a class="view-deal button" href="https://www.amazon.com/CONTROL-Resonant-Steelbook-PlayStation-5/dp/B0H3WTH82X/" target="_blank" rel="nofollow" data-dimension112="0948bca3-bf5f-4450-9a68-d5263e011e7b" data-action="Deal Block" data-label="Resonant (PS5)" data-dimension48="Resonant (PS5)" data-dimension25="$69">View Deal</a></p></div><p>Control Resonant, the sequel to the 2019 supernatural Control, drops on September 24, 2026. I've recently been playing a lot of Control, especially when testing gaming headsets, and it's the best test for bass, treble, directional audio, and spatial audio. It's also a game you shouldn't sleep on, and if you want to experience its stunning soundscapes it in all their glory, you need to grab a competent headset for yourself.</p><h2 id="an-unsettling-intense-eerie-incredible-soundtrack">An unsettling, intense, eerie, incredible soundtrack</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="a3aFMnuJHcuAk97hnRJCBd" name="Control-LEDE.jpg" alt="control best games august 2019" src="https://cdn.mos.cms.futurecdn.net/a3aFMnuJHcuAk97hnRJCBd.jpg" mos="" align="middle" fullscreen="" width="1500" height="844" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: 505 Games)</span></figcaption></figure><p>As someone who has played many, many video games, I believe Control has one of the most underrated soundtracks and background music. The background music isn't loud or bass-heavy; it's more ambient, subtle and otherworldly which makes it unsettling and eerie. Combine that with the supernatural Hiss spawning out of nowhere and you've got a winning (and terrifying) combination.</p><p>Speaking of music, if you're familiar with any of Remedy Entertainment's games, you'll know that the developer loves including songs by Old Gods of Asgard, or Poets of the Fall as they're known in real life (one of my favorite bands, by the way), in its games. Control is no exception to that rule, and 'Take Control' is one of the best video game songs I've listened to.</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/k0QsHKH77MI" allowfullscreen></iframe></div></div><p>Ashtray Maze, the level the song soundtracks, is in itself one of the best video game missions I've ever played, and one of the reasons is 'Take Control.' That level, complete with the heavy rock/metal track, combat sounds, and the sounds of the warping landscape, make for a great stress test when I'm testing a headset's balance.</p><p>Control features excellent combat and battle sounds too, from Jesse Faden's parautilitarian abilities to the Hiss' distorted, high-pitched shrieks. </p><p>Jesse's Launch ability makes for a fantastic treble test, as grabbing objects with it makes a shrill suction-like sound that can easily overpower the rest of the soundstage. Throwing (or launching) those objects creates a loud, bass-first sound, and if they land with an <em>oomph </em>akin to a thud<em>, </em>the headset's done its job well.</p><p>All of these different elements — the chaotic combat, the otherworldly weapon effects, crumbling environmental sounds when objects are yanked of walls via telekinesis — come together to create a surreal yet highly satisfying soundscape. Because of how busy the soundscape can get, Control is a game I will never skip when testing gaming headsets (and I hope I'll feel the same way about Resonant, too).</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WVa5me"></div>                            </div>                            <script src="https://kwizly.com/embed/WVa5me.js" async></script><h2 id="the-mark-of-a-good-set-of-cans">The mark of a good set of cans</h2><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="skoP94KMiqvntbEaXfgeqY" name="Control_Screenshot_11.png" alt="A screenshot from Control" src="https://cdn.mos.cms.futurecdn.net/skoP94KMiqvntbEaXfgeqY.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: 505 Games)</span></figcaption></figure><p>So, how can Control and its various sounds help me determine whether a gaming headset is worth the money? There are a few things I look out for, depending on the features a set of cans offers. For instance, to test imaging and directionality, I see if I can accurately tell if an enemy is shooting from above, behind or to my left or right.</p><p>Can I also hear the Hiss spawning around me, and can I pinpoint the exact direction <em>where </em>they've just spawned? If the answer to those question is yes, then the headset's got fantastic directional audio — like my trusty <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-blackshark-v3-pro-review">Razer BlackShark V3 Pro</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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="KMTWhkjapeNEUzbH3WKd6X" name="Razer_Blackshark_pro 10.JPG" alt="A black Razer BlackShark V3 Pro wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/KMTWhkjapeNEUzbH3WKd6X.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>Control's superb for testing sound separation too. If a headset is competent, like the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/alienware-pro-wireless-gaming-headset-review">Alienware Pro Wireless</a>, I'll be able to hear Jesse's Service Weapon firing and bullets whizzing through the air, even as the music swells and the Hiss bombers fly at me. If it all sounds like a messy wall of noise, then the headset isn't worth it. As I mentioned earlier, the combat helps me determine whether the treble is crisp and vibrant and if the bass is powerful with low-end impact, too.</p><p>Then there's dialogue clarity. Although Control isn't a dialogue-heavy game, like <a href="https://www.tomsguide.com/gaming/nintendo/i-didnt-pre-order-the-nintendo-switch-2-but-it-would-be-an-instant-buy-if-they-ported-this-game">Baldur's Gate 3</a> or <a href="https://www.tomsguide.com/gaming/replaying-detroit-become-human-in-2026">Detroit: Become Human</a>, there's still plenty of human and supernatural spoken word to test a headset's mids and vocal clarity. The Hiss often whisper and speak in overlapping, surreal dialogue and a well-tuned headset, like the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/asus-rog-pelta-gaming-headset-review">Asus ROG Pelta</a>, should render the vocal layer crisp and intelligible while retaining its eeriness.</p><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="x49TPj7jjbrzfZ5qRWvh5a" name="Inzone_H6_ 11.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/x49TPj7jjbrzfZ5qRWvh5a.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>But it's not just the game's loudness that helps me test gaming headsets; it's also the quiet moments when I'm navigating the ever-shifting halls of the Oldest House. </p><p>The low droning of the fans in the Maintenance sector, the echoing chimes of nearby Control Points, Polaris' gentle, soothing and guiding hum — all of these add to the game's charm. Any headset worth its salt, like the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/sony-inzone-h6-air-review">Sony Inzone H6 Air</a>, will make the game sound extremely immersive, spacious, and airy.</p><p>Everything I've mentioned up until now explains why I always play Control to test gaming headsets. Before we dive into my recommendations for the best cans, is there any game <em>you </em>think I should be playing to test gaming headsets? Tell me in the comments below!</p><h2 id="the-best-gaming-headsets-for-control-and-other-horror-games">The best gaming headsets for Control (and other horror games)</h2><div class="product"><a data-dimension112="8c4e44a9-470a-426c-856d-7fe22ded911e" data-action="Deal Block" data-label="Wireless Gaming Headset" data-dimension48="Wireless Gaming Headset" data-dimension25="$199" href="https://www.amazon.com/Alienware-Pro-Wireless-Gaming-Headset/dp/B0DHWFYX62/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1245px;"><p class="vanilla-image-block" style="padding-top:120.48%;"><img id="d6rYExHTcikkHXCyedszST" name="Alienware-Pro-Wireless-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/d6rYExHTcikkHXCyedszST.jpg" mos="" align="middle" fullscreen="" width="1245" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>5-star ratings at Tom's Guide are rare, so when a headset gets one, you can rest assured that it is <em>really </em>very good — and the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/alienware-pro-wireless-gaming-headset-review" data-dimension112="8c4e44a9-470a-426c-856d-7fe22ded911e" data-action="Deal Block" data-label="Wireless Gaming Headset" data-dimension48="Wireless Gaming Headset" data-dimension25="$199">Alienware Pro Wireless Gaming Headset</a> is fantastic, especially for PS5 owners. Its 50mm drivers accurately reproduce in-game sounds, offering an immersive gaming experience, while the highly effective ANC isolates and pulls you right into the action. With long, reliable battery life and multi-platform compatibility, this set of cans is worth paying a premium for.<a class="view-deal button" href="https://www.amazon.com/Alienware-Pro-Wireless-Gaming-Headset/dp/B0DHWFYX62/" target="_blank" rel="nofollow" data-dimension112="8c4e44a9-470a-426c-856d-7fe22ded911e" data-action="Deal Block" data-label="Wireless Gaming Headset" data-dimension48="Wireless Gaming Headset" data-dimension25="$199">View Deal</a></p></div><div class="product"><a data-dimension112="c1dfd38c-ed0e-434a-bea8-55b1410aa920" data-action="Deal Block" data-label="BlackShark V3 Pro" data-dimension48="BlackShark V3 Pro" data-dimension25="$249" href="https://www.amazon.com/Razer-BlackShark-Wireless-Gaming-Headset-Xbox/dp/B0F3QKLDLM/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="iFdB8fgzyU6X4P2WfMj9QN" name="Razer-BlackShark-V3-Pro-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/iFdB8fgzyU6X4P2WfMj9QN.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>When I tested the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-blackshark-v3-pro-review" data-dimension112="c1dfd38c-ed0e-434a-bea8-55b1410aa920" data-action="Deal Block" data-label="BlackShark V3 Pro" data-dimension48="BlackShark V3 Pro" data-dimension25="$249">Razer BlackShark V3 Pro</a>, I felt it upstaged every other headset. Designed for professional gamers (or those who want best-in-class sound), it boasts fantastic sound with spatial audio support that gives you a competitive edge. It’s extremely comfortable, features highly effective ANC, and comes with a detachable mic that makes you sound loud and clear. No compromises have been made, and you’re getting your money’s worth.<a class="view-deal button" href="https://www.amazon.com/Razer-BlackShark-Wireless-Gaming-Headset-Xbox/dp/B0F3QKLDLM/" target="_blank" rel="nofollow" data-dimension112="c1dfd38c-ed0e-434a-bea8-55b1410aa920" data-action="Deal Block" data-label="BlackShark V3 Pro" data-dimension48="BlackShark V3 Pro" data-dimension25="$249">View Deal</a></p></div><div class="product"><a data-dimension112="de7e53cf-6d82-4a52-94f5-937e41bdf40f" data-action="Deal Block" data-label="Inzone H6 Air" data-dimension48="Inzone H6 Air" data-dimension25="$199" href="https://www.amazon.com/Sony-INZONE-Open-Back-Gaming-Headset/dp/B0GT6CX8MV/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1188px;"><p class="vanilla-image-block" style="padding-top:126.26%;"><img id="zpnC9Hg9M6JRpLQeVtGy44" name="Inzone-h6-air-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/zpnC9Hg9M6JRpLQeVtGy44.jpg" mos="" align="middle" fullscreen="" width="1188" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/gaming/gaming-peripherals/sony-inzone-h6-air-review" data-dimension112="de7e53cf-6d82-4a52-94f5-937e41bdf40f" data-action="Deal Block" data-label="Inzone H6 Air" data-dimension48="Inzone H6 Air" data-dimension25="$199">Sony Inzone H6 Air</a> makes a compelling case for using open-back headphones in gaming, and you might not want to go back to wireless cans after trying it. This headset is fitted with 40mm drivers also found in studio monitor headphones, and they deliver outstanding sound quality in games and while listening to music.<a class="view-deal button" href="https://www.amazon.com/Sony-INZONE-Open-Back-Gaming-Headset/dp/B0GT6CX8MV/" target="_blank" rel="nofollow" data-dimension112="de7e53cf-6d82-4a52-94f5-937e41bdf40f" data-action="Deal Block" data-label="Inzone H6 Air" data-dimension48="Inzone H6 Air" data-dimension25="$199">View Deal</a></p></div><div class="product"><a data-dimension112="cc66c657-64d1-462f-b8aa-b38ef8883af2" data-action="Deal Block" data-label="ROG Pelta" data-dimension48="ROG Pelta" data-dimension25="$119" href="https://www.amazon.com/ASUS-ROG-Lightweight-Titanium-Plated-Super-Wideband/dp/B0DNTLYK6Z/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:93.67%;"><img id="KYZetdPTEMLdhLZt8jQTvc" name="Asus ROG Pelta" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/KYZetdPTEMLdhLZt8jQTvc.jpg" mos="" align="middle" fullscreen="" width="1500" height="1405" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>With 50mm drivers and virtual surround sound, the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/asus-rog-pelta-gaming-headset-review" data-dimension112="cc66c657-64d1-462f-b8aa-b38ef8883af2" data-action="Deal Block" data-label="ROG Pelta" data-dimension48="ROG Pelta" data-dimension25="$119">Asus ROG Pelta</a> is a fantastic gaming headset for horror, RPGs and FPS titles. It’s extremely comfortable for long gaming sessions, and it’s compatible with many devices. Offering a lot of customization potential, you can tailor the sound according to your preferences, too.<a class="view-deal button" href="https://www.amazon.com/ASUS-ROG-Lightweight-Titanium-Plated-Super-Wideband/dp/B0DNTLYK6Z/" target="_blank" rel="nofollow" data-dimension112="cc66c657-64d1-462f-b8aa-b38ef8883af2" data-action="Deal Block" data-label="ROG Pelta" data-dimension48="ROG Pelta" data-dimension25="$119">View Deal</a></p></div><div class="product"><a data-dimension112="3aadb3d0-3833-4d2b-a1f0-ca8cd83ab3cd" data-action="Deal Block" data-label="Cloud Alpha 2" data-dimension48="Cloud Alpha 2" data-dimension25="$299" href="https://www.hp.com/us-en/shop/pdp/hyperx-cloud-alpha-2-wireless-gaming-headset" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1659px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="4MiLKG3fvQmCnWFEtgE2cg" name="HyperX-CA2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4MiLKG3fvQmCnWFEtgE2cg.png" mos="" align="middle" fullscreen="" width="1659" height="1659" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/gaming/gaming-peripherals/hyperx-cloud-alpha-2-review" data-dimension112="3aadb3d0-3833-4d2b-a1f0-ca8cd83ab3cd" data-action="Deal Block" data-label="Cloud Alpha 2" data-dimension48="Cloud Alpha 2" data-dimension25="$299">HyperX Cloud Alpha 2</a> is a premium gaming headset that costs a premium. It boasts audiophile-quality in-game sound thanks to dual 53mm drivers, and it’s fitted with a massive battery that lasts up to 250 hours, easily outclassing rivals from SteelSeries and Razer. The detachable mic works well as does the included RGB Base Station.<a class="view-deal button" href="https://www.hp.com/us-en/shop/pdp/hyperx-cloud-alpha-2-wireless-gaming-headset" target="_blank" rel="nofollow" data-dimension112="3aadb3d0-3833-4d2b-a1f0-ca8cd83ab3cd" data-action="Deal Block" data-label="Cloud Alpha 2" data-dimension48="Cloud Alpha 2" data-dimension25="$299">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/gaming/nearly-a-year-later-clair-obscur-expedition-33-still-has-the-best-game-soundtrack-of-all-time-and-hearing-it-live-confirmed-it-further-for-me">Nearly a year later, Clair Obscur Expedition 33 still has the best game soundtrack of all time — and hearing it live confirmed it further for me</a></li><li><a href="https://www.tomsguide.com/best-picks/the-best-ps5-games">The best PS5 games in 2026</a></li><li><a href="https://www.tomsguide.com/gaming/playstations-wireless-flexstrike-fight-stick-is-coming-these-are-the-9-best-and-cheapest-ps5-fighting-games-worth-getting">PlayStation’s Wireless FlexStrike Fight Stick is coming — these are the 9 best (and cheapest) PS5 fighting games worth getting</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Can a budget PS5 headset actually make games sound immersive? I ditched my $299 Razer for the $69 PowerA LucidSound LS500 to find out ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Gaming headsets have come leaps and bounds in recent years, and today, you don't need to spend more than $100 to get a decent set of cans for awesome immersion. But it isn't surprising that many people are reluctant to buy a cheap headset, because they believe — naturally — that the pricier the cans, the better the sound.</p><p>In some cases, that's true, but in many, it isn't. Of course, you shouldn't expect a $69 headset to carry the same features and pack the same tech as a $299 headset — but that doesn't mean the former is <em>all </em>bad and not worth your money. I should give those two headsets names now, to make this article easier to understand, right?</p><div class="product"><a data-dimension112="7e674a8d-2ccf-411c-8fdb-aa8728aa7b15" data-action="Deal Block" data-label="LucidSound LS500" data-dimension48="LucidSound LS500" data-dimension25="$69" href="https://www.amazon.com/LucidSound-LS500P-Wireless-Headset-PlayStation/dp/B0GQ5GF688/" 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="g7KAAVdMJSosQqMZNNpZkf" name="LS500-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/g7KAAVdMJSosQqMZNNpZkf.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The PowerA LucidSound LS500 is a fantastic headset for either the PS5 or the Xbox. For the low price of $69, you’re getting a set of cans that’s supremely comfortable, and one that boasts excellent sound quality for the most part (as the bass is a little lacking). Mic performance is decent too, and I’m a big fan of the clever control scheme.<a class="view-deal button" href="https://www.amazon.com/LucidSound-LS500P-Wireless-Headset-PlayStation/dp/B0GQ5GF688/" target="_blank" rel="nofollow" data-dimension112="7e674a8d-2ccf-411c-8fdb-aa8728aa7b15" data-action="Deal Block" data-label="LucidSound LS500" data-dimension48="LucidSound LS500" data-dimension25="$69">View Deal</a></p></div><p>The $69 <a href="https://www.tomsguide.com/gaming/gaming-peripherals/powera-lucidsound-ls500-review">PowerA LucidSound LS500</a> replaced my $299 <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-blackshark-v3-pro-review">Razer BlackShark V3 Pro</a> for a week to see if the wallet-friendly wonder could take on one of the <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">best gaming headsets</a> I've had the pleasure of testing. I've been pleasantly surprised by the LS500's sound quality and comfort, and I've also been not-so-surprised by some of its shortcomings — obviously, given the price. Allow me to take you through it all.</p><h2 id="comfort-and-design-10-10">Comfort and design? 10/10</h2><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="3BkwcHfsq4eWsgzKxJBhHC" name="PowerA_LS500P_Headset_012.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/3BkwcHfsq4eWsgzKxJBhHC.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 PowerA LucidSound LS500 is a mighty comfortable headset — despite feeling too plasticky in places, yes. Weighing just 9.34 ounces and utilizing a lightweight metal in its frame, the LS500 sits comfortable atop your head and its mesh headband helps relieve some pressure you'd otherwise feel. The earcups are spacious and they're made of... moisture-wicking cloth liner.</p><p>"What the heck is moisture-wicking cloth liner?" I hear you ask. Fret not, I've done my research. This material pulls sweat and moisture away from your skin and spreads it across the fabric’s outside so that it evaporates quickly. In practice, this means that your ears don't feel irritated or itchy from pooling sweat, so you can wear the LS500 for hours and hours without feeling uncomfortable.</p><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="vyHCiQPLBeji3a9eFA2xjB" name="PowerA_LS500P_Headset_005.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/vyHCiQPLBeji3a9eFA2xjB.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Alongside feeling ridiculously comfortable, the LS500's design hasn't given me much to complain about either — though it isn't officially licensed for PS5, so you don't get the swanky console logo. What I love most about the design is the clever controls. Two wheels located around the "LS" logo on each earcup can be rotated to adjust volume, playback, and other settings.</p><p>You're probably wondering why I'm so excited about something that doesn't even sound <em>that </em>enthralling, but it's because most cheap gaming headsets I've tested sport the same old tired control scheme. They don't do anything different, but PowerA has, and that's what has me jumping up and down. It's practical and it's clever — and it makes the headset fun to use and control.</p><h2 id="great-sound-for-the-most-part">Great sound... for the most part</h2><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="8TqhUBnUkGJRMicPysPf5C" name="PowerA_LS500P_Headset_010.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/8TqhUBnUkGJRMicPysPf5C.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>Now we get to the meat of this article: does the PowerA LucidSound LS500 sound any good? For the most part, yes, and if you're a casual gamer who just wants a comfy headset for FPS or racing titles, you'll be more than happy with it. The LS500's 50mm dynamic drivers cover a frequency response range of 20Hz to 20KHz (the entirety of the human hearing spectrum) so in theory, you should be able to hear soft footsteps as well as loud explosions.</p><p>And you can certainly hear one of those. In <a href="https://www.tomsguide.com/gaming/clair-obscur-expedition-33-review">Clair Obscur: Expedition 33</a>, I appreciated the neoclassical operatic and heavy rock soundtrack not overpowering the combat sounds and vice versa. I could still hear my sword slashing against enemies, and I clearly understood my party members when they yelled, “Parry it” or “Watch out, Verso.” Balanced soundstage? Check.</p><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="AJdxfNexqdfegHGNdFdLoB" name="PowerA_LS500P_Headset_008.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/AJdxfNexqdfegHGNdFdLoB.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><div  class="fancy-box"><div class="fancy_box-title">Hear me out...</div><div class="fancy_box_body"><p class="fancy-box__body-text">I, of course, have a lot more to say about the LS500's sound profile, but that's what the full review is there for! Check out my <a data-analytics-id="inline-link" href="https://www.tomsguide.com/gaming/gaming-peripherals/powera-lucidsound-ls500-review">PowerA LucidSound LS500 review</a> for the in-depth analysis.</p></div></div><p>In Control, the LS500's directional audio worked excellently as I could pinpoint the exact direction in which the enemies spawned. I loved being able to hear  the suction-like sound objects made when I grabbed them with Jesse’s Launch ability, even when surrounded by supernatural entities making weird sounds. Crisp treble? Check.</p><p>But powerful bass? Bass that you feel in your soul? That reverberates through your head? Yeah, that's not really there. To be fair, I wasn't expecting the bass to sound room-shaking simply because the LS500 is a budget headset, and it's something my Razer BlackShark V3 Pro delivers — but it's also <em>a lot </em>pricier. Through the LS500, bomb-like attacks in Expedition 33 didn't land with enough <em>oomph </em>and sounded tinny. It was a similar story with throwing objects at enemies in Control, too.</p><h2 id="it-s-great-for-the-price-really">It's great for the price, really</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3531px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="g5ohpbLVyyNVTT4QciCZWM" name="Gaming-headsets-op-ed" alt="A photo of a person holding a DualSense controller in front of a TV displaying the PS5 homescreen" src="https://cdn.mos.cms.futurecdn.net/g5ohpbLVyyNVTT4QciCZWM.jpg" mos="" align="middle" fullscreen="" width="3531" height="1986" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Nikita Achanta / Tom's Guide)</span></figcaption></figure><p>There's no denying it: the PowerA LucidSound LS500 is one of the <a href="https://www.tomsguide.com/best-picks/best-cheap-gaming-headsets">best cheap gaming headsets</a> you can buy today. It's available for <a href="https://www.amazon.com/LucidSound-LS500P-Wireless-Headset-PlayStation/dp/B0GQ5GF688/" target="_blank" rel="nofollow">$69 at Amazon U.S.</a>, with worldwide availability expected later this year. For just under $70, you're getting a comfortable headset that boasts immersive sound (for the most part), decent mic performance, and a clever control scheme.</p><p>While you miss out on the most powerful bass and a companion app, those are trade-offs I'd be willing to make given how cheap the LS500 is. I've tested budget cans from Asus and Turtle Beach, and the LS500 takes the fight to them — and it comes out victorious.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Wl3dde"></div>                            </div>                            <script src="https://kwizly.com/embed/Wl3dde.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/gaming/gaming-peripherals/powera-lucidsound-ls500-review">The $69 PowerA LucidSound LS500 is a fantastic PS5 headset — and it’s coming for Turtle Beach’s crown</a></li><li><a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-just-perfected-my-dream-gaming-headset-sorry-everyone-no-other-brand-comes-close">I gave the new Razer headset 5 stars — say hello to my dream gaming cans</a></li><li><a href="https://www.tomsguide.com/computing/keyboards/epomaker-glyph-review">‘The most absurd and wonderful keyboard I’ve ever typed on’: I tested the typewriter-style Epomaker Glyph and it’s earned a permanent spot on my desk</a></li></ul><div data-widget-type="review" data-model-name="PowerA LucidSound LS500"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/can-a-budget-ps5-headset-actually-make-games-sound-immersive-i-ditched-my-usd299-razer-for-the-usd69-powera-lucidsound-ls500-to-find-out</link>
                                                                            <description>
                            <![CDATA[ You don't have to spend loads to get immersive sound in video games, and the PowerA LucidSound LS500 proves it. Here's what I love and hate about it. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">YnCUXyEaqe2EAS4uXBrAVG</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/JeAKuMVeWjX9Mi4J8oDdPb-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 13 Jun 2026 05:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres.&lt;/p&gt;&lt;p&gt;A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/JeAKuMVeWjX9Mi4J8oDdPb-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[PowerA LucidSound LS500 headset and a person holding a PS5 DualSense controller]]></media:description>                                                            <media:text><![CDATA[PowerA LucidSound LS500 headset and a person holding a PS5 DualSense controller]]></media:text>
                                <media:title type="plain"><![CDATA[PowerA LucidSound LS500 headset and a person holding a PS5 DualSense controller]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/JeAKuMVeWjX9Mi4J8oDdPb-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Gaming headsets have come leaps and bounds in recent years, and today, you don't need to spend more than $100 to get a decent set of cans for awesome immersion. But it isn't surprising that many people are reluctant to buy a cheap headset, because they believe — naturally — that the pricier the cans, the better the sound.</p><p>In some cases, that's true, but in many, it isn't. Of course, you shouldn't expect a $69 headset to carry the same features and pack the same tech as a $299 headset — but that doesn't mean the former is <em>all </em>bad and not worth your money. I should give those two headsets names now, to make this article easier to understand, right?</p><div class="product"><a data-dimension112="7e674a8d-2ccf-411c-8fdb-aa8728aa7b15" data-action="Deal Block" data-label="LucidSound LS500" data-dimension48="LucidSound LS500" data-dimension25="$69" href="https://www.amazon.com/LucidSound-LS500P-Wireless-Headset-PlayStation/dp/B0GQ5GF688/" 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="g7KAAVdMJSosQqMZNNpZkf" name="LS500-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/g7KAAVdMJSosQqMZNNpZkf.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The PowerA LucidSound LS500 is a fantastic headset for either the PS5 or the Xbox. For the low price of $69, you’re getting a set of cans that’s supremely comfortable, and one that boasts excellent sound quality for the most part (as the bass is a little lacking). Mic performance is decent too, and I’m a big fan of the clever control scheme.<a class="view-deal button" href="https://www.amazon.com/LucidSound-LS500P-Wireless-Headset-PlayStation/dp/B0GQ5GF688/" target="_blank" rel="nofollow" data-dimension112="7e674a8d-2ccf-411c-8fdb-aa8728aa7b15" data-action="Deal Block" data-label="LucidSound LS500" data-dimension48="LucidSound LS500" data-dimension25="$69">View Deal</a></p></div><p>The $69 <a href="https://www.tomsguide.com/gaming/gaming-peripherals/powera-lucidsound-ls500-review">PowerA LucidSound LS500</a> replaced my $299 <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-blackshark-v3-pro-review">Razer BlackShark V3 Pro</a> for a week to see if the wallet-friendly wonder could take on one of the <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">best gaming headsets</a> I've had the pleasure of testing. I've been pleasantly surprised by the LS500's sound quality and comfort, and I've also been not-so-surprised by some of its shortcomings — obviously, given the price. Allow me to take you through it all.</p><h2 id="comfort-and-design-10-10">Comfort and design? 10/10</h2><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="3BkwcHfsq4eWsgzKxJBhHC" name="PowerA_LS500P_Headset_012.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/3BkwcHfsq4eWsgzKxJBhHC.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 PowerA LucidSound LS500 is a mighty comfortable headset — despite feeling too plasticky in places, yes. Weighing just 9.34 ounces and utilizing a lightweight metal in its frame, the LS500 sits comfortable atop your head and its mesh headband helps relieve some pressure you'd otherwise feel. The earcups are spacious and they're made of... moisture-wicking cloth liner.</p><p>"What the heck is moisture-wicking cloth liner?" I hear you ask. Fret not, I've done my research. This material pulls sweat and moisture away from your skin and spreads it across the fabric’s outside so that it evaporates quickly. In practice, this means that your ears don't feel irritated or itchy from pooling sweat, so you can wear the LS500 for hours and hours without feeling uncomfortable.</p><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="vyHCiQPLBeji3a9eFA2xjB" name="PowerA_LS500P_Headset_005.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/vyHCiQPLBeji3a9eFA2xjB.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Alongside feeling ridiculously comfortable, the LS500's design hasn't given me much to complain about either — though it isn't officially licensed for PS5, so you don't get the swanky console logo. What I love most about the design is the clever controls. Two wheels located around the "LS" logo on each earcup can be rotated to adjust volume, playback, and other settings.</p><p>You're probably wondering why I'm so excited about something that doesn't even sound <em>that </em>enthralling, but it's because most cheap gaming headsets I've tested sport the same old tired control scheme. They don't do anything different, but PowerA has, and that's what has me jumping up and down. It's practical and it's clever — and it makes the headset fun to use and control.</p><h2 id="great-sound-for-the-most-part">Great sound... for the most part</h2><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="8TqhUBnUkGJRMicPysPf5C" name="PowerA_LS500P_Headset_010.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/8TqhUBnUkGJRMicPysPf5C.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>Now we get to the meat of this article: does the PowerA LucidSound LS500 sound any good? For the most part, yes, and if you're a casual gamer who just wants a comfy headset for FPS or racing titles, you'll be more than happy with it. The LS500's 50mm dynamic drivers cover a frequency response range of 20Hz to 20KHz (the entirety of the human hearing spectrum) so in theory, you should be able to hear soft footsteps as well as loud explosions.</p><p>And you can certainly hear one of those. In <a href="https://www.tomsguide.com/gaming/clair-obscur-expedition-33-review">Clair Obscur: Expedition 33</a>, I appreciated the neoclassical operatic and heavy rock soundtrack not overpowering the combat sounds and vice versa. I could still hear my sword slashing against enemies, and I clearly understood my party members when they yelled, “Parry it” or “Watch out, Verso.” Balanced soundstage? Check.</p><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="AJdxfNexqdfegHGNdFdLoB" name="PowerA_LS500P_Headset_008.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/AJdxfNexqdfegHGNdFdLoB.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><div  class="fancy-box"><div class="fancy_box-title">Hear me out...</div><div class="fancy_box_body"><p class="fancy-box__body-text">I, of course, have a lot more to say about the LS500's sound profile, but that's what the full review is there for! Check out my <a data-analytics-id="inline-link" href="https://www.tomsguide.com/gaming/gaming-peripherals/powera-lucidsound-ls500-review">PowerA LucidSound LS500 review</a> for the in-depth analysis.</p></div></div><p>In Control, the LS500's directional audio worked excellently as I could pinpoint the exact direction in which the enemies spawned. I loved being able to hear  the suction-like sound objects made when I grabbed them with Jesse’s Launch ability, even when surrounded by supernatural entities making weird sounds. Crisp treble? Check.</p><p>But powerful bass? Bass that you feel in your soul? That reverberates through your head? Yeah, that's not really there. To be fair, I wasn't expecting the bass to sound room-shaking simply because the LS500 is a budget headset, and it's something my Razer BlackShark V3 Pro delivers — but it's also <em>a lot </em>pricier. Through the LS500, bomb-like attacks in Expedition 33 didn't land with enough <em>oomph </em>and sounded tinny. It was a similar story with throwing objects at enemies in Control, too.</p><h2 id="it-s-great-for-the-price-really">It's great for the price, really</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3531px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="g5ohpbLVyyNVTT4QciCZWM" name="Gaming-headsets-op-ed" alt="A photo of a person holding a DualSense controller in front of a TV displaying the PS5 homescreen" src="https://cdn.mos.cms.futurecdn.net/g5ohpbLVyyNVTT4QciCZWM.jpg" mos="" align="middle" fullscreen="" width="3531" height="1986" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Nikita Achanta / Tom's Guide)</span></figcaption></figure><p>There's no denying it: the PowerA LucidSound LS500 is one of the <a href="https://www.tomsguide.com/best-picks/best-cheap-gaming-headsets">best cheap gaming headsets</a> you can buy today. It's available for <a href="https://www.amazon.com/LucidSound-LS500P-Wireless-Headset-PlayStation/dp/B0GQ5GF688/" target="_blank" rel="nofollow">$69 at Amazon U.S.</a>, with worldwide availability expected later this year. For just under $70, you're getting a comfortable headset that boasts immersive sound (for the most part), decent mic performance, and a clever control scheme.</p><p>While you miss out on the most powerful bass and a companion app, those are trade-offs I'd be willing to make given how cheap the LS500 is. I've tested budget cans from Asus and Turtle Beach, and the LS500 takes the fight to them — and it comes out victorious.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Wl3dde"></div>                            </div>                            <script src="https://kwizly.com/embed/Wl3dde.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/gaming/gaming-peripherals/powera-lucidsound-ls500-review">The $69 PowerA LucidSound LS500 is a fantastic PS5 headset — and it’s coming for Turtle Beach’s crown</a></li><li><a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-just-perfected-my-dream-gaming-headset-sorry-everyone-no-other-brand-comes-close">I gave the new Razer headset 5 stars — say hello to my dream gaming cans</a></li><li><a href="https://www.tomsguide.com/computing/keyboards/epomaker-glyph-review">‘The most absurd and wonderful keyboard I’ve ever typed on’: I tested the typewriter-style Epomaker Glyph and it’s earned a permanent spot on my desk</a></li></ul><div data-widget-type="review" data-model-name="PowerA LucidSound LS500"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The $69 PowerA LucidSound LS500 is a fantastic PS5 headset — and it’s coming for Turtle Beach’s crown ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Playing video games is one of my favorite hobbies, so you can imagine how much joy I get from testing the <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">best gaming headsets</a>. I’ve spent a week testing the budget-friendly PowerA LucidSound LS500 and I’m seriously impressed. Available for just $69, the LS500 boasts great in-game sound quality with directional audio, and the headset is designed to be worn all-day long.</p><p>In addition to this, you get decent mic performance as well as a clever and practical control scheme too. But the LS500 isn’t perfect. Its plasticky build and underwhelming bass leave a lot to be desired. There’s no companion app for customization either. But for the sub-$70 price, those are sacrifices you might be okay with.</p><p>Should you still get the headset? Read my full PowerA LucidSound LS500 review to find out.</p><h2 class="article-body__section" id="section-powera-lucidsound-ls500-review-specs"><span>PowerA LucidSound LS500 review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/LucidSound-LS500P-Wireless-Headset-PlayStation/dp/B0GQ5GF688/" target="_blank" rel="nofollow">$69</a></p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>White, Black</p></td></tr><tr><td class="firstcol " ><p><strong>Platforms</strong></p></td><td  ><p>PS5, PS4, Xbox Series X|S, Xbox One, PC</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Bluetooth 5.3, 2.4GHz</p></td></tr><tr><td class="firstcol " ><p><strong>Frequency response</strong></p></td><td  ><p>20Hz-20KHz</p></td></tr><tr><td class="firstcol " ><p><strong>Drivers</strong></p></td><td  ><p>50mm dynamic</p></td></tr><tr><td class="firstcol " ><p><strong>Multipoint connectivity</strong></p></td><td  ><p>No</p></td></tr><tr><td class="firstcol " ><p><strong>Paired devices max</strong></p></td><td  ><p>1</p></td></tr><tr><td class="firstcol " ><p><strong>Microphone</strong></p></td><td  ><p>Omnidirectional flip-to-mute</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>9.34oz</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-powera-lucidsound-ls500-review-cheat-sheet"><span>PowerA LucidSound LS500 review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>A budget wireless gaming headset for PS5, Xbox and PC</li><li><strong>Who is it for?</strong> Casual gamers on a budget</li><li><strong>How much does it cost?</strong> The PowerA LucidSound LS500 is available for <a href="https://www.amazon.com/LucidSound-LS500P-Wireless-Headset-PlayStation/dp/B0GQ5GF688/" target="_blank" rel="nofollow">$69</a></li><li><strong>What do we like?</strong> The all-day comfort, great in-game sound quality, budget-friendly price, and clever controls</li><li><strong>What don’t we like? </strong>The underwhelming bass, plasticky build, and lack of a companion app</li></ul><h2 class="article-body__section" id="section-powera-lucidsound-ls500-review-the-ups"><span>PowerA LucidSound LS500 review: The ups</span></h2><p>The PowerA LucidSound LS500 is a fantastic budget-friendly headset, boasting all-day comfort and (mostly) superb in-game sound quality.</p><h2 id="lightweight-and-comfortable-2">Lightweight and comfortable</h2><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="XoeA9yJxZUFgYXr7znQJmB" name="PowerA_LS500P_Headset_002.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/XoeA9yJxZUFgYXr7znQJmB.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>Regardless of how much a headset costs, you shouldn’t spend any amount of money on it if it isn’t comfortable. Thankfully, the PowerA LucidSound LS500 definitely is! </p><p>The headset is lightweight, weighing just 9.34 ounces. It’s lighter than the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/cherry-xtrfy-h3-gaming-headset-review">Cherry XTRFY H3</a> ($99, 11.46 ounces) and the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/asus-tuf-gaming-h1-gen-ii-headset-review">Asus TUF Gaming H1 Gen II</a> ($49, 10.47 ounces). The frame is made of lightweight metal, and the mesh headband sits comfortably on your head and helps relieve some pressure you’d otherwise feel.</p><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="9wGzh4LqwZi2vHnimtaE4C" name="PowerA_LS500P_Headset_009.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/9wGzh4LqwZi2vHnimtaE4C.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 LS500 features spacious earcups made of “moisture-wicking cloth liner.” This material pulls sweat and moisture away from your skin and spreads it across the fabric’s outside so that it evaporates quickly. This essentially means that your ears are protected against skin irritation from pooling sweat, and it results in a more comfortable fit. Marketing speak aside, I can confirm that my ears didn’t feel itchy or too hot, even after wearing the headset for seven straight hours.</p><h2 id="clever-straightforward-controls">Clever, straightforward controls</h2><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="JDgQmrLKNguXncyNV8HaMC" name="PowerA_LS500P_Headset_006.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/JDgQmrLKNguXncyNV8HaMC.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>One of my grievances with the also budget-friendly <a href="https://www.tomsguide.com/gaming/gaming-peripherals/turtle-beach-stealth-500-review-a-wallet-friendly-wonder">Turtle Beach Stealth 500</a> ($79) was that its controls felt too cluttered, pooled together on one earcup. Thankfully, that isn’t the case with the PowerA LucidSound LS500. The headset sports a clever and straightforward control scheme, with physical buttons and dials located on both earcups. The power button is located on the left earcup, and it doubles as the Bluetooth/2.4GHz button when it’s held down for a few seconds.</p><p>You’ll find two rotatable wheels on both earcups, located around the LucidSound branding. On the left earcup, rotating the wheel changes the volume while pressing the ‘LS’ button once mutes the audio, twice tells you the battery level, and thrice swaps between three equalizer presets. It’s very easy to switch between bass boost, FPS and signature sound.</p><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="AJdxfNexqdfegHGNdFdLoB" name="PowerA_LS500P_Headset_008.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/AJdxfNexqdfegHGNdFdLoB.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 wheel on the right earcup, on the other hand, lets you adjust the mic monitoring level (or sidetone) when the headset is in 2.4GHz mode, or change the track when you’re listening to music over Bluetooth. Pressing the ‘LS’ button on the right earcup plays or pauses playback in Bluetooth mode, too.</p><p>I really like the implementation of these rotating wheels. I haven’t seen any other headset do this, so it’s nice to see a brand try something different for a change.</p><h2 id="detailed-sound-for-the-price">Detailed sound 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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8TqhUBnUkGJRMicPysPf5C" name="PowerA_LS500P_Headset_010.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/8TqhUBnUkGJRMicPysPf5C.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 PowerA LucidSound LS500 boasts great sound quality, especially for a sub-$100 headset. It’s fitted with 50mm dynamic drivers which cover a frequency response range of 20Hz to 20KHz — so essentially the entirety of the human hearing spectrum. Regardless of the game I played to test the LS500, I felt immersed.</p><p>There are two ways to connect the headset to your <a href="https://www.tomsguide.com/reviews/ps5">PS5</a>, <a href="https://www.tomsguide.com/reviews/xbox-series-x">Xbox Series X|S</a> or PC: via the 2.4GHz dongle or Bluetooth 5.3. I plugged the USB-C dongle into the front of my <a href="https://www.tomsguide.com/gaming/playstation/ps5-slim">PS5 Slim</a> and I was good to go in mere seconds. I kicked things off by playing <a href="https://www.tomsguide.com/gaming/clair-obscur-expedition-33-review">Clair Obscur: Expedition 33</a>, and I was immediately impressed with the well-balanced sound in battles. The neoclassical operatic and heavy rock soundtrack didn’t overpower the combat sounds and vice versa.</p><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="3BkwcHfsq4eWsgzKxJBhHC" name="PowerA_LS500P_Headset_012.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/3BkwcHfsq4eWsgzKxJBhHC.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 treble sounded crisp and vibrant without piercing through the rest of the soundstage, so I was able to appreciate the beautiful backing tracks while still hearing my sword slashing against the enemies. I also liked being able to clearly understand my party members when they yelled, “Parry it” or “Watch out, Verso.” Their voices weren’t lost in the busy soundscape.</p><p>I then played <a href="https://www.tomsguide.com/reviews/control">Control</a> and instantly felt immersed in the horror landscape as I made my way down the halls of the brutalist Oldest House building. I could pinpoint the exact direction in which the enemies spawned, as the LS500’s directional audio works excellently. Even when heavily surrounded by supernatural entities making all kinds of weird sounds, I was still able to hear the suction-like sound objects made when I grabbed them with Jesse’s Launch ability, which added to the immersion.</p><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="WHNMowvazL3YDdf7bbGxhB" name="PowerA_LS500P_Headset_014.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/WHNMowvazL3YDdf7bbGxhB.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Alongside RPGs, the LS500 is fit for FPS titles too, or any game where listening for footsteps counts the most. I switched to the FPS EQ for <a href="https://www.tomsguide.com/gaming/007-first-light-review">007 First Light</a>, and this enhanced the sound of footsteps by boosting the mid-range. When I needed to infiltrate a heavily-guarded area stealthily, I could pinpoint the NPCs’ locations while hiding as their footsteps grew louder as they came closer to my hiding spot. This helped me execute timely takedowns without alerting the others.</p><h2 id="decent-mic-performance">Decent mic performance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NwqjRTwyMKsTuZwa4HK7xB" name="PowerA_LS500P_Headset_007.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/NwqjRTwyMKsTuZwa4HK7xB.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>Similar to the Turtle Beach Stealth 500, the PowerA LucidSound LS500 features a flip-to-mute mic. It’s omnidirectional which means it records audio from all directions. While that may sound counterintuitive, the LS500 has built-in noise filtering to reduce background noises — and it works well.</p><audio src="https://cdn.mos.cms.futurecdn.net/Ru8cky8nTefMdEuNxECvx7/LS500%20clip.mp3"  controls="controls" preload="none"></audio><p><br>I recorded myself speaking while sitting in our office’s kitchen area, and my colleagues were speaking with one another and transporting guitars between studio spaces. In the clip above, all you can hear is my voice. The LS500 has done a good job of highlighting it, and I sound loud and clear. My words don’t bleed into one another so you can easily understand what I’m saying.</p><h2 id="budget-friendly">Budget-friendly</h2><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="gmFXWda4hVJXPa8BZyPrCC" name="PowerA_LS500P_Headset_013.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/gmFXWda4hVJXPa8BZyPrCC.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>For those on a budget, the PowerA LucidSound LS500 offers great value for money as it doesn’t break the bank. It retails for just <a href="https://www.amazon.com/LucidSound-LS500P-Wireless-Headset-PlayStation/dp/B0GQ5GF688/" target="_blank" rel="nofollow">$69 at Amazon</a>, making it a solid wallet-friendly choice. It’s cheaper than the likes of the Turtle Beach Stealth 500 ($79) and the Cherry XTRFY H3 ($99).</p><p>Though it’s a little pricier than the Asus TUF Gaming H1 Gen II ($49), it’s worth spending the extra $20 on the LS500 for wireless connectivity, better controls, and an overall nicer design.</p><h2 class="article-body__section" id="section-powera-lucidsound-ls500-review-the-downs"><span>PowerA LucidSound LS500 review: The downs</span></h2><p>The PowerA LucidSound LS500 is a capable and competent headset, but the bass is lacking, the build is plasticky, and there’s no companion app.</p><h2 id="bass-is-a-little-lacking">Bass is a little lacking</h2><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="e2xb6q9WJR2qQq2eM8qw2C" name="PowerA_LS500P_Headset_004.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/e2xb6q9WJR2qQq2eM8qw2C.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>While the PowerA LucidSound LS500 generally sounds good, it’s a little disappointing that the bass isn’t all there. This is something I experienced with the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/logitech-g325-lightspeed-review">Logitech G325 Lightspeed</a> ($79) too. As I mentioned earlier, the LS500 boasts great treble and a refined mid-range, but the lack of any substantial bass was clear.</p><p>For instance, in Clair Obscur: Expedition 33, bomb-like magic attacks didn’t have much low-end impact to them. Lune’s Elemental Trick skill didn’t sound very powerful. I could hear the sharp crack of lightning and the hissing sizzle of fire, but the deep, resonant thud of earthen rock lacked the <em>oomph. </em>Her Elemental Genesis attack didn’t land with a nuke-like torrential roar either, and sounded tinny.</p><p>Similarly, even though I appreciated the suction-like grabbing sound in Control, when the objects were launched, they didn’t land with as much power either, which was a let-down. If you want a full-bodied, bassy sound, I’d recommend spending extra on the Cherry XTRFY H3.</p><h2 id="plasticky-build">Plasticky build</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="URaGRCfdcSd7WPibLX8CoB" name="PowerA_LS500P_Headset_003.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/URaGRCfdcSd7WPibLX8CoB.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 PowerA LucidSound LS500 is an extremely comfortable headset, but I wish the build quality was better. It isn’t <em>bad, </em>per se, but you can tell it’s very plasticky. Tapping on the headset’s earcups with a fingernail reveals its weakness as the insides sound hollow. The plastic used doesn’t feel very high-quality either, which makes me question the LS500’s longevity.</p><p>For a better-built headset, check out the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/turtle-beach-stealth-600-gen-3-review">Turtle Beach Stealth 600 Gen 3</a> ($99) or the Cherry XTRFY H3 instead. I’m aware that both headsets cost about $30 more than the LS500, but it’s the price you pay for better quality materials.</p><h2 id="no-companion-app">No companion app</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vyHCiQPLBeji3a9eFA2xjB" name="PowerA_LS500P_Headset_005.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/vyHCiQPLBeji3a9eFA2xjB.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>Similar to the Cherry XTRFY H3 and the Asus TUF Gaming H3 Gen II, the PowerA LucidSound LS500 doesn’t come with a companion app. This means that you can’t customize the equalizer or remap the controls. I wouldn’t say this is a massive dealbreaker, though, as you do get access to three EQ presets via the onboard controls — which you can’t do on either of the aforementioned headsets.</p><p>If you do want a headset with a companion app, I’d recommend the Turtle Beach Stealth 500 — but the trade-offs are a cluttered control scheme and earcups that tend to get too hot. </p><h2 class="article-body__section" id="section-powera-lucidsound-ls500-review-verdict"><span>PowerA LucidSound LS500 review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VHhd9yVX9GNYNFgHCcqnnB" name="PowerA_LS500P_Headset_015.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/VHhd9yVX9GNYNFgHCcqnnB.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>You don’t need to spend a fortune to get enjoyable in-game sound, and the PowerA LucidSound LS500 proves that. For under $70, the LS500 delivers an impressive combination of comfort, ease of use via clever controls, and strong audio performance for gamers on a budget. Crisp treble, great directional audio, and balanced mids make the LS500 a compelling wallet-friendly option.</p><p>But it isn’t without its compromises. Bass response lacks the depth and impact some players may want, especially in explosive action scenes, and the plasticky build doesn’t do the LS500 any favors. Oh, there’s no companion app for customization either.</p><p>Even so, the strengths outweigh the shortcomings, given how cheap the LS500 is. This is an excellent value-focused headset that goes above and beyond with its comfort, practicality, and dependable performance.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/powera-lucidsound-ls500-review</link>
                                                                            <description>
                            <![CDATA[ The PowerA LucidSound LS500 is a powerful and competent headset. For just $69, it offers great sound quality and all-day comfort. But it does have some flaws. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">2e4Jn4QXoKTh96usyErwgn</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/VHhd9yVX9GNYNFgHCcqnnB-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 11 Jun 2026 16:54:27 +0000</pubDate>                                                                                                                                <updated>Tue, 16 Jun 2026 16:05:28 +0000</updated>
                                                                                                                                            <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres.&lt;/p&gt;&lt;p&gt;A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/VHhd9yVX9GNYNFgHCcqnnB-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[PowerA LucidSound LS500 gaming headset in black]]></media:description>                                                            <media:text><![CDATA[PowerA LucidSound LS500 gaming headset in black]]></media:text>
                                <media:title type="plain"><![CDATA[PowerA LucidSound LS500 gaming headset in black]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/VHhd9yVX9GNYNFgHCcqnnB-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Playing video games is one of my favorite hobbies, so you can imagine how much joy I get from testing the <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">best gaming headsets</a>. I’ve spent a week testing the budget-friendly PowerA LucidSound LS500 and I’m seriously impressed. Available for just $69, the LS500 boasts great in-game sound quality with directional audio, and the headset is designed to be worn all-day long.</p><p>In addition to this, you get decent mic performance as well as a clever and practical control scheme too. But the LS500 isn’t perfect. Its plasticky build and underwhelming bass leave a lot to be desired. There’s no companion app for customization either. But for the sub-$70 price, those are sacrifices you might be okay with.</p><p>Should you still get the headset? Read my full PowerA LucidSound LS500 review to find out.</p><h2 class="article-body__section" id="section-powera-lucidsound-ls500-review-specs"><span>PowerA LucidSound LS500 review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/LucidSound-LS500P-Wireless-Headset-PlayStation/dp/B0GQ5GF688/" target="_blank" rel="nofollow">$69</a></p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>White, Black</p></td></tr><tr><td class="firstcol " ><p><strong>Platforms</strong></p></td><td  ><p>PS5, PS4, Xbox Series X|S, Xbox One, PC</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Bluetooth 5.3, 2.4GHz</p></td></tr><tr><td class="firstcol " ><p><strong>Frequency response</strong></p></td><td  ><p>20Hz-20KHz</p></td></tr><tr><td class="firstcol " ><p><strong>Drivers</strong></p></td><td  ><p>50mm dynamic</p></td></tr><tr><td class="firstcol " ><p><strong>Multipoint connectivity</strong></p></td><td  ><p>No</p></td></tr><tr><td class="firstcol " ><p><strong>Paired devices max</strong></p></td><td  ><p>1</p></td></tr><tr><td class="firstcol " ><p><strong>Microphone</strong></p></td><td  ><p>Omnidirectional flip-to-mute</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>9.34oz</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-powera-lucidsound-ls500-review-cheat-sheet"><span>PowerA LucidSound LS500 review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>A budget wireless gaming headset for PS5, Xbox and PC</li><li><strong>Who is it for?</strong> Casual gamers on a budget</li><li><strong>How much does it cost?</strong> The PowerA LucidSound LS500 is available for <a href="https://www.amazon.com/LucidSound-LS500P-Wireless-Headset-PlayStation/dp/B0GQ5GF688/" target="_blank" rel="nofollow">$69</a></li><li><strong>What do we like?</strong> The all-day comfort, great in-game sound quality, budget-friendly price, and clever controls</li><li><strong>What don’t we like? </strong>The underwhelming bass, plasticky build, and lack of a companion app</li></ul><h2 class="article-body__section" id="section-powera-lucidsound-ls500-review-the-ups"><span>PowerA LucidSound LS500 review: The ups</span></h2><p>The PowerA LucidSound LS500 is a fantastic budget-friendly headset, boasting all-day comfort and (mostly) superb in-game sound quality.</p><h2 id="lightweight-and-comfortable-2">Lightweight and comfortable</h2><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="XoeA9yJxZUFgYXr7znQJmB" name="PowerA_LS500P_Headset_002.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/XoeA9yJxZUFgYXr7znQJmB.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>Regardless of how much a headset costs, you shouldn’t spend any amount of money on it if it isn’t comfortable. Thankfully, the PowerA LucidSound LS500 definitely is! </p><p>The headset is lightweight, weighing just 9.34 ounces. It’s lighter than the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/cherry-xtrfy-h3-gaming-headset-review">Cherry XTRFY H3</a> ($99, 11.46 ounces) and the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/asus-tuf-gaming-h1-gen-ii-headset-review">Asus TUF Gaming H1 Gen II</a> ($49, 10.47 ounces). The frame is made of lightweight metal, and the mesh headband sits comfortably on your head and helps relieve some pressure you’d otherwise feel.</p><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="9wGzh4LqwZi2vHnimtaE4C" name="PowerA_LS500P_Headset_009.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/9wGzh4LqwZi2vHnimtaE4C.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 LS500 features spacious earcups made of “moisture-wicking cloth liner.” This material pulls sweat and moisture away from your skin and spreads it across the fabric’s outside so that it evaporates quickly. This essentially means that your ears are protected against skin irritation from pooling sweat, and it results in a more comfortable fit. Marketing speak aside, I can confirm that my ears didn’t feel itchy or too hot, even after wearing the headset for seven straight hours.</p><h2 id="clever-straightforward-controls">Clever, straightforward controls</h2><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="JDgQmrLKNguXncyNV8HaMC" name="PowerA_LS500P_Headset_006.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/JDgQmrLKNguXncyNV8HaMC.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>One of my grievances with the also budget-friendly <a href="https://www.tomsguide.com/gaming/gaming-peripherals/turtle-beach-stealth-500-review-a-wallet-friendly-wonder">Turtle Beach Stealth 500</a> ($79) was that its controls felt too cluttered, pooled together on one earcup. Thankfully, that isn’t the case with the PowerA LucidSound LS500. The headset sports a clever and straightforward control scheme, with physical buttons and dials located on both earcups. The power button is located on the left earcup, and it doubles as the Bluetooth/2.4GHz button when it’s held down for a few seconds.</p><p>You’ll find two rotatable wheels on both earcups, located around the LucidSound branding. On the left earcup, rotating the wheel changes the volume while pressing the ‘LS’ button once mutes the audio, twice tells you the battery level, and thrice swaps between three equalizer presets. It’s very easy to switch between bass boost, FPS and signature sound.</p><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="AJdxfNexqdfegHGNdFdLoB" name="PowerA_LS500P_Headset_008.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/AJdxfNexqdfegHGNdFdLoB.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 wheel on the right earcup, on the other hand, lets you adjust the mic monitoring level (or sidetone) when the headset is in 2.4GHz mode, or change the track when you’re listening to music over Bluetooth. Pressing the ‘LS’ button on the right earcup plays or pauses playback in Bluetooth mode, too.</p><p>I really like the implementation of these rotating wheels. I haven’t seen any other headset do this, so it’s nice to see a brand try something different for a change.</p><h2 id="detailed-sound-for-the-price">Detailed sound 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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8TqhUBnUkGJRMicPysPf5C" name="PowerA_LS500P_Headset_010.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/8TqhUBnUkGJRMicPysPf5C.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 PowerA LucidSound LS500 boasts great sound quality, especially for a sub-$100 headset. It’s fitted with 50mm dynamic drivers which cover a frequency response range of 20Hz to 20KHz — so essentially the entirety of the human hearing spectrum. Regardless of the game I played to test the LS500, I felt immersed.</p><p>There are two ways to connect the headset to your <a href="https://www.tomsguide.com/reviews/ps5">PS5</a>, <a href="https://www.tomsguide.com/reviews/xbox-series-x">Xbox Series X|S</a> or PC: via the 2.4GHz dongle or Bluetooth 5.3. I plugged the USB-C dongle into the front of my <a href="https://www.tomsguide.com/gaming/playstation/ps5-slim">PS5 Slim</a> and I was good to go in mere seconds. I kicked things off by playing <a href="https://www.tomsguide.com/gaming/clair-obscur-expedition-33-review">Clair Obscur: Expedition 33</a>, and I was immediately impressed with the well-balanced sound in battles. The neoclassical operatic and heavy rock soundtrack didn’t overpower the combat sounds and vice versa.</p><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="3BkwcHfsq4eWsgzKxJBhHC" name="PowerA_LS500P_Headset_012.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/3BkwcHfsq4eWsgzKxJBhHC.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 treble sounded crisp and vibrant without piercing through the rest of the soundstage, so I was able to appreciate the beautiful backing tracks while still hearing my sword slashing against the enemies. I also liked being able to clearly understand my party members when they yelled, “Parry it” or “Watch out, Verso.” Their voices weren’t lost in the busy soundscape.</p><p>I then played <a href="https://www.tomsguide.com/reviews/control">Control</a> and instantly felt immersed in the horror landscape as I made my way down the halls of the brutalist Oldest House building. I could pinpoint the exact direction in which the enemies spawned, as the LS500’s directional audio works excellently. Even when heavily surrounded by supernatural entities making all kinds of weird sounds, I was still able to hear the suction-like sound objects made when I grabbed them with Jesse’s Launch ability, which added to the immersion.</p><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="WHNMowvazL3YDdf7bbGxhB" name="PowerA_LS500P_Headset_014.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/WHNMowvazL3YDdf7bbGxhB.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Alongside RPGs, the LS500 is fit for FPS titles too, or any game where listening for footsteps counts the most. I switched to the FPS EQ for <a href="https://www.tomsguide.com/gaming/007-first-light-review">007 First Light</a>, and this enhanced the sound of footsteps by boosting the mid-range. When I needed to infiltrate a heavily-guarded area stealthily, I could pinpoint the NPCs’ locations while hiding as their footsteps grew louder as they came closer to my hiding spot. This helped me execute timely takedowns without alerting the others.</p><h2 id="decent-mic-performance">Decent mic performance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NwqjRTwyMKsTuZwa4HK7xB" name="PowerA_LS500P_Headset_007.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/NwqjRTwyMKsTuZwa4HK7xB.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>Similar to the Turtle Beach Stealth 500, the PowerA LucidSound LS500 features a flip-to-mute mic. It’s omnidirectional which means it records audio from all directions. While that may sound counterintuitive, the LS500 has built-in noise filtering to reduce background noises — and it works well.</p><audio src="https://cdn.mos.cms.futurecdn.net/Ru8cky8nTefMdEuNxECvx7/LS500%20clip.mp3"  controls="controls" preload="none"></audio><p><br>I recorded myself speaking while sitting in our office’s kitchen area, and my colleagues were speaking with one another and transporting guitars between studio spaces. In the clip above, all you can hear is my voice. The LS500 has done a good job of highlighting it, and I sound loud and clear. My words don’t bleed into one another so you can easily understand what I’m saying.</p><h2 id="budget-friendly">Budget-friendly</h2><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="gmFXWda4hVJXPa8BZyPrCC" name="PowerA_LS500P_Headset_013.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/gmFXWda4hVJXPa8BZyPrCC.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>For those on a budget, the PowerA LucidSound LS500 offers great value for money as it doesn’t break the bank. It retails for just <a href="https://www.amazon.com/LucidSound-LS500P-Wireless-Headset-PlayStation/dp/B0GQ5GF688/" target="_blank" rel="nofollow">$69 at Amazon</a>, making it a solid wallet-friendly choice. It’s cheaper than the likes of the Turtle Beach Stealth 500 ($79) and the Cherry XTRFY H3 ($99).</p><p>Though it’s a little pricier than the Asus TUF Gaming H1 Gen II ($49), it’s worth spending the extra $20 on the LS500 for wireless connectivity, better controls, and an overall nicer design.</p><h2 class="article-body__section" id="section-powera-lucidsound-ls500-review-the-downs"><span>PowerA LucidSound LS500 review: The downs</span></h2><p>The PowerA LucidSound LS500 is a capable and competent headset, but the bass is lacking, the build is plasticky, and there’s no companion app.</p><h2 id="bass-is-a-little-lacking">Bass is a little lacking</h2><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="e2xb6q9WJR2qQq2eM8qw2C" name="PowerA_LS500P_Headset_004.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/e2xb6q9WJR2qQq2eM8qw2C.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>While the PowerA LucidSound LS500 generally sounds good, it’s a little disappointing that the bass isn’t all there. This is something I experienced with the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/logitech-g325-lightspeed-review">Logitech G325 Lightspeed</a> ($79) too. As I mentioned earlier, the LS500 boasts great treble and a refined mid-range, but the lack of any substantial bass was clear.</p><p>For instance, in Clair Obscur: Expedition 33, bomb-like magic attacks didn’t have much low-end impact to them. Lune’s Elemental Trick skill didn’t sound very powerful. I could hear the sharp crack of lightning and the hissing sizzle of fire, but the deep, resonant thud of earthen rock lacked the <em>oomph. </em>Her Elemental Genesis attack didn’t land with a nuke-like torrential roar either, and sounded tinny.</p><p>Similarly, even though I appreciated the suction-like grabbing sound in Control, when the objects were launched, they didn’t land with as much power either, which was a let-down. If you want a full-bodied, bassy sound, I’d recommend spending extra on the Cherry XTRFY H3.</p><h2 id="plasticky-build">Plasticky build</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="URaGRCfdcSd7WPibLX8CoB" name="PowerA_LS500P_Headset_003.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/URaGRCfdcSd7WPibLX8CoB.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 PowerA LucidSound LS500 is an extremely comfortable headset, but I wish the build quality was better. It isn’t <em>bad, </em>per se, but you can tell it’s very plasticky. Tapping on the headset’s earcups with a fingernail reveals its weakness as the insides sound hollow. The plastic used doesn’t feel very high-quality either, which makes me question the LS500’s longevity.</p><p>For a better-built headset, check out the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/turtle-beach-stealth-600-gen-3-review">Turtle Beach Stealth 600 Gen 3</a> ($99) or the Cherry XTRFY H3 instead. I’m aware that both headsets cost about $30 more than the LS500, but it’s the price you pay for better quality materials.</p><h2 id="no-companion-app">No companion app</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vyHCiQPLBeji3a9eFA2xjB" name="PowerA_LS500P_Headset_005.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/vyHCiQPLBeji3a9eFA2xjB.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>Similar to the Cherry XTRFY H3 and the Asus TUF Gaming H3 Gen II, the PowerA LucidSound LS500 doesn’t come with a companion app. This means that you can’t customize the equalizer or remap the controls. I wouldn’t say this is a massive dealbreaker, though, as you do get access to three EQ presets via the onboard controls — which you can’t do on either of the aforementioned headsets.</p><p>If you do want a headset with a companion app, I’d recommend the Turtle Beach Stealth 500 — but the trade-offs are a cluttered control scheme and earcups that tend to get too hot. </p><h2 class="article-body__section" id="section-powera-lucidsound-ls500-review-verdict"><span>PowerA LucidSound LS500 review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VHhd9yVX9GNYNFgHCcqnnB" name="PowerA_LS500P_Headset_015.JPG" alt="PowerA LucidSound LS500 gaming headset in black" src="https://cdn.mos.cms.futurecdn.net/VHhd9yVX9GNYNFgHCcqnnB.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>You don’t need to spend a fortune to get enjoyable in-game sound, and the PowerA LucidSound LS500 proves that. For under $70, the LS500 delivers an impressive combination of comfort, ease of use via clever controls, and strong audio performance for gamers on a budget. Crisp treble, great directional audio, and balanced mids make the LS500 a compelling wallet-friendly option.</p><p>But it isn’t without its compromises. Bass response lacks the depth and impact some players may want, especially in explosive action scenes, and the plasticky build doesn’t do the LS500 any favors. Oh, there’s no companion app for customization either.</p><p>Even so, the strengths outweigh the shortcomings, given how cheap the LS500 is. This is an excellent value-focused headset that goes above and beyond with its comfort, practicality, and dependable performance.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I just sat on my dream gaming chair, and now I’m fighting the urge to take a nap to tell you about the Cougar Arker ]]></title>
                                                                                                <dc:content><![CDATA[ <p>When it comes to the <a href="https://www.tomsguide.com/best-picks/best-gaming-chairs">best gaming chairs</a>, you find they all follow the same rules — bucket seat-esque ergonomics, a sort of stiffer cushion to force a posture, and a head pillow that I always struggle to figure out how to position it <em>just </em>right.</p><p>Well, what if you took the full plushness and recline of a La-Z-Boy and paired it with a throne for play? You get the Cougar Arker, which is easily my favorite gaming chair of the past few years and one I can’t wait to complete my setup with when it comes out for a “targeted” price of $270.</p><h2 id="sleep-or-play-your-choice">Sleep or play? Your choice</h2><p>Whenever I see a gaming chair fold completely flat, it’s always given me gimmick vibes. It’s a nice-to-have, but I’d never use it fully horizontal. The luxurious cushioning that you just fully sink into on the Arker makes that posture make sense. I could see myself totally taking a nap working while laid back on this thing.</p><p>And that Hyper-Dura leatherette upholstery did get me worried at first — thinking that my legs in shorts were going to stick to it. But no, that material doesn’t get uncomfortable, it doesn’t stick to your legs. It’s got the sensation of leather without gluing your skin down to 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:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xRdZevdTCs4tkxEwuB5keZ" name="Cougar Arker" alt="Cougar Arker" src="https://cdn.mos.cms.futurecdn.net/xRdZevdTCs4tkxEwuB5keZ.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 seriously cannot understate how soft this seat truly is. No hard cushioning, this feels like a hug in chair form with well-placed arms too for a nice ergonomic posture to boot.</p><h2 id="kick-back">Kick back</h2><p>Then there’s the full recline and that sneaky footrest you can pull out from beneath the chair. With it, you can fully lay back and to be honest, I was so close to napping. </p><p>Is this because I’m seriously sleep-deprived after going hard on covering <a href="https://www.tomsguide.com/computing/best-of-computex-2026">Computex 2026</a>? Maybe. Did Nvidia keep me awake much longer than anticipated with <a href="https://www.tomsguide.com/computing/laptops/nvidia-rtx-spark-hands-on-review">RTX Spark testing</a>? Possibly.</p><p>But in a real-world scenario, I can see this slotting ideally under my desk — not just for working by day but playing and resting by night. Turning on some soft RGB and some LoFi to lay back and really vibe in a multi-sensory experience while I grab some Zs.</p><h2 id="outlook-2">Outlook</h2><p>But what shocked me most is when talking to Cougar about the chair, the price target for them is $270, which is crazy good value for money when it comes to gaming chairs. That’s especially true for something like the Arker, which the company has really found a sweet spot with for me.</p><p>For too long, I’ve been forced into different postures, and I know it’s for my health and everything, but it’s tricky for me to really get lazy on them. Turns out all your need to do is throw a lot of cushion at it and make the thing feel like your favorite couch from your childhood.</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/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><li><a href="https://www.tomsguide.com/gaming/handheld-gaming/msi-claw-8-ex-ai-plus-hands-on-review">I just tested the MSI Claw 8 EX AI+ — it leaves ROG Xbox Ally in the dust with breakthrough Intel Arc G3 power</a></li><li><a href="https://www.tomsguide.com/computing/gpus/amd-radeon-rx-9070-gre-review">I gamed for 250 hours on AMD Radeon RX 9070 GRE — it’s a $549 nightmare for Nvidia’s RTX 5060 Ti</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/i-just-sat-on-my-dream-gaming-chair-and-now-im-fighting-the-urge-to-take-a-nap-to-tell-you-about-the-cougar-arker</link>
                                                                            <description>
                            <![CDATA[ I sat on the new Cougar Arker gaming chair. It's sofa-grade luxury and near-flat recline almost made me nap on the convention floor! ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">BEV8bx5HPM4XkaZzf3nkim</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/itK2PXCPe4w7mitdcWVXjZ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 05 Jun 2026 02:10:26 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gaming Peripherals]]></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/itK2PXCPe4w7mitdcWVXjZ-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Cougar Arker]]></media:description>                                                            <media:text><![CDATA[Cougar Arker]]></media:text>
                                <media:title type="plain"><![CDATA[Cougar Arker]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/itK2PXCPe4w7mitdcWVXjZ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>When it comes to the <a href="https://www.tomsguide.com/best-picks/best-gaming-chairs">best gaming chairs</a>, you find they all follow the same rules — bucket seat-esque ergonomics, a sort of stiffer cushion to force a posture, and a head pillow that I always struggle to figure out how to position it <em>just </em>right.</p><p>Well, what if you took the full plushness and recline of a La-Z-Boy and paired it with a throne for play? You get the Cougar Arker, which is easily my favorite gaming chair of the past few years and one I can’t wait to complete my setup with when it comes out for a “targeted” price of $270.</p><h2 id="sleep-or-play-your-choice">Sleep or play? Your choice</h2><p>Whenever I see a gaming chair fold completely flat, it’s always given me gimmick vibes. It’s a nice-to-have, but I’d never use it fully horizontal. The luxurious cushioning that you just fully sink into on the Arker makes that posture make sense. I could see myself totally taking a nap working while laid back on this thing.</p><p>And that Hyper-Dura leatherette upholstery did get me worried at first — thinking that my legs in shorts were going to stick to it. But no, that material doesn’t get uncomfortable, it doesn’t stick to your legs. It’s got the sensation of leather without gluing your skin down to 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:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xRdZevdTCs4tkxEwuB5keZ" name="Cougar Arker" alt="Cougar Arker" src="https://cdn.mos.cms.futurecdn.net/xRdZevdTCs4tkxEwuB5keZ.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 seriously cannot understate how soft this seat truly is. No hard cushioning, this feels like a hug in chair form with well-placed arms too for a nice ergonomic posture to boot.</p><h2 id="kick-back">Kick back</h2><p>Then there’s the full recline and that sneaky footrest you can pull out from beneath the chair. With it, you can fully lay back and to be honest, I was so close to napping. </p><p>Is this because I’m seriously sleep-deprived after going hard on covering <a href="https://www.tomsguide.com/computing/best-of-computex-2026">Computex 2026</a>? Maybe. Did Nvidia keep me awake much longer than anticipated with <a href="https://www.tomsguide.com/computing/laptops/nvidia-rtx-spark-hands-on-review">RTX Spark testing</a>? Possibly.</p><p>But in a real-world scenario, I can see this slotting ideally under my desk — not just for working by day but playing and resting by night. Turning on some soft RGB and some LoFi to lay back and really vibe in a multi-sensory experience while I grab some Zs.</p><h2 id="outlook-2">Outlook</h2><p>But what shocked me most is when talking to Cougar about the chair, the price target for them is $270, which is crazy good value for money when it comes to gaming chairs. That’s especially true for something like the Arker, which the company has really found a sweet spot with for me.</p><p>For too long, I’ve been forced into different postures, and I know it’s for my health and everything, but it’s tricky for me to really get lazy on them. Turns out all your need to do is throw a lot of cushion at it and make the thing feel like your favorite couch from your childhood.</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/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><li><a href="https://www.tomsguide.com/gaming/handheld-gaming/msi-claw-8-ex-ai-plus-hands-on-review">I just tested the MSI Claw 8 EX AI+ — it leaves ROG Xbox Ally in the dust with breakthrough Intel Arc G3 power</a></li><li><a href="https://www.tomsguide.com/computing/gpus/amd-radeon-rx-9070-gre-review">I gamed for 250 hours on AMD Radeon RX 9070 GRE — it’s a $549 nightmare for Nvidia’s RTX 5060 Ti</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I'd buy these 12 gaming peripherals from Amazon over and over again  ]]></title>
                                                                                                <dc:content><![CDATA[ <p>There's a reason you'll see so many options when shopping for new gaming peripherals — everyone's preferences are different. Of course, many products probably do the same thing or have very similar features, but the overall variety and knowing you can find a niche peripheral to suit your needs is nice.</p><p>As someone who tests tech for a living and plays a lot of games in her spare time, I've accumulated a varied collection of beloved gaming peripherals. I do like to shake things up once in a while with something new, but for the most part, the 12 peripherals I've rounded up below have found a home on my desk. If any of these peripherals were to break on me, I'd order a replacement right away. </p>        <div class="featured_product_block featured_block_hero" data-id="73506fd5-2e9f-4a86-8d3d-c0d1c31f9921">            <a href="https://www.amazon.com/Leather-Protector-Non-Slip-Blotter-Waterproof/dp/B08N9W3889" data-model-name="Leather Desk Pad Protector" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/pmxpfZcUGJ8chNRBHSuHnb.jpg" alt="Aothia, Leather Desk Pad Protector"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Aothia</div>                                        <div class="featured__title">Leather Desk Pad Protector</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="5ccce8a1-9da2-4b4a-aced-f8a98b4233c1">            <a href="https://www.amazon.com/Xbox-Wireless-Gaming-Controller-Velocity-Console/dp/B0F1HTGDTL" data-model-name="Wireless Controller" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/53fFkJKKq2WZPFxrYZtw6n.jpg" alt="Xbox, Wireless Controller"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Xbox</div>                                        <div class="featured__title">Wireless Controller</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="d8fe27e7-4869-47d8-8e2d-be613e28b122">            <a href="https://www.amazon.com/Creative-USB-Powered-Speakers-Far-Field-Radiators/dp/B0791J2658" data-model-name="Pebble 2.0 USB Desktop Speakers" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/a5eTYzzecnSknFTXtXgwqh.jpg" alt="Creative, Pebble 2.0 USB Desktop Speakers"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Creative</div>                                        <div class="featured__title">Pebble 2.0 USB Desktop Speakers</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="36cbca3a-c3ab-4a2c-a131-e6921ac32a6f">            <a href="https://www.amazon.com/Qloud-Cloud-Wrist-Rest-Keyboard/dp/B0D75YXRH5" data-model-name="Cloud Keyboard Wrist Rest" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/ihee3WYNgmo39UK3xt5S2f.jpg" alt="Create-ables, Cloud Keyboard Wrist Rest"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Create-ables</div>                                        <div class="featured__title">Cloud Keyboard Wrist Rest</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="abf40bd6-261f-432c-a1fd-13a572fb8f9a">            <a href="https://www.amazon.com/UPERGO-Controller-Headphone-Equipment-Accessories/dp/B0FPBJ85NV" data-model-name="Wood Headset and Controller Stand" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/jgkrJedXiNSkBFmtcFSpB4.jpg" alt="UPERGO, Wood Headset and Controller Stand"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>UPERGO</div>                                        <div class="featured__title">Wood Headset and Controller Stand</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="68924cee-b7f1-4c9b-b3ee-f04388837993">            <a href="https://www.amazon.com/Logitech-Creators-Microphone-Podcasting-Play-Midnight/dp/B00N1YPXW2" data-model-name="Blue Yeti USB Microphone" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/YkkFhwAgrZkfaWLcB4ZLGZ.jpg" alt="Logitech G, Blue Yeti USB Microphone"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Logitech G</div>                                        <div class="featured__title">Blue Yeti USB Microphone</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="160a7a00-a3fb-42c4-9c9a-99a34da15967">            <a href="https://www.amazon.com/Elgato-Stream-Deck-MK-2-Controller/dp/B09RMXK59C" data-model-name="Stream Deck MK.2" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/9ko7hNw8PVkmYcR6C6i5xj.jpg" alt="Elgato, Stream Deck MK.2"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Elgato</div>                                        <div class="featured__title">Stream Deck MK.2</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="6e69a64d-cab5-4774-9aec-669ff8bae741">            <a href="https://www.amazon.com/Logitech-Superlight-Wireless-Pro-Grade-Programmable/dp/B09NBWQDKX" data-model-name="Superlight 2 Wireless Gaming Mouse" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/DS2rHfxLnPpVkwnYXk2aWa.jpg" alt="Logitech G, Superlight 2 Wireless Gaming Mouse"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Logitech G</div>                                        <div class="featured__title">Superlight 2 Wireless Gaming Mouse</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="9500ce23-d183-4b7c-bd04-3a554c56c2dd">            <a href="https://www.amazon.com/SB272-Zero-Frame-FreeSync-Technology-Ultra-Thin/dp/B0BS9RH7GX" data-model-name="27-Inch, FHD, 100Hz Monitor (SB272)" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/Tx6CZwiWhd7ZKPQvaw2nvg.jpg" alt="Acer, 27-Inch, FHD, 100Hz Monitor (SB272)"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Acer</div>                                        <div class="featured__title">27-Inch, FHD, 100Hz Monitor (SB272)</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="ae9ef146-dd78-47c1-8eb0-8c8dc5ad8e6f">            <a href="https://www.amazon.com/Keychron-Mechanical-Customizable-Programmable-Hot-swappable/dp/B0CMTQLJRJ" data-model-name="Q5 Pro Keyboard with K Pro Banana Switches" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/VTNdctDxtxHteuTjQzfdrf.jpg" alt="Keychron, Q5 Pro Keyboard with K Pro Banana Switches"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Keychron</div>                                        <div class="featured__title">Q5 Pro Keyboard with K Pro Banana Switches</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="304da4da-8d58-4c83-a2bd-f38354aaf748">            <a href="https://www.amazon.com/Sony-WH-1000XM5-Headphones-Hands-Free-WH1000XM5/dp/B0DDV3FRHR" data-model-name="Sony WH-1000XM5 Wireless Headphones" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/MLyyuqUscNybHhhVQCCixk.jpg" alt="Sony, Sony WH-1000XM5 Wireless Headphones"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Sony</div>                                        <div class="featured__title">Sony WH-1000XM5 Wireless Headphones</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="e43524c4-0d9f-4b1d-9ee8-424a0b98d2d6">            <a href="https://www.amazon.com/Keychron-Double-Rail-Adjustable-Actuation-Bluetooth/dp/B0DBV3X3BM" data-model-name="Q5 HE Keyboard with Magnetic Switches" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/shzFWTAPAbSZK2e4JHFPkd.jpg" alt="Keychron, Q5 HE Keyboard with Magnetic Switches"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Keychron</div>                                        <div class="featured__title">Q5 HE Keyboard with Magnetic Switches</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/id-buy-these-12-gaming-peripherals-from-amazon-over-and-over-again</link>
                                                                            <description>
                            <![CDATA[ I've leveled up my gaming experience tremendously with these 12 peripherals, and if they ever broke, I'd buy them again right away. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Yec8RvzUgQTXH7SFtTGUFX</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Mer96jr7EwC5awd3S5LwMj-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 28 May 2026 16:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Sarah Chaney ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/suPHU879S6aTM4FZ2htzD5.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Sarah Chaney is a freelance tech writer with 4 years of experience across multiple outlets, including How-To Geek, MakeUseOf, SlashGear, Laptop Mag, and of course, Tom&#039;s Guide. She loves reviewing the latest gadgets, from inventive robot vacuums to new laptops, wearables, and anything PC-related. When she&#039;s not writing, she&#039;s probably playing a video game, exploring the outdoors, or listening to her current favorite song or album on repeat.&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/Mer96jr7EwC5awd3S5LwMj-1280-80.jpg">
                                                            <media:credit><![CDATA[Xbox / Upergo / Logitech G / Sony / Edited by Gemini]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A selection of gaming peripherals, including a mouse, a joypad, and some headphones.]]></media:description>                                                            <media:text><![CDATA[A selection of gaming peripherals, including a mouse, a joypad, and some headphones.]]></media:text>
                                <media:title type="plain"><![CDATA[A selection of gaming peripherals, including a mouse, a joypad, and some headphones.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Mer96jr7EwC5awd3S5LwMj-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>There's a reason you'll see so many options when shopping for new gaming peripherals — everyone's preferences are different. Of course, many products probably do the same thing or have very similar features, but the overall variety and knowing you can find a niche peripheral to suit your needs is nice.</p><p>As someone who tests tech for a living and plays a lot of games in her spare time, I've accumulated a varied collection of beloved gaming peripherals. I do like to shake things up once in a while with something new, but for the most part, the 12 peripherals I've rounded up below have found a home on my desk. If any of these peripherals were to break on me, I'd order a replacement right away. </p>        <div class="featured_product_block featured_block_hero" data-id="73506fd5-2e9f-4a86-8d3d-c0d1c31f9921">            <a href="https://www.amazon.com/Leather-Protector-Non-Slip-Blotter-Waterproof/dp/B08N9W3889" data-model-name="Leather Desk Pad Protector" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/pmxpfZcUGJ8chNRBHSuHnb.jpg" alt="Aothia, Leather Desk Pad Protector"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Aothia</div>                                        <div class="featured__title">Leather Desk Pad Protector</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="5ccce8a1-9da2-4b4a-aced-f8a98b4233c1">            <a href="https://www.amazon.com/Xbox-Wireless-Gaming-Controller-Velocity-Console/dp/B0F1HTGDTL" data-model-name="Wireless Controller" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/53fFkJKKq2WZPFxrYZtw6n.jpg" alt="Xbox, Wireless Controller"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Xbox</div>                                        <div class="featured__title">Wireless Controller</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="d8fe27e7-4869-47d8-8e2d-be613e28b122">            <a href="https://www.amazon.com/Creative-USB-Powered-Speakers-Far-Field-Radiators/dp/B0791J2658" data-model-name="Pebble 2.0 USB Desktop Speakers" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/a5eTYzzecnSknFTXtXgwqh.jpg" alt="Creative, Pebble 2.0 USB Desktop Speakers"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Creative</div>                                        <div class="featured__title">Pebble 2.0 USB Desktop Speakers</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="36cbca3a-c3ab-4a2c-a131-e6921ac32a6f">            <a href="https://www.amazon.com/Qloud-Cloud-Wrist-Rest-Keyboard/dp/B0D75YXRH5" data-model-name="Cloud Keyboard Wrist Rest" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/ihee3WYNgmo39UK3xt5S2f.jpg" alt="Create-ables, Cloud Keyboard Wrist Rest"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Create-ables</div>                                        <div class="featured__title">Cloud Keyboard Wrist Rest</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="abf40bd6-261f-432c-a1fd-13a572fb8f9a">            <a href="https://www.amazon.com/UPERGO-Controller-Headphone-Equipment-Accessories/dp/B0FPBJ85NV" data-model-name="Wood Headset and Controller Stand" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/jgkrJedXiNSkBFmtcFSpB4.jpg" alt="UPERGO, Wood Headset and Controller Stand"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>UPERGO</div>                                        <div class="featured__title">Wood Headset and Controller Stand</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="68924cee-b7f1-4c9b-b3ee-f04388837993">            <a href="https://www.amazon.com/Logitech-Creators-Microphone-Podcasting-Play-Midnight/dp/B00N1YPXW2" data-model-name="Blue Yeti USB Microphone" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/YkkFhwAgrZkfaWLcB4ZLGZ.jpg" alt="Logitech G, Blue Yeti USB Microphone"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Logitech G</div>                                        <div class="featured__title">Blue Yeti USB Microphone</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="160a7a00-a3fb-42c4-9c9a-99a34da15967">            <a href="https://www.amazon.com/Elgato-Stream-Deck-MK-2-Controller/dp/B09RMXK59C" data-model-name="Stream Deck MK.2" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/9ko7hNw8PVkmYcR6C6i5xj.jpg" alt="Elgato, Stream Deck MK.2"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Elgato</div>                                        <div class="featured__title">Stream Deck MK.2</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="6e69a64d-cab5-4774-9aec-669ff8bae741">            <a href="https://www.amazon.com/Logitech-Superlight-Wireless-Pro-Grade-Programmable/dp/B09NBWQDKX" data-model-name="Superlight 2 Wireless Gaming Mouse" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/DS2rHfxLnPpVkwnYXk2aWa.jpg" alt="Logitech G, Superlight 2 Wireless Gaming Mouse"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Logitech G</div>                                        <div class="featured__title">Superlight 2 Wireless Gaming Mouse</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="9500ce23-d183-4b7c-bd04-3a554c56c2dd">            <a href="https://www.amazon.com/SB272-Zero-Frame-FreeSync-Technology-Ultra-Thin/dp/B0BS9RH7GX" data-model-name="27-Inch, FHD, 100Hz Monitor (SB272)" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/Tx6CZwiWhd7ZKPQvaw2nvg.jpg" alt="Acer, 27-Inch, FHD, 100Hz Monitor (SB272)"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Acer</div>                                        <div class="featured__title">27-Inch, FHD, 100Hz Monitor (SB272)</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="ae9ef146-dd78-47c1-8eb0-8c8dc5ad8e6f">            <a href="https://www.amazon.com/Keychron-Mechanical-Customizable-Programmable-Hot-swappable/dp/B0CMTQLJRJ" data-model-name="Q5 Pro Keyboard with K Pro Banana Switches" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/VTNdctDxtxHteuTjQzfdrf.jpg" alt="Keychron, Q5 Pro Keyboard with K Pro Banana Switches"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Keychron</div>                                        <div class="featured__title">Q5 Pro Keyboard with K Pro Banana Switches</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="304da4da-8d58-4c83-a2bd-f38354aaf748">            <a href="https://www.amazon.com/Sony-WH-1000XM5-Headphones-Hands-Free-WH1000XM5/dp/B0DDV3FRHR" data-model-name="Sony WH-1000XM5 Wireless Headphones" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/MLyyuqUscNybHhhVQCCixk.jpg" alt="Sony, Sony WH-1000XM5 Wireless Headphones"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Sony</div>                                        <div class="featured__title">Sony WH-1000XM5 Wireless Headphones</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="e43524c4-0d9f-4b1d-9ee8-424a0b98d2d6">            <a href="https://www.amazon.com/Keychron-Double-Rail-Adjustable-Actuation-Bluetooth/dp/B0DBV3X3BM" data-model-name="Q5 HE Keyboard with Magnetic Switches" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/shzFWTAPAbSZK2e4JHFPkd.jpg" alt="Keychron, Q5 HE Keyboard with Magnetic Switches"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Keychron</div>                                        <div class="featured__title">Q5 HE Keyboard with Magnetic Switches</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I gave my Switch 2 a major upgrade for $55 less than buying another official dock — and it fits in my pocket ]]></title>
                                                                                                <dc:content><![CDATA[ <p>One of my favorite things about the original Nintendo Switch was easily being able to bring it from room to room to play on another TV. I may have started out with just one dock, but after getting another Switch for my wife and then upgrading to the Nintendo Switch OLED, I soon had plenty of them.</p><p>Even then, though, there was just one problem with the original Switch dock: it was too big for my taste. So I did what anyone with a bit of DIY know-how would do: I <a href="https://www.tomsguide.com/opinion/i-mounted-a-mini-pc-to-the-back-of-my-monitor-for-an-even-cleaner-setup">reshelled it</a> to make the dock significantly smaller while still using Nintendo’s official hardware. You see, at the time, I was really worried about <a href="https://www.tomsguide.com/news/nintendo-switch-brick-docks">bricking my Switch</a> with a third-party dock, as I had seen countless people do so online.</p><p>Just when I thought I was stuck with the original dock, I finally tried a third-party one from Genki. Long story short, I loved the <a href="https://www.tomsguide.com/opinion/this-tiny-nintendo-switch-dock-is-a-game-changer-and-its-perfect-for-traveling">Genki Covert Dock Mini</a> and even the larger Genki Covert Dock 2 so much that I ended up with several of them. This worked perfectly, as I could use my Switch on my TV or with one of the <a href="https://www.tomsguide.com/best-picks/best-monitors">best monitors</a> no matter where I was in my house. Then I <a href="https://www.tomsguide.com/gaming/nintendo/i-was-struggling-to-set-up-my-switch-2-until-i-tried-using-mouse-mode-heres-why">upgraded to the Switch 2</a>….</p><p>Once again, I was stuck with the official Switch 2 dock. I thought about buying a second one, but at $119 at launch and now $125, I just couldn’t justify dropping that much to be able to play my Switch 2 on another display. Fortunately, Genki recently released its new Covert Dock 3.</p><p>The <a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-tried-genkis-covert-dock-3-with-the-nintendo-switch-2-and-it-beats-the-official-dock-for-one-key-reason">Covert Dock 3</a> packs in even more power at 65W — versus 45W with its predecessor — and it has a cool new two-tone translucent orange colorway to boot. However, the best part is that even though it’s slightly more expensive than the Covert Dock 2, it’s still significantly cheaper than picking up a second official Switch 2 dock.</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/b91wyp1oA3s" allowfullscreen></iframe></div></div><h2 id="dock-meets-power-adapter">Dock meets power adapter</h2><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="pqPVcosmnZfmLDK5HcXHCX" name="Genki Covert Dock 3_1" alt="An official Nintendo Switch 2 power adapter next to the Genki Covert Dock 3" src="https://cdn.mos.cms.futurecdn.net/pqPVcosmnZfmLDK5HcXHCX.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>Instead of the dongle-like appearance of other third-party Switch docks, Genki’s Covert Docks look just like a standard power adapter. There’s a retractable plug on the back, while the front features a USB-C port, an HDMI port, and a USB-A port for connecting accessories like one of the <a href="https://www.tomsguide.com/gaming/nintendo/best-nintendo-switch-2-controllers">best Nintendo Switch 2 controllers</a>. At first glance, you might easily mistake it for a regular <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>.</p><p>If you’re bringing your Switch 2 to a friend’s house or packing it for a trip, the official setup forces you to lug around both the dock and a separate power brick. With the Covert Dock 3, you just need the device itself and the included USB-C cable. Also, since the Switch 2 can't do <a href="https://www.tomsguide.com/tvs/how-important-are-tv-refresh-rates-and-how-high-do-you-really-need">high refresh rate gaming</a> in TV mode, you can pretty much use any HDMI cable you want 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:5598px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HqX5BkFjtxozc2fQQHWNhf" name="Genki Covert Dock 3_2" alt="An official Nintendo Switch 2 power adapter next to the Genki Covert Dock 3 showing the size difference between the two" src="https://cdn.mos.cms.futurecdn.net/HqX5BkFjtxozc2fQQHWNhf.jpg" mos="" align="middle" fullscreen="" width="5598" height="3149" attribution="" endorsement="" class="inline"></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 size, the Covert Dock 3 measures 2.4 x 1.7 x 1.3 inches. While it stands a bit taller in the picture above than Nintendo's official Switch 2 power adapter, it's also noticeably thinner, making it much easier to slide into your bag.</p><p>Just like I did, you might be thinking about picking up a Covert Dock 3 to use with your Switch 2. However, it works just as well for your other devices with USB-C video out too. In fact, in the past, I’ve often used the Covert Dock Mini to play videos off my laptop when connected to a hotel TV. </p><p>With its higher 65W of power though, the Covert Dock 3 also works with the <a href="https://www.tomsguide.com/reviews/steam-deck-oled">Steam Deck</a>, the <a href="https://www.tomsguide.com/gaming/handheld-gaming/rog-xbox-ally-x-review">ROG Xbox Ally</a>, and virtually every other handheld gaming PC you can think of. Heck, it even works with the <a href="https://www.tomsguide.com/phones/iphones/iphone-17-pro-max-review">iPhone 17 Pro Max</a> and any other smartphone equipped with <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">DisplayPort Alt Mode over USB-C</a>.</p><div class="product"><a data-dimension112="8e1b007c-ee76-4774-b1a0-1d04aeeec40e" data-action="Deal Block" data-label="Covert Dock 3" data-dimension48="Covert Dock 3" data-dimension25="$69.99" href="https://www.genkithings.com/products/covert-dock-3" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1200px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="58k3f4ei8un9QNkRXnawQG" name="Covert Dock 3" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/58k3f4ei8un9QNkRXnawQG.png" mos="" align="middle" fullscreen="" width="1200" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.genkithings.com/products/covert-dock-3" target="_blank" rel="nofollow" data-dimension112="8e1b007c-ee76-4774-b1a0-1d04aeeec40e" data-action="Deal Block" data-label="Covert Dock 3" data-dimension48="Covert Dock 3" data-dimension25="$69.99">Covert Dock 3: $69.99 at Genki</a></strong><br>This plug-in dock lets you play your Nintendo Switch 2 on your TV with a single USB-C cable in 4K at 60Hz. There's also a USB-A port for connecting other accessories and in addition to Switch 2, it also works with your original Switch, laptop, tablet, Steam Deck and other handheld consoles.<a class="view-deal button" href="https://www.genkithings.com/products/covert-dock-3" target="_blank" rel="nofollow" data-dimension112="8e1b007c-ee76-4774-b1a0-1d04aeeec40e" data-action="Deal Block" data-label="Covert Dock 3" data-dimension48="Covert Dock 3" data-dimension25="$69.99">View Deal</a></p></div><h2 id="a-simpler-way-to-play">A simpler way to play</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4ujgfZ8PUWVqniym6LVSSN" name="Genki Covert Dock 3--2" alt="A person holding a controller playing Super Mario Galaxy using the Genki Covert Dock 3" src="https://cdn.mos.cms.futurecdn.net/4ujgfZ8PUWVqniym6LVSSN.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Don’t get me wrong, the official Nintendo Switch 2 dock is a big step up over the original dock with 4K support at 60Hz via <a href="https://www.tomsguide.com/tvs/hdmi-21-what-is-it-and-how-many-ports-do-you-really-need">HDMI 2.1</a>, active cooling, and a built-in Ethernet port. Likewise, it also helps protect your console if you have pets or kids running around. However, you do have to dock and undock your Switch 2.</p><p>With the Genki Covert Dock 3 though, I just have to plug my Switch 2 in to instantly go from handheld to TV mode. Besides traveling, it’s also easier to integrate a plug and a single cable into your entertainment center or your <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>.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8jS9YmNn53VDPBkNeLar5o" name="Genki Covert Dock 3--4" alt="A Switch 2 plugged into the Genki Covert Dock 3 and connected to a TV" src="https://cdn.mos.cms.futurecdn.net/8jS9YmNn53VDPBkNeLar5o.jpg" mos="" align="middle" fullscreen="" width="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>Here, I have it plugged into the wall behind my entertainment center with Genki’s braided USB-C cable running up the back. Speaking of the included cable, it’s one of my favorites overall and I really like how the side you plug into your Switch 2 is angled.</p><p>If you’re like me, you might be one of the only people in your household that’s upgraded to the Switch 2. While it should have been obvious to me, I didn’t realize that the Covert Dock 3 also works with the original Switch too until I started testing it out. Now, instead of having an original Switch dock and a Switch 2 dock both taking up space in my entertainment center, I just have a single cable that works with both consoles as well as my laptop, tablet and even my phone. </p><p>Although I wish the <a href="https://www.tomsguide.com/us/best-tvs,review-2224.html">best TVs</a> would add USB-C support like Hisense did with the <a href="https://www.tomsguide.com/tvs/4k-tvs/hisense-u8qg-mini-led-tv-review">U8QG</a> and now the <a href="https://www.tomsguide.com/tvs/qled-tvs/hisense-ur9-rgb-mini-led-tv-review">UR9</a>, for now, Genki’s Covert Dock 3 (along with its predecessors) is the easiest way to add a one-cable connection for your laptop to any TV, or monitor for that matter.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HoiUwJn9LeuBSYcH9jqsw6" name="TCL NXTPAPER 14--7" alt="A Nintendo Switch 2 connected to a TCL NXTPAPER 14 using the Genki Covert Dock 3 and Genki ShadowCast 3 Pro" src="https://cdn.mos.cms.futurecdn.net/HoiUwJn9LeuBSYcH9jqsw6.jpg" mos="" align="middle" fullscreen="" width="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 connectivity doesn’t stop there though. By pairing the Covert Dock 3 with Genki’s new ShadowCast 3, I was able to play my Switch 2 on the <a href="https://www.tomsguide.com/computing/android-tablets/i-thought-smaller-was-better-until-i-tried-a-massive-14-inch-tablet-that-feels-like-a-clipboard">TCL NXTPAPER 14</a>. This also works with Apple’s iPad and other tablets as well as with your laptop. While the ShadowCast 3 is designed for capturing gameplay, it’s also a great way to play your Switch 2 or other gaming handhelds on a slightly larger display.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W09PYO"></div>                            </div>                            <script src="https://kwizly.com/embed/W09PYO.js" async></script><h2 id="bring-your-own-hdmi-cable">Bring your own HDMI cable</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Ru4F5McDqdTmCuYrGEam6e" name="Genki Covert Dock 3--7" alt="The Genki Covert Dock 3 on a table with its included braided USB-C to USB-C cable" src="https://cdn.mos.cms.futurecdn.net/Ru4F5McDqdTmCuYrGEam6e.jpg" mos="" align="middle" fullscreen="" width="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 $70, the Genki Covert Dock 3 is almost half as expensive as buying another official Switch 2 dock. Add to this the fact that it isn’t limited to just Nintendo’s consoles and you have a pocketable dock for all your devices with enough power to use and charge your console or laptop at the same time. There is one thing missing from the package though, and that’s an HDMI cable.</p><p>As I said before, this is by no means a deal breaker since you can pretty much use any HDMI cable you have lying around or one already connected to your TV with the Covert Dock 3 and Switch 2. If you are in need of an HDMI 2.1 cable though, Genki does sell a braided one that perfectly matches its included USB-C cable for $20. However, you can certainly get a similarly specced cable for less online.</p><p>I’ve been waiting for the reveal of Genki’s next Covert Dock since the Switch 2 was first announced back in May of last year. Fortunately, the Covert Dock 3 has absolutely lived up to my expectations, and its new translucent design actually surpassed what I was initially anticipating from Genki this time around.</p><p>If you want to travel with your Switch 2 while leaving your official dock at home without being stuck playing in handheld mode, the Covert Dock 3 is easy to recommend. Likewise, if you just want a second dock for another TV at home or even to play your Switch 2 at your desk like I often do, I can’t recommend it enough.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/gaming/nintendo/yoshi-and-the-mysterious-book-review">I played Yoshi and the Mysterious Book and haven’t had this much fun playing a Yoshi game since the Super Nintendo</a></li><li><a href="https://www.tomsguide.com/gaming/6-nintendo-switch-styluses-for-next-level-precision">6 Nintendo Switch styluses for next-level precision</a></li><li><a href="https://www.tomsguide.com/gaming/nintendo/i-played-the-switch-2-with-ar-glasses-heres-what-its-like-to-race-mario-kart-world-on-a-135-inch-screen-in-front-of-your-face">I played the Switch 2 with AR glasses — here's what it's like to race Mario Kart World on a 135-inch screen in front of your face</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/i-gave-my-switch-2-a-major-upgrade-for-usd55-less-than-buying-another-official-dock-and-it-fits-in-my-pocket</link>
                                                                            <description>
                            <![CDATA[ Buying another official Switch 2 dock will set you back over $100 but Genki’s new Covert Dock 3 is smaller and costs almost half as much. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">P3hFcQ3ixoQDoFp8ykEs6A</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/9MXaAdRmqvXYugU7icyowG-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 21 May 2026 10:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gaming Peripherals]]></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/9MXaAdRmqvXYugU7icyowG-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Genki Covert Dock 3 in front of an official Switch 2 dock with a Tom&#039;s Guide Value Verified Savings Squad badge]]></media:description>                                                            <media:text><![CDATA[The Genki Covert Dock 3 in front of an official Switch 2 dock with a Tom&#039;s Guide Value Verified Savings Squad badge]]></media:text>
                                <media:title type="plain"><![CDATA[The Genki Covert Dock 3 in front of an official Switch 2 dock with a Tom&#039;s Guide Value Verified Savings Squad badge]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/9MXaAdRmqvXYugU7icyowG-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>One of my favorite things about the original Nintendo Switch was easily being able to bring it from room to room to play on another TV. I may have started out with just one dock, but after getting another Switch for my wife and then upgrading to the Nintendo Switch OLED, I soon had plenty of them.</p><p>Even then, though, there was just one problem with the original Switch dock: it was too big for my taste. So I did what anyone with a bit of DIY know-how would do: I <a href="https://www.tomsguide.com/opinion/i-mounted-a-mini-pc-to-the-back-of-my-monitor-for-an-even-cleaner-setup">reshelled it</a> to make the dock significantly smaller while still using Nintendo’s official hardware. You see, at the time, I was really worried about <a href="https://www.tomsguide.com/news/nintendo-switch-brick-docks">bricking my Switch</a> with a third-party dock, as I had seen countless people do so online.</p><p>Just when I thought I was stuck with the original dock, I finally tried a third-party one from Genki. Long story short, I loved the <a href="https://www.tomsguide.com/opinion/this-tiny-nintendo-switch-dock-is-a-game-changer-and-its-perfect-for-traveling">Genki Covert Dock Mini</a> and even the larger Genki Covert Dock 2 so much that I ended up with several of them. This worked perfectly, as I could use my Switch on my TV or with one of the <a href="https://www.tomsguide.com/best-picks/best-monitors">best monitors</a> no matter where I was in my house. Then I <a href="https://www.tomsguide.com/gaming/nintendo/i-was-struggling-to-set-up-my-switch-2-until-i-tried-using-mouse-mode-heres-why">upgraded to the Switch 2</a>….</p><p>Once again, I was stuck with the official Switch 2 dock. I thought about buying a second one, but at $119 at launch and now $125, I just couldn’t justify dropping that much to be able to play my Switch 2 on another display. Fortunately, Genki recently released its new Covert Dock 3.</p><p>The <a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-tried-genkis-covert-dock-3-with-the-nintendo-switch-2-and-it-beats-the-official-dock-for-one-key-reason">Covert Dock 3</a> packs in even more power at 65W — versus 45W with its predecessor — and it has a cool new two-tone translucent orange colorway to boot. However, the best part is that even though it’s slightly more expensive than the Covert Dock 2, it’s still significantly cheaper than picking up a second official Switch 2 dock.</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/b91wyp1oA3s" allowfullscreen></iframe></div></div><h2 id="dock-meets-power-adapter">Dock meets power adapter</h2><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="pqPVcosmnZfmLDK5HcXHCX" name="Genki Covert Dock 3_1" alt="An official Nintendo Switch 2 power adapter next to the Genki Covert Dock 3" src="https://cdn.mos.cms.futurecdn.net/pqPVcosmnZfmLDK5HcXHCX.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>Instead of the dongle-like appearance of other third-party Switch docks, Genki’s Covert Docks look just like a standard power adapter. There’s a retractable plug on the back, while the front features a USB-C port, an HDMI port, and a USB-A port for connecting accessories like one of the <a href="https://www.tomsguide.com/gaming/nintendo/best-nintendo-switch-2-controllers">best Nintendo Switch 2 controllers</a>. At first glance, you might easily mistake it for a regular <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>.</p><p>If you’re bringing your Switch 2 to a friend’s house or packing it for a trip, the official setup forces you to lug around both the dock and a separate power brick. With the Covert Dock 3, you just need the device itself and the included USB-C cable. Also, since the Switch 2 can't do <a href="https://www.tomsguide.com/tvs/how-important-are-tv-refresh-rates-and-how-high-do-you-really-need">high refresh rate gaming</a> in TV mode, you can pretty much use any HDMI cable you want 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:5598px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HqX5BkFjtxozc2fQQHWNhf" name="Genki Covert Dock 3_2" alt="An official Nintendo Switch 2 power adapter next to the Genki Covert Dock 3 showing the size difference between the two" src="https://cdn.mos.cms.futurecdn.net/HqX5BkFjtxozc2fQQHWNhf.jpg" mos="" align="middle" fullscreen="" width="5598" height="3149" attribution="" endorsement="" class="inline"></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 size, the Covert Dock 3 measures 2.4 x 1.7 x 1.3 inches. While it stands a bit taller in the picture above than Nintendo's official Switch 2 power adapter, it's also noticeably thinner, making it much easier to slide into your bag.</p><p>Just like I did, you might be thinking about picking up a Covert Dock 3 to use with your Switch 2. However, it works just as well for your other devices with USB-C video out too. In fact, in the past, I’ve often used the Covert Dock Mini to play videos off my laptop when connected to a hotel TV. </p><p>With its higher 65W of power though, the Covert Dock 3 also works with the <a href="https://www.tomsguide.com/reviews/steam-deck-oled">Steam Deck</a>, the <a href="https://www.tomsguide.com/gaming/handheld-gaming/rog-xbox-ally-x-review">ROG Xbox Ally</a>, and virtually every other handheld gaming PC you can think of. Heck, it even works with the <a href="https://www.tomsguide.com/phones/iphones/iphone-17-pro-max-review">iPhone 17 Pro Max</a> and any other smartphone equipped with <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">DisplayPort Alt Mode over USB-C</a>.</p><div class="product"><a data-dimension112="8e1b007c-ee76-4774-b1a0-1d04aeeec40e" data-action="Deal Block" data-label="Covert Dock 3" data-dimension48="Covert Dock 3" data-dimension25="$69.99" href="https://www.genkithings.com/products/covert-dock-3" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1200px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="58k3f4ei8un9QNkRXnawQG" name="Covert Dock 3" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/58k3f4ei8un9QNkRXnawQG.png" mos="" align="middle" fullscreen="" width="1200" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.genkithings.com/products/covert-dock-3" target="_blank" rel="nofollow" data-dimension112="8e1b007c-ee76-4774-b1a0-1d04aeeec40e" data-action="Deal Block" data-label="Covert Dock 3" data-dimension48="Covert Dock 3" data-dimension25="$69.99">Covert Dock 3: $69.99 at Genki</a></strong><br>This plug-in dock lets you play your Nintendo Switch 2 on your TV with a single USB-C cable in 4K at 60Hz. There's also a USB-A port for connecting other accessories and in addition to Switch 2, it also works with your original Switch, laptop, tablet, Steam Deck and other handheld consoles.<a class="view-deal button" href="https://www.genkithings.com/products/covert-dock-3" target="_blank" rel="nofollow" data-dimension112="8e1b007c-ee76-4774-b1a0-1d04aeeec40e" data-action="Deal Block" data-label="Covert Dock 3" data-dimension48="Covert Dock 3" data-dimension25="$69.99">View Deal</a></p></div><h2 id="a-simpler-way-to-play">A simpler way to play</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4ujgfZ8PUWVqniym6LVSSN" name="Genki Covert Dock 3--2" alt="A person holding a controller playing Super Mario Galaxy using the Genki Covert Dock 3" src="https://cdn.mos.cms.futurecdn.net/4ujgfZ8PUWVqniym6LVSSN.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Don’t get me wrong, the official Nintendo Switch 2 dock is a big step up over the original dock with 4K support at 60Hz via <a href="https://www.tomsguide.com/tvs/hdmi-21-what-is-it-and-how-many-ports-do-you-really-need">HDMI 2.1</a>, active cooling, and a built-in Ethernet port. Likewise, it also helps protect your console if you have pets or kids running around. However, you do have to dock and undock your Switch 2.</p><p>With the Genki Covert Dock 3 though, I just have to plug my Switch 2 in to instantly go from handheld to TV mode. Besides traveling, it’s also easier to integrate a plug and a single cable into your entertainment center or your <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>.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8jS9YmNn53VDPBkNeLar5o" name="Genki Covert Dock 3--4" alt="A Switch 2 plugged into the Genki Covert Dock 3 and connected to a TV" src="https://cdn.mos.cms.futurecdn.net/8jS9YmNn53VDPBkNeLar5o.jpg" mos="" align="middle" fullscreen="" width="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>Here, I have it plugged into the wall behind my entertainment center with Genki’s braided USB-C cable running up the back. Speaking of the included cable, it’s one of my favorites overall and I really like how the side you plug into your Switch 2 is angled.</p><p>If you’re like me, you might be one of the only people in your household that’s upgraded to the Switch 2. While it should have been obvious to me, I didn’t realize that the Covert Dock 3 also works with the original Switch too until I started testing it out. Now, instead of having an original Switch dock and a Switch 2 dock both taking up space in my entertainment center, I just have a single cable that works with both consoles as well as my laptop, tablet and even my phone. </p><p>Although I wish the <a href="https://www.tomsguide.com/us/best-tvs,review-2224.html">best TVs</a> would add USB-C support like Hisense did with the <a href="https://www.tomsguide.com/tvs/4k-tvs/hisense-u8qg-mini-led-tv-review">U8QG</a> and now the <a href="https://www.tomsguide.com/tvs/qled-tvs/hisense-ur9-rgb-mini-led-tv-review">UR9</a>, for now, Genki’s Covert Dock 3 (along with its predecessors) is the easiest way to add a one-cable connection for your laptop to any TV, or monitor for that matter.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HoiUwJn9LeuBSYcH9jqsw6" name="TCL NXTPAPER 14--7" alt="A Nintendo Switch 2 connected to a TCL NXTPAPER 14 using the Genki Covert Dock 3 and Genki ShadowCast 3 Pro" src="https://cdn.mos.cms.futurecdn.net/HoiUwJn9LeuBSYcH9jqsw6.jpg" mos="" align="middle" fullscreen="" width="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 connectivity doesn’t stop there though. By pairing the Covert Dock 3 with Genki’s new ShadowCast 3, I was able to play my Switch 2 on the <a href="https://www.tomsguide.com/computing/android-tablets/i-thought-smaller-was-better-until-i-tried-a-massive-14-inch-tablet-that-feels-like-a-clipboard">TCL NXTPAPER 14</a>. This also works with Apple’s iPad and other tablets as well as with your laptop. While the ShadowCast 3 is designed for capturing gameplay, it’s also a great way to play your Switch 2 or other gaming handhelds on a slightly larger display.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W09PYO"></div>                            </div>                            <script src="https://kwizly.com/embed/W09PYO.js" async></script><h2 id="bring-your-own-hdmi-cable">Bring your own HDMI cable</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Ru4F5McDqdTmCuYrGEam6e" name="Genki Covert Dock 3--7" alt="The Genki Covert Dock 3 on a table with its included braided USB-C to USB-C cable" src="https://cdn.mos.cms.futurecdn.net/Ru4F5McDqdTmCuYrGEam6e.jpg" mos="" align="middle" fullscreen="" width="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 $70, the Genki Covert Dock 3 is almost half as expensive as buying another official Switch 2 dock. Add to this the fact that it isn’t limited to just Nintendo’s consoles and you have a pocketable dock for all your devices with enough power to use and charge your console or laptop at the same time. There is one thing missing from the package though, and that’s an HDMI cable.</p><p>As I said before, this is by no means a deal breaker since you can pretty much use any HDMI cable you have lying around or one already connected to your TV with the Covert Dock 3 and Switch 2. If you are in need of an HDMI 2.1 cable though, Genki does sell a braided one that perfectly matches its included USB-C cable for $20. However, you can certainly get a similarly specced cable for less online.</p><p>I’ve been waiting for the reveal of Genki’s next Covert Dock since the Switch 2 was first announced back in May of last year. Fortunately, the Covert Dock 3 has absolutely lived up to my expectations, and its new translucent design actually surpassed what I was initially anticipating from Genki this time around.</p><p>If you want to travel with your Switch 2 while leaving your official dock at home without being stuck playing in handheld mode, the Covert Dock 3 is easy to recommend. Likewise, if you just want a second dock for another TV at home or even to play your Switch 2 at your desk like I often do, I can’t recommend it enough.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/gaming/nintendo/yoshi-and-the-mysterious-book-review">I played Yoshi and the Mysterious Book and haven’t had this much fun playing a Yoshi game since the Super Nintendo</a></li><li><a href="https://www.tomsguide.com/gaming/6-nintendo-switch-styluses-for-next-level-precision">6 Nintendo Switch styluses for next-level precision</a></li><li><a href="https://www.tomsguide.com/gaming/nintendo/i-played-the-switch-2-with-ar-glasses-heres-what-its-like-to-race-mario-kart-world-on-a-135-inch-screen-in-front-of-your-face">I played the Switch 2 with AR glasses — here's what it's like to race Mario Kart World on a 135-inch screen in front of your face</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ This modern N64 controller might be the best Switch 2 pad for retro Nintendo games ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I’ll be honest: one look at the 8BitDo 64 Controller and I was sold on it. Styled in the colors of a classic Nintendo N64 pad — albeit with the ergonomics brought up to modern day standards — the 8BitDo 64 is all about sheer mid-90s nostalgia.</p><p>The ergonomics aren’t the only update, though. The 64 uses USB-C and Bluetooth, making it compatible with PC, Switch, <a href="https://www.tomsguide.com/gaming/nintendo/nintendo-switch-2-console-review">Switch 2</a> and Android. Importantly, it’s also available in a 2.4G version that’s compatible with the original N64 (via a dongle). Meanwhile, both the Bluetooth and 2.4G versions work with the <a href="https://www.tomsguide.com/gaming/nintendo/analogue-3d-hands-on-review-nintendo-64">Analogue 3D</a> — a retro console that plays original N64 cartridges. So, yes: you can play Mario Kart 64 and GoldenEye with this thing.</p><p>If that wasn’t enough, there’s a Hall Effect joystick to eliminate stick drift, retro-feeling triggers, and a very reasonable asking price. Sure, this isn’t the <a href="https://www.tomsguide.com/best-picks/best-pc-game-controllers">best gaming controller</a> for esports, but it isn’t meant to be. It’s all about fun. And fun it is.</p><p>So, should you buy it? Keep reading my full 8BitDo 64 controller review to find out.</p><h2 class="article-body__section" id="section-8bitdo-64-review-cheat-sheet"><span>8BitDo 64 review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>A modern Bluetooth controller for N64 and classic Nintendo gaming</li><li><strong>What does it cost? </strong>It starts at <a href="https://www.amazon.com/Bluetooth-Controller-Analogue-Windows-Gaming-Console/dp/B0DKX7JZQD" target="_blank" rel="nofollow">$39</a> / <a href="https://www.amazon.co.uk/Bluetooth-Controller-Analogue-Windows-Android/dp/B00LG0I9ZQ" target="_blank" rel="nofollow">£34</a>, so not much</li><li><strong>What’s good?</strong> The nostalgia, retro gaming performance, affordability, battery life, and compatibility options (including the original N64 and Analogue 3D)</li><li><strong>What’s not? </strong>The layout can be a bit awkward, and it isn’t suitable for modern gaming</li></ul><h2 class="article-body__section" id="section-8bitdo-64-review-specs"><span>8BitDo 64 review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>From <a href="https://www.amazon.com/Bluetooth-Controller-Analogue-Windows-Gaming-Console/dp/B0DKX7JZQD" target="_blank" rel="nofollow">$39</a> / <a href="https://www.amazon.co.uk/Bluetooth-Controller-Analogue-Windows-Android/dp/B00LG0I9ZQ" target="_blank" rel="nofollow">£34</a></p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Bluetooth 5.0; 2.4G; USB-C</p></td></tr><tr><td class="firstcol " ><p><strong>Compatibility</strong></p></td><td  ><p>PC, Android, Nintendo Switch, Nintendo Switch 2, N64, Analogue 3D</p></td></tr><tr><td class="firstcol " ><p><strong>Layout</strong></p></td><td  ><p>N64</p></td></tr><tr><td class="firstcol " ><p><strong>Triggers</strong></p></td><td  ><p>Mechanical</p></td></tr><tr><td class="firstcol " ><p><strong>Thumbstick</strong></p></td><td  ><p>Octagonal, Hall Effect</p></td></tr><tr><td class="firstcol " ><p><strong>Back buttons</strong></p></td><td  ><p>No</p></td></tr><tr><td class="firstcol " ><p><strong>Rumble</strong></p></td><td  ><p>Yes</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>5.54 x 4.09 x 2.38 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>7.9 ounces</p></td></tr><tr><td class="firstcol " ><p><strong>Color</strong></p></td><td  ><p>Black; White; Nintendo gray</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>Up to 30 hours</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-8bitdo-64-review-the-ups"><span>8BitDo 64 review: The ups</span></h2><p>Ultimate retro styling (and feel), strong compatibility with appropriate devices, Hall Effect joysticks and a palatable price — what more could you want?</p><h2 id="sheer-mid-90s-nostalgia">Sheer mid-90s nostalgia...</h2><p>If you know anything about 8BitDo, you’ll know it’s no stranger to making some rather fetching gear — like the <a href="https://www.tomsguide.com/computing/peripherals/8bitdo-retro-mechanical-keyboard-review">8BitDo Retro Mechanical Keyboard</a>, which our reviewer Nikita called “the best-looking keyboard” she’d ever tested. And I agree, having owned the dashing <a href="https://www.tomsguide.com/computing/keyboards/ive-used-this-retro-style-keyboard-for-a-year-and-its-still-my-favorite-even-if-it-drives-my-colleagues-mad">Commodore 64</a> version. </p><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="DJCS8756gdaJBxnv2YLDB" name="8BitDo_64_Bluetooth_Controller_012.JPG" alt="The 8BitDo 64 Controller against a blue background" src="https://cdn.mos.cms.futurecdn.net/DJCS8756gdaJBxnv2YLDB.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Well, the 64 Controller isn’t one to buck the trend. I find it hard to believe anyone would pass up having this thing on their shelf. </p><p>The 64 is available in a few different colorways. There are plain white and black versions — common to 8BitDo pads — which are great for minimalist setups or pairing with a white or black Analogue 3D. But it’s the N64 colorway that has my heart.</p><p>From the retro gray body and contrasting block color buttons, through to the right-hand-side button layout, and onto the damped triggers, this thing hits my nostalgia spot about as hard as is possible. On picking it up, I was immediately right back there: 8 years old, cross-legged on my best friend’s floor playing Super Mario 64 and GoldenEye on his big brother’s N64.</p><h2 id="with-a-modern-day-twist">…With a modern-day 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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Bmu98qPqWPAzTvrBQ8Hy5" name="8BitDo_64_Bluetooth_Controller_011.JPG" alt="The 8BitDo 64 Controller on a wooden surface" src="https://cdn.mos.cms.futurecdn.net/Bmu98qPqWPAzTvrBQ8Hy5.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>That said, while it looks the part, the 8BitDo 64 feels and acts like a modern gamepad. Its overall profile is essentially just that of the <a href="https://www.tomsguide.com/reviews/8bitdo-ultimate-controller">8BitDo Ultimate Controller</a>, which is a good thing.</p><p>The 64 is super comfortable in the hand, with chunky grips that make for a modern and more comfortable experience versus a triple-pronged original N64 pad (although it isn’t perfect, as I’ll cover later). It’s nice and lightweight too, at just 7.9 ounces, so it won’t be fatiguing to hold over long sessions.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/ZeQsoEj5X2oF3HZcgBa5YL.jpg" alt="A screenshot of the 8BitDo 64 being updated/calibrated in the companion software." /><figcaption>As a modern controller, the 64 comes with companion software for updates and calibration of the Hall Effect joystick.<small role="credit">8BitDo</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/iDinmWnSYBHLAJDmMT4aXL.jpg" alt="A screenshot of the 8BitDo 64 being updated/calibrated in the companion software." /><figcaption>As a modern controller, the 64 comes with companion software for updates and calibration of the Hall Effect joystick.<small role="credit">8BitDo</small></figcaption></figure></figure><p>Obviously, there are other modern, quality-of-life features, too. It’s wireless or wired, for a start, so no need to sit close to the screen like I did as a kid. You can pass the pad about from the luxury of your far-away sofa without the wire knocking over that glass of juice, or getting tangled with another pad. </p><p>The 64 also uses a Hall Effect joystick, to eliminate stick drift over time, giving you peace of mind about longevity. And you can update firmware using the companion software.</p><h2 id="appropriate-compatibility">Appropriate compatibility</h2><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="r59e5Gh8i8Gz5SekrZkrQ" name="8BitDo_64_Bluetooth_Controller_019.JPG" alt="The 8BitDo 64 Controller against a blue background" src="https://cdn.mos.cms.futurecdn.net/r59e5Gh8i8Gz5SekrZkrQ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Huh? “Appropriate compatibility” — what the hell does that mean? It means exactly what it looks like. The 8BitDo 64 isn’t gonna work with your <a href="https://www.tomsguide.com/reviews/ps5">PS5</a> or Xbox, but why should it be? This is all about retro N64 gaming.</p><p>It <em>is</em> compatible, on the other hand, with the devices it <em>should</em> work with. The Nintendo Switch 2 and Switch, of course, as well as Android devices and the Analogue 3D console that runs N64 cartridges. There’s also PC as a catch-all for any folk who, like me, don’t game on any of the other supported devices (PCMR!). Importantly, if you buy the 2.4G version, you’ll lose compatibility with Switch and Android, but gain compatibility with the original N64 via a Wi-Fi dongle. Neat!</p><h2 id="awesome-for-retro-gaming">Awesome for retro gaming</h2><p>The 8BitDo 64 is awesome for retro gaming. Obviously, there’s the N64 control layout, giving you that classic D-pad / single stick feel to movement. It was so nostalgic to be playing in this format, and took a while to de-configure my brain and remember that A/B were closer to the middle, but I got 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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="x5yAMBxbtLkU2B2yNAdHFo" name="8BitDo_64_Bluetooth_Controller_004.JPG" alt="The 8BitDo 64 Controller against a blue background" src="https://cdn.mos.cms.futurecdn.net/x5yAMBxbtLkU2B2yNAdHFo.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The analog stick has an octagonal housing, allowing you to lock precisely into a direction — this is key to accuracy in older games not designed to cope with a true 360° stick. A nice touch is the addition of a metal collar around the stick stem, which stops the angled octagonal edges damaging the stem over time. As I mentioned above, the stick is Hall Effect, making it feel extremely quick and responsive.</p><p>I experienced no latency when gaming, even over Bluetooth, which kinda figures. The kind of games you’ll be playing with this pad aren’t the fastest-paced titles that demand the sharpest inputs. They’re older games with less precise controls. Still, it’s nice to know there’s the option for lower latency wired or 2.4G connectivity if needed.</p><h4 id="pc-doom-64">PC — Doom 64</h4><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="Ef7nQaawTWFLMAwpWD9MG" name="8BitDo_64_Bluetooth_Controller_017.JPG" alt="The 8BitDo 64 Controller against a blue background" src="https://cdn.mos.cms.futurecdn.net/Ef7nQaawTWFLMAwpWD9MG.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I started my testing on <em>Doom 64</em>. As I’ll cover below, I found it a bit annoying having to stretch my right thumb over the controller to hit the D-pad for camera control. But other than that, I had a great time.</p><p>I especially enjoyed gunplay with the 8BitDo 64. The triggers are damped and kinda mushy-feeling compared to modern-vibe controllers, like my <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-wolverine-v3-pro-review">Razer Wolverine V3 Pro</a> ($199) with its snappy hair triggers, and my <a href="https://www.tomsguide.com/gaming/gaming-peripherals/gamesir-kaleid-controller-review">Gamesir Kaleid</a> ($46) with its super smooth Hall Effect triggers. However, the 64 triggers have a nice thump to them, making each gunshot feel extremely satisfying — and again, this added to the retro 90s vibe.</p><h4 id="switch-2-mario-kart-goldeneye-star-fox">Switch 2 — Mario Kart, GoldenEye, Star Fox</h4><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="C43LppNHhQ5ymXyY7xdQBo" name="8BitDo_64_Bluetooth_Controller_005.JPG" alt="The 8BitDo 64 Controller against a blue background" src="https://cdn.mos.cms.futurecdn.net/C43LppNHhQ5ymXyY7xdQBo.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I then played some classic N64 games on the Switch 2. First, I played Mario Kart 64, which is the game I most enjoyed on the 8BitDo pad because it only requires the joystick for movement. I loved the octagonal groves here, which made it easy to lock in directions. Just like the OG N64 pad, the C buttons are right next to A and B, so you can quickly knock the C-down to launch powerups without taking your thumb off the gas.</p><p>I then played GoldenEye, which was even trickier to control than the OG game, as the Hall Effect stick is super sensitive — this made aiming with the reticule quite tricky. But I still had lots of fun on 007. I then finished off with some Star Fox, which was super easy to get up to speed with on the 8BitDo, and made good use of the 64’s Turbo function to cut down on thumb strain. </p><p>In all these games, Z (R2 on a modern pad) launched the game menu — with my brain programmed to modern gamepads where Z (R2) would be Fire, I had to do some reprogramming to stop hitting this and pausing my games. But you could just remap this in the controller button layout via the menu.</p><h2 id="decent-battery-life">Decent battery life</h2><p>The 8BitDo's rated battery life is (up to) 36 hours from its 1,000mAh cell. That’s a good amount of playtime, even if you’re gaming for 8 hour stints. It puts the 20 hours of my much pricier  Razer Wolverine V3 Pro to shame. </p><p>I haven't needed to charge the 8BitDo gamepad at all while testing, from around 8-12 hours of use (a large chunk of which was spent on Doom 64 — which I can't get enough of).</p><h2 id="affordable-price">Affordable price</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VUZxKuNBmGB9Gb7xV6Ls4" name="8BitDo_64_Bluetooth_Controller_010.JPG" alt="The 8BitDo 64 Controller against a blue background" src="https://cdn.mos.cms.futurecdn.net/VUZxKuNBmGB9Gb7xV6Ls4.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Best of all, the 8BitDo 64 is reasonably priced, at <a href="https://www.amazon.com/Bluetooth-Controller-Analogue-Windows-Gaming-Console/dp/B0DKX7JZQD" target="_blank" rel="nofollow">$39 from Amazon for the black/white versions</a> and the <a href="https://www.amazon.com/8BitDo-Controller-Gaming-Console/dp/B0FF4XW3J8" target="_blank" rel="nofollow">2.4G gray version</a>, or <a href="https://www.amazon.com/Bluetooth-Controller-Analogue-Windows-Gaming-Console/dp/B00LG0I9ZQ/" target="_blank" rel="nofollow">$44 for the Bluetooth version</a>. In the U.K., all versions cost <a href="https://www.amazon.co.uk/Bluetooth-Controller-Analogue-Windows-Android/dp/B00LG0I9ZQ" target="_blank" rel="nofollow">£34 at Amazon</a>. Given the decent build quality and how much fun this pad is for retro gaming, I’d say it’s a steal. And hey, even if you don’t use it that much, at least you won't have dropped big bucks.</p><h2 class="article-body__section" id="section-8bitdo-64-review-the-downs"><span>8BitDo 64 review: The downs</span></h2><p>The 8BitDo 64’s flaws are very few, and fairly minor. It isn’t the best for smaller hands, thanks to 8BitDo jerry-rigging the triple-pronged OG N64 layout into a conventional modern controller design. Plus it’s no good for non-retro gaming.</p><h2 id="won-t-be-good-for-smaller-hands">Won’t be good for smaller hands</h2><p>The original N64 pad wasn’t perfect, and seems very strangely laid out to modern sensibilities. Its layout served an important purpose at a time of emerging 3D gaming, and was the best Nintendo could do at the time… but it wasn’t perfect. You had to shift your hand between the prongs to play certain 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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="N2VnNSBsaBRUpj323VwuPo" name="8BitDo_64_Bluetooth_Controller_007.JPG" alt="The 8BitDo 64 Controller against a blue background" src="https://cdn.mos.cms.futurecdn.net/N2VnNSBsaBRUpj323VwuPo.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Don’t get me wrong, I love the N64 gamepad, it’s just a quirk of the controller, and symptomatic of where 3D gaming was at the time.</p><p>The 8BitDo 64, while a big improvement on the N64 pad’s layout in many games, is actually trickier to use than the OG N64 controller in games that use the D-Pad rather than C buttons for camera control. With the three-pronged N64 pad you’d shift your hand between the prongs, so one thumb was on the D-Pad and the other on the joystick.</p><p>The 8BitDo 64 has no middle prong and the D-Pad and joystick are next to one another. That means you need to stretch your hand across the pad to control the camera. In Doom 64, this was a bit annoying. I got by, as I have larger hands, but if you’ve got smaller mitts, you may find this problematic.</p><h2 id="no-good-for-non-retro-gaming">No good for non-retro 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:1622px;"><p class="vanilla-image-block" style="padding-top:66.58%;"><img id="p7r53DfhvLm8ddLm4tSGJ" name="8BitDo_64_Bluetooth_Controller_013.JPG" alt="The 8BitDo 64 Controller against a blue background" src="https://cdn.mos.cms.futurecdn.net/p7r53DfhvLm8ddLm4tSGJ.jpg" mos="" align="middle" fullscreen="" width="1622" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>This isn’t really a flaw, as it’s by design. However, with the octagonal joystick and no second stick, the 8BitDo 64 is no good for modern gaming. Unless you only play retro Nintendo games, the 64 is always going to be a supplemental purchase to your main pad — thankfully, it’s cheap enough to make that a non-issue.</p><p>If you instead need a single all-rounder pad, look at something like 8BitDo Ultimate or <a href="https://www.tomsguide.com/gaming/gaming-peripherals/gamesir-super-nova-review">GameSir Super Nova</a> ($49) instead. </p><h2 class="article-body__section" id="section-8bitdo-64-review-verdict"><span>8BitDo 64 review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="KxG23LbDsJq2yZj6vj8zGo" name="8BitDo_64_Bluetooth_Controller_006.JPG" alt="The 8BitDo 64 Controller against a blue background" src="https://cdn.mos.cms.futurecdn.net/KxG23LbDsJq2yZj6vj8zGo.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I love this little pad. It isn’t perfect, sure. It’s limited in its scope to retro gaming only, which will make this a secondary controller purchase for many, and if it was pricey, that would be a problem. But it isn’t. Meanwhile, jerry-rigging the inherently flawed N64 controls into a modern form has made the controls a little frustrating at times, but has dramatically improved the ergonomic experience to make up for it.</p><p>Those are really the only things I can say against the 8BitDo 64, and as you can see, my qualms were both heavily caveated. It’s a great supplementary pad to heighten the experience of playing retro games, by bringing the experience close to what was originally intended. It’s cute-looking, affordable, has decent battery life, and decent compatibility — especially with the N64 and Analogue 3D. What’s not to love?</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/8bitdo-64-review</link>
                                                                            <description>
                            <![CDATA[ The 8BitDo 64 is a modern reincarnation of the original N64 gamepad, and I have very little to say against it. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">r8yZa7HzSrbdpRjSyD8tea</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/HhVDA7xo6Whry3xcJC846o-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 21 May 2026 09:43:51 +0000</pubDate>                                                                                                                                <updated>Tue, 09 Jun 2026 10:32:37 +0000</updated>
                                                                                                                                            <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                <author><![CDATA[ peter.wolinski@futurenet.com (Peter Wolinski) ]]></author>                    <dc:creator><![CDATA[ Peter Wolinski ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/stgPfXWY7ukw8J8rfC7vjg.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Peter is a Senior Editor at Tom&#039;s Guide, heading up the site&#039;s Reviews team and Cameras section. Having built gaming PCs since he was 10 (that&#039;s a while ago now) he&#039;s a bit of a nerd about components and hardware. He&#039;s also been an iPhone user since the classic iPhone 4, and a Mac user for well over a decade. Experienced in using and testing all kinds of technology — from phones through to tablets, computers, games consoles, cameras and smart home tech — helping people find the best tech for them (at the best prices) is what Peter does best. A photographer since he bought his first camera (a Fujifilm) in 2015, Peter was previously an Editor for Canon-Europe.com. He then edited the Cameras and How To sections of Tom&#039;s Guide. When he&#039;s not crafting helpful, in-depth reviews, Peter can usually be found out and about honing his architectural photography skills, riding his motorcycle around Welsh mountain roads, telling everyone about his two greyhounds, squeezing a few extra FPS out of PC games or perfecting his espresso shots.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/HhVDA7xo6Whry3xcJC846o-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The 8BitDo 64 Controller against a blue background]]></media:description>                                                            <media:text><![CDATA[The 8BitDo 64 Controller against a blue background]]></media:text>
                                <media:title type="plain"><![CDATA[The 8BitDo 64 Controller against a blue background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/HhVDA7xo6Whry3xcJC846o-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I’ll be honest: one look at the 8BitDo 64 Controller and I was sold on it. Styled in the colors of a classic Nintendo N64 pad — albeit with the ergonomics brought up to modern day standards — the 8BitDo 64 is all about sheer mid-90s nostalgia.</p><p>The ergonomics aren’t the only update, though. The 64 uses USB-C and Bluetooth, making it compatible with PC, Switch, <a href="https://www.tomsguide.com/gaming/nintendo/nintendo-switch-2-console-review">Switch 2</a> and Android. Importantly, it’s also available in a 2.4G version that’s compatible with the original N64 (via a dongle). Meanwhile, both the Bluetooth and 2.4G versions work with the <a href="https://www.tomsguide.com/gaming/nintendo/analogue-3d-hands-on-review-nintendo-64">Analogue 3D</a> — a retro console that plays original N64 cartridges. So, yes: you can play Mario Kart 64 and GoldenEye with this thing.</p><p>If that wasn’t enough, there’s a Hall Effect joystick to eliminate stick drift, retro-feeling triggers, and a very reasonable asking price. Sure, this isn’t the <a href="https://www.tomsguide.com/best-picks/best-pc-game-controllers">best gaming controller</a> for esports, but it isn’t meant to be. It’s all about fun. And fun it is.</p><p>So, should you buy it? Keep reading my full 8BitDo 64 controller review to find out.</p><h2 class="article-body__section" id="section-8bitdo-64-review-cheat-sheet"><span>8BitDo 64 review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>A modern Bluetooth controller for N64 and classic Nintendo gaming</li><li><strong>What does it cost? </strong>It starts at <a href="https://www.amazon.com/Bluetooth-Controller-Analogue-Windows-Gaming-Console/dp/B0DKX7JZQD" target="_blank" rel="nofollow">$39</a> / <a href="https://www.amazon.co.uk/Bluetooth-Controller-Analogue-Windows-Android/dp/B00LG0I9ZQ" target="_blank" rel="nofollow">£34</a>, so not much</li><li><strong>What’s good?</strong> The nostalgia, retro gaming performance, affordability, battery life, and compatibility options (including the original N64 and Analogue 3D)</li><li><strong>What’s not? </strong>The layout can be a bit awkward, and it isn’t suitable for modern gaming</li></ul><h2 class="article-body__section" id="section-8bitdo-64-review-specs"><span>8BitDo 64 review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>From <a href="https://www.amazon.com/Bluetooth-Controller-Analogue-Windows-Gaming-Console/dp/B0DKX7JZQD" target="_blank" rel="nofollow">$39</a> / <a href="https://www.amazon.co.uk/Bluetooth-Controller-Analogue-Windows-Android/dp/B00LG0I9ZQ" target="_blank" rel="nofollow">£34</a></p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Bluetooth 5.0; 2.4G; USB-C</p></td></tr><tr><td class="firstcol " ><p><strong>Compatibility</strong></p></td><td  ><p>PC, Android, Nintendo Switch, Nintendo Switch 2, N64, Analogue 3D</p></td></tr><tr><td class="firstcol " ><p><strong>Layout</strong></p></td><td  ><p>N64</p></td></tr><tr><td class="firstcol " ><p><strong>Triggers</strong></p></td><td  ><p>Mechanical</p></td></tr><tr><td class="firstcol " ><p><strong>Thumbstick</strong></p></td><td  ><p>Octagonal, Hall Effect</p></td></tr><tr><td class="firstcol " ><p><strong>Back buttons</strong></p></td><td  ><p>No</p></td></tr><tr><td class="firstcol " ><p><strong>Rumble</strong></p></td><td  ><p>Yes</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>5.54 x 4.09 x 2.38 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>7.9 ounces</p></td></tr><tr><td class="firstcol " ><p><strong>Color</strong></p></td><td  ><p>Black; White; Nintendo gray</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>Up to 30 hours</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-8bitdo-64-review-the-ups"><span>8BitDo 64 review: The ups</span></h2><p>Ultimate retro styling (and feel), strong compatibility with appropriate devices, Hall Effect joysticks and a palatable price — what more could you want?</p><h2 id="sheer-mid-90s-nostalgia">Sheer mid-90s nostalgia...</h2><p>If you know anything about 8BitDo, you’ll know it’s no stranger to making some rather fetching gear — like the <a href="https://www.tomsguide.com/computing/peripherals/8bitdo-retro-mechanical-keyboard-review">8BitDo Retro Mechanical Keyboard</a>, which our reviewer Nikita called “the best-looking keyboard” she’d ever tested. And I agree, having owned the dashing <a href="https://www.tomsguide.com/computing/keyboards/ive-used-this-retro-style-keyboard-for-a-year-and-its-still-my-favorite-even-if-it-drives-my-colleagues-mad">Commodore 64</a> version. </p><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="DJCS8756gdaJBxnv2YLDB" name="8BitDo_64_Bluetooth_Controller_012.JPG" alt="The 8BitDo 64 Controller against a blue background" src="https://cdn.mos.cms.futurecdn.net/DJCS8756gdaJBxnv2YLDB.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Well, the 64 Controller isn’t one to buck the trend. I find it hard to believe anyone would pass up having this thing on their shelf. </p><p>The 64 is available in a few different colorways. There are plain white and black versions — common to 8BitDo pads — which are great for minimalist setups or pairing with a white or black Analogue 3D. But it’s the N64 colorway that has my heart.</p><p>From the retro gray body and contrasting block color buttons, through to the right-hand-side button layout, and onto the damped triggers, this thing hits my nostalgia spot about as hard as is possible. On picking it up, I was immediately right back there: 8 years old, cross-legged on my best friend’s floor playing Super Mario 64 and GoldenEye on his big brother’s N64.</p><h2 id="with-a-modern-day-twist">…With a modern-day 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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Bmu98qPqWPAzTvrBQ8Hy5" name="8BitDo_64_Bluetooth_Controller_011.JPG" alt="The 8BitDo 64 Controller on a wooden surface" src="https://cdn.mos.cms.futurecdn.net/Bmu98qPqWPAzTvrBQ8Hy5.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>That said, while it looks the part, the 8BitDo 64 feels and acts like a modern gamepad. Its overall profile is essentially just that of the <a href="https://www.tomsguide.com/reviews/8bitdo-ultimate-controller">8BitDo Ultimate Controller</a>, which is a good thing.</p><p>The 64 is super comfortable in the hand, with chunky grips that make for a modern and more comfortable experience versus a triple-pronged original N64 pad (although it isn’t perfect, as I’ll cover later). It’s nice and lightweight too, at just 7.9 ounces, so it won’t be fatiguing to hold over long sessions.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/ZeQsoEj5X2oF3HZcgBa5YL.jpg" alt="A screenshot of the 8BitDo 64 being updated/calibrated in the companion software." /><figcaption>As a modern controller, the 64 comes with companion software for updates and calibration of the Hall Effect joystick.<small role="credit">8BitDo</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/iDinmWnSYBHLAJDmMT4aXL.jpg" alt="A screenshot of the 8BitDo 64 being updated/calibrated in the companion software." /><figcaption>As a modern controller, the 64 comes with companion software for updates and calibration of the Hall Effect joystick.<small role="credit">8BitDo</small></figcaption></figure></figure><p>Obviously, there are other modern, quality-of-life features, too. It’s wireless or wired, for a start, so no need to sit close to the screen like I did as a kid. You can pass the pad about from the luxury of your far-away sofa without the wire knocking over that glass of juice, or getting tangled with another pad. </p><p>The 64 also uses a Hall Effect joystick, to eliminate stick drift over time, giving you peace of mind about longevity. And you can update firmware using the companion software.</p><h2 id="appropriate-compatibility">Appropriate compatibility</h2><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="r59e5Gh8i8Gz5SekrZkrQ" name="8BitDo_64_Bluetooth_Controller_019.JPG" alt="The 8BitDo 64 Controller against a blue background" src="https://cdn.mos.cms.futurecdn.net/r59e5Gh8i8Gz5SekrZkrQ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Huh? “Appropriate compatibility” — what the hell does that mean? It means exactly what it looks like. The 8BitDo 64 isn’t gonna work with your <a href="https://www.tomsguide.com/reviews/ps5">PS5</a> or Xbox, but why should it be? This is all about retro N64 gaming.</p><p>It <em>is</em> compatible, on the other hand, with the devices it <em>should</em> work with. The Nintendo Switch 2 and Switch, of course, as well as Android devices and the Analogue 3D console that runs N64 cartridges. There’s also PC as a catch-all for any folk who, like me, don’t game on any of the other supported devices (PCMR!). Importantly, if you buy the 2.4G version, you’ll lose compatibility with Switch and Android, but gain compatibility with the original N64 via a Wi-Fi dongle. Neat!</p><h2 id="awesome-for-retro-gaming">Awesome for retro gaming</h2><p>The 8BitDo 64 is awesome for retro gaming. Obviously, there’s the N64 control layout, giving you that classic D-pad / single stick feel to movement. It was so nostalgic to be playing in this format, and took a while to de-configure my brain and remember that A/B were closer to the middle, but I got 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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="x5yAMBxbtLkU2B2yNAdHFo" name="8BitDo_64_Bluetooth_Controller_004.JPG" alt="The 8BitDo 64 Controller against a blue background" src="https://cdn.mos.cms.futurecdn.net/x5yAMBxbtLkU2B2yNAdHFo.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The analog stick has an octagonal housing, allowing you to lock precisely into a direction — this is key to accuracy in older games not designed to cope with a true 360° stick. A nice touch is the addition of a metal collar around the stick stem, which stops the angled octagonal edges damaging the stem over time. As I mentioned above, the stick is Hall Effect, making it feel extremely quick and responsive.</p><p>I experienced no latency when gaming, even over Bluetooth, which kinda figures. The kind of games you’ll be playing with this pad aren’t the fastest-paced titles that demand the sharpest inputs. They’re older games with less precise controls. Still, it’s nice to know there’s the option for lower latency wired or 2.4G connectivity if needed.</p><h4 id="pc-doom-64">PC — Doom 64</h4><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="Ef7nQaawTWFLMAwpWD9MG" name="8BitDo_64_Bluetooth_Controller_017.JPG" alt="The 8BitDo 64 Controller against a blue background" src="https://cdn.mos.cms.futurecdn.net/Ef7nQaawTWFLMAwpWD9MG.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I started my testing on <em>Doom 64</em>. As I’ll cover below, I found it a bit annoying having to stretch my right thumb over the controller to hit the D-pad for camera control. But other than that, I had a great time.</p><p>I especially enjoyed gunplay with the 8BitDo 64. The triggers are damped and kinda mushy-feeling compared to modern-vibe controllers, like my <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-wolverine-v3-pro-review">Razer Wolverine V3 Pro</a> ($199) with its snappy hair triggers, and my <a href="https://www.tomsguide.com/gaming/gaming-peripherals/gamesir-kaleid-controller-review">Gamesir Kaleid</a> ($46) with its super smooth Hall Effect triggers. However, the 64 triggers have a nice thump to them, making each gunshot feel extremely satisfying — and again, this added to the retro 90s vibe.</p><h4 id="switch-2-mario-kart-goldeneye-star-fox">Switch 2 — Mario Kart, GoldenEye, Star Fox</h4><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="C43LppNHhQ5ymXyY7xdQBo" name="8BitDo_64_Bluetooth_Controller_005.JPG" alt="The 8BitDo 64 Controller against a blue background" src="https://cdn.mos.cms.futurecdn.net/C43LppNHhQ5ymXyY7xdQBo.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I then played some classic N64 games on the Switch 2. First, I played Mario Kart 64, which is the game I most enjoyed on the 8BitDo pad because it only requires the joystick for movement. I loved the octagonal groves here, which made it easy to lock in directions. Just like the OG N64 pad, the C buttons are right next to A and B, so you can quickly knock the C-down to launch powerups without taking your thumb off the gas.</p><p>I then played GoldenEye, which was even trickier to control than the OG game, as the Hall Effect stick is super sensitive — this made aiming with the reticule quite tricky. But I still had lots of fun on 007. I then finished off with some Star Fox, which was super easy to get up to speed with on the 8BitDo, and made good use of the 64’s Turbo function to cut down on thumb strain. </p><p>In all these games, Z (R2 on a modern pad) launched the game menu — with my brain programmed to modern gamepads where Z (R2) would be Fire, I had to do some reprogramming to stop hitting this and pausing my games. But you could just remap this in the controller button layout via the menu.</p><h2 id="decent-battery-life">Decent battery life</h2><p>The 8BitDo's rated battery life is (up to) 36 hours from its 1,000mAh cell. That’s a good amount of playtime, even if you’re gaming for 8 hour stints. It puts the 20 hours of my much pricier  Razer Wolverine V3 Pro to shame. </p><p>I haven't needed to charge the 8BitDo gamepad at all while testing, from around 8-12 hours of use (a large chunk of which was spent on Doom 64 — which I can't get enough of).</p><h2 id="affordable-price">Affordable price</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VUZxKuNBmGB9Gb7xV6Ls4" name="8BitDo_64_Bluetooth_Controller_010.JPG" alt="The 8BitDo 64 Controller against a blue background" src="https://cdn.mos.cms.futurecdn.net/VUZxKuNBmGB9Gb7xV6Ls4.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Best of all, the 8BitDo 64 is reasonably priced, at <a href="https://www.amazon.com/Bluetooth-Controller-Analogue-Windows-Gaming-Console/dp/B0DKX7JZQD" target="_blank" rel="nofollow">$39 from Amazon for the black/white versions</a> and the <a href="https://www.amazon.com/8BitDo-Controller-Gaming-Console/dp/B0FF4XW3J8" target="_blank" rel="nofollow">2.4G gray version</a>, or <a href="https://www.amazon.com/Bluetooth-Controller-Analogue-Windows-Gaming-Console/dp/B00LG0I9ZQ/" target="_blank" rel="nofollow">$44 for the Bluetooth version</a>. In the U.K., all versions cost <a href="https://www.amazon.co.uk/Bluetooth-Controller-Analogue-Windows-Android/dp/B00LG0I9ZQ" target="_blank" rel="nofollow">£34 at Amazon</a>. Given the decent build quality and how much fun this pad is for retro gaming, I’d say it’s a steal. And hey, even if you don’t use it that much, at least you won't have dropped big bucks.</p><h2 class="article-body__section" id="section-8bitdo-64-review-the-downs"><span>8BitDo 64 review: The downs</span></h2><p>The 8BitDo 64’s flaws are very few, and fairly minor. It isn’t the best for smaller hands, thanks to 8BitDo jerry-rigging the triple-pronged OG N64 layout into a conventional modern controller design. Plus it’s no good for non-retro gaming.</p><h2 id="won-t-be-good-for-smaller-hands">Won’t be good for smaller hands</h2><p>The original N64 pad wasn’t perfect, and seems very strangely laid out to modern sensibilities. Its layout served an important purpose at a time of emerging 3D gaming, and was the best Nintendo could do at the time… but it wasn’t perfect. You had to shift your hand between the prongs to play certain 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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="N2VnNSBsaBRUpj323VwuPo" name="8BitDo_64_Bluetooth_Controller_007.JPG" alt="The 8BitDo 64 Controller against a blue background" src="https://cdn.mos.cms.futurecdn.net/N2VnNSBsaBRUpj323VwuPo.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Don’t get me wrong, I love the N64 gamepad, it’s just a quirk of the controller, and symptomatic of where 3D gaming was at the time.</p><p>The 8BitDo 64, while a big improvement on the N64 pad’s layout in many games, is actually trickier to use than the OG N64 controller in games that use the D-Pad rather than C buttons for camera control. With the three-pronged N64 pad you’d shift your hand between the prongs, so one thumb was on the D-Pad and the other on the joystick.</p><p>The 8BitDo 64 has no middle prong and the D-Pad and joystick are next to one another. That means you need to stretch your hand across the pad to control the camera. In Doom 64, this was a bit annoying. I got by, as I have larger hands, but if you’ve got smaller mitts, you may find this problematic.</p><h2 id="no-good-for-non-retro-gaming">No good for non-retro 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:1622px;"><p class="vanilla-image-block" style="padding-top:66.58%;"><img id="p7r53DfhvLm8ddLm4tSGJ" name="8BitDo_64_Bluetooth_Controller_013.JPG" alt="The 8BitDo 64 Controller against a blue background" src="https://cdn.mos.cms.futurecdn.net/p7r53DfhvLm8ddLm4tSGJ.jpg" mos="" align="middle" fullscreen="" width="1622" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>This isn’t really a flaw, as it’s by design. However, with the octagonal joystick and no second stick, the 8BitDo 64 is no good for modern gaming. Unless you only play retro Nintendo games, the 64 is always going to be a supplemental purchase to your main pad — thankfully, it’s cheap enough to make that a non-issue.</p><p>If you instead need a single all-rounder pad, look at something like 8BitDo Ultimate or <a href="https://www.tomsguide.com/gaming/gaming-peripherals/gamesir-super-nova-review">GameSir Super Nova</a> ($49) instead. </p><h2 class="article-body__section" id="section-8bitdo-64-review-verdict"><span>8BitDo 64 review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="KxG23LbDsJq2yZj6vj8zGo" name="8BitDo_64_Bluetooth_Controller_006.JPG" alt="The 8BitDo 64 Controller against a blue background" src="https://cdn.mos.cms.futurecdn.net/KxG23LbDsJq2yZj6vj8zGo.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I love this little pad. It isn’t perfect, sure. It’s limited in its scope to retro gaming only, which will make this a secondary controller purchase for many, and if it was pricey, that would be a problem. But it isn’t. Meanwhile, jerry-rigging the inherently flawed N64 controls into a modern form has made the controls a little frustrating at times, but has dramatically improved the ergonomic experience to make up for it.</p><p>Those are really the only things I can say against the 8BitDo 64, and as you can see, my qualms were both heavily caveated. It’s a great supplementary pad to heighten the experience of playing retro games, by bringing the experience close to what was originally intended. It’s cute-looking, affordable, has decent battery life, and decent compatibility — especially with the N64 and Analogue 3D. What’s not to love?</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Asus has created a controller that blows the Xbox Elite Series 2 out of the water: Here’s why I think the ROG Raikiri II is the perfect gamepad ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Gaming is one of my favorite hobbies. When I’m not working, you’ll usually find me sinking hours into my most-loved RPGs. I am, then, very lucky that I get to play video games for a living. Well, that’s a bit of an exaggeration — I test many gaming peripherals, including the <a href="https://www.tomsguide.com/best-picks/best-pc-game-controllers">best controllers</a>, which means I get to play video games and call it work.</p><p>The most recent controller I’ve tested has, no lie, blown me away. They honestly don’t get better than this. The <a href="https://www.tomsguide.com/gaming/gaming-peripherals/asus-rog-raikiri-ii-review">Asus ROG Raikiri II</a> is a powerful gamepad for Microsoft’s consoles, and it beats the first-party Xbox Elite Series 2 in every which way.</p><div class="product"><a data-dimension112="e55bc805-bb5f-4364-bc45-b233aeefa8fc" data-action="Deal Block" data-label="ROG Raikiri II" data-dimension48="ROG Raikiri II" data-dimension25="$149" href="https://www.amazon.com/ASUS-ROG-II-Wireless-Controller/dp/B0G36827DR/" 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:69.40%;"><img id="LFmDmTeecmqNP5URYzDbK5" name="Raikiri-II-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/LFmDmTeecmqNP5URYzDbK5.jpg" mos="" align="middle" fullscreen="" width="1500" height="1041" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Asus ROG Raikiri II is the best third-party Xbox and PC controller you can buy right now, period. Packing impressive TMR sticks and triggers that let you precisely fine-tune your movements and give you a competitive advantage, the Raikiri II boasts peerless gaming performance. Long battery life, extensive customization, and 1,000Hz polling set it apart from the competition, and the ergonomic design ensures all-day comfort.<a class="view-deal button" href="https://www.amazon.com/ASUS-ROG-II-Wireless-Controller/dp/B0G36827DR/" target="_blank" rel="nofollow" data-dimension112="e55bc805-bb5f-4364-bc45-b233aeefa8fc" data-action="Deal Block" data-label="ROG Raikiri II" data-dimension48="ROG Raikiri II" data-dimension25="$149">View Deal</a></p></div><p>It’s comfortable and packs performance in spades, and with extensive customization to boot, it gives you the advantage sought after by competitive players. Why do I say it’s better than the Xbox Elite 2? That’s what I’m here to talk about, so you’ll have to continue reading. </p><p>Spoiler alert: it might have something to do with the Raikiri II’s TMR thumbsticks and triggers…</p><h2 id="tmr-stands-for-this-mechanic-rocks">‘TMR’ stands for ‘This Mechanic Rocks’</h2><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="X9pNTRiR4VryF3TKwoMLqS" name="Asus_ROG_RAIKIRI_II_ 9.JPG" alt="A black Asus ROG Raikiri II Xbox and PC controller" src="https://cdn.mos.cms.futurecdn.net/X9pNTRiR4VryF3TKwoMLqS.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>One of the things that stops me from recommending the first-party Xbox Elite Series 2 outright is its omission of Hall Effect or TMR sticks. The Elite 2 uses traditional analog sticks, although its triggers feature Hall Effect sensors. The downside of analog sticks is that they’re susceptible to stick drift — and as any gamer will know, stick drift is truly awful. To ensure longevity, many third-party manufacturers now fit Hall Effect or TMR sensors into their sticks.</p><p>Because the Asus ROG Raikiri II packs TMR tech into its sticks as well as triggers, it upstages the Elite 2 without breaking a sweat. TMR is an up-and-coming technology, and not many controllers feature it yet. <a href="https://www.tomsguide.com/gaming/gaming-peripherals/so-long-hall-effect-im-only-using-controllers-with-tmr-sensors-from-now-on">TMR stands for Tunnel Magneto Resistance</a>, and it uses weak electromagnetic waves rather than strong ones, which means that minute adjustments and movements are picked up by the sensor. It can get very technical but all you need to know is that it essentially gives you a massive competitive advantage — something analog sticks simply cannot 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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zpB2g25ihkBRKKp4rLEpaT" name="Asus_ROG_RAIKIRI_II_ 10.JPG" alt="A black Asus ROG Raikiri II Xbox and PC controller" src="https://cdn.mos.cms.futurecdn.net/zpB2g25ihkBRKKp4rLEpaT.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 Raikiri II goes a step further by using TMR in its triggers instead of Hall Effect, and becomes the first controller (at the time of writing) to do so. The triggers’ sensitivity can be changed between short clicky presses (great for FPS titles) and long presses (excellent for racing games), and they can be further extensively customized by Asus Gear Link. Once you start using a controller with TMR, it’s extremely difficult to go back to a non-TMR (or non-Hall Effect) one.</p><h2 id="even-better-in-practice">Even better in practice</h2><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="wE7AVR3jmPXUbozAv6sK2T" name="Asus_ROG_RAIKIRI_II_ 4.JPG" alt="A black Asus ROG Raikiri II Xbox and PC controller" src="https://cdn.mos.cms.futurecdn.net/wE7AVR3jmPXUbozAv6sK2T.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>So, in theory, TMR is excellent, which in turn makes the Asus ROG Raikiri II outstanding on paper, but how does the controller hold up in real-world usage? </p><p>Phenomenally, if you ask me. </p><p>I’ve used it extensively to play <a href="https://www.tomsguide.com/reviews/cyberpunk-2077-phantom-liberty">Cyberpunk 2077</a> and F1 25 on our testing rig, and <a href="https://www.tomsguide.com/gaming/clair-obscur-expedition-33-review">Clair Obscur: Expedition 33</a> on an <a href="https://www.tomsguide.com/reviews/xbox-series-s">Xbox Series S</a>. Being able to adjust each trigger’s sensitivity on the fly, via the locks on the back, is super handy.</p><p>In Cyberpunk 2077, I opted for short clicky presses as I didn’t want to press RT all the way down to rain gunfire down on NPCs, and my fingers didn’t feel fatigued either. </p><p>I opted for clicky presses in Expedition 33 too, as all I had to do to execute a Gradient Counter at the right moment was simply tap RT. Not only did this help me time my parries perfectly, but it also felt very satisfying as the short travel distance makes RT and LT feel like mouse clicks.</p><p>And those TMR sticks are something else too. Like I said earlier, TMR uses weak electromagnetic waves and even the most minute of movements is registered. With a sniper rifle equipped, I adjusted my aim ever so slightly in Cyberpunk 2077 to take out a specific NPC standing next to multiple others. </p><p>The extra-sensitive TMR sticks also had a chance to shine in F1 25 as they helped me make very slight changes to my car’s direction, especially when I was right behind another car and needed to overtake.</p><h2 id="but-is-the-price-right">But is the price right?</h2><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="adjYpnSoRuydWAuRvGkCGS" name="Asus_ROG_RAIKIRI_II_ 2.JPG" alt="A black Asus ROG Raikiri II Xbox and PC controller" src="https://cdn.mos.cms.futurecdn.net/adjYpnSoRuydWAuRvGkCGS.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>Given that the Asus ROG Raikiri II utilizes the latest tech, it shouldn’t come as a surprise to anyone that it costs a premium. The Raikiri II retails for <a href="https://www.amazon.com/ASUS-ROG-II-Wireless-Controller/dp/B0G36827DR/" target="_blank" rel="nofollow">$189</a> / <a href="https://www.amazon.co.uk/ASUS-ROG-II-Wireless-Controller/dp/B0G36827DR/" target="_blank" rel="nofollow">£180 at Amazon</a> which is quite a bit, but it’s also $10 cheaper than the first-party Xbox Elite Series 2. In my opinion, the TMR thumbsticks and triggers alone do more than enough to justify that price tag. Why would you spend almost the same on the Elite 2 when you can get the superior Raikiri II?</p><p>Alongside the fantastic triggers and sticks, you’re also getting 50 hours of battery life — 10 more than the Elite 2. There’s more customization potential too, and the Raikiri II even comes with a charging dock to neatly display your controller. I really can’t think of a better Xbox controller, and the Raikiri II has really made me question why anyone would pay full price for the Elite 2.</p><p>But what do you think? Have you tried the Raikiri II? Or are you happy with the Elite Series 2? Or do you use a third-party controller that <em>isn’t </em>the Raikiri II? Let me know in the comments below!</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WVqNGe"></div>                            </div>                            <script src="https://kwizly.com/embed/WVqNGe.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/gaming/gaming-peripherals/asus-rog-raikiri-ii-review">‘The Xbox Elite 2 better watch its back’: I just tested the Asus ROG Raikiri II and it puts every other competitive controller to shame</a></li><li><a href="https://www.tomsguide.com/gaming/gaming-peripherals/so-long-hall-effect-im-only-using-controllers-with-tmr-sensors-from-now-on">So long Hall Effect — I'm only using controllers with TMR sensors from now on</a></li><li><a href="https://www.tomsguide.com/gaming/gaming-peripherals/ive-finally-found-a-ps5-controller-thats-better-than-the-dualsense-and-no-its-not-the-dualsense-edge">I’ve finally found a PS5 controller that’s better than the DualSense — and no, it’s not the DualSense Edge</a></li></ul><div data-widget-type="review" data-model-name="Asus ROG Raikiri II Xbox Wireless Controller"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/asus-has-created-a-controller-that-blows-the-xbox-elite-series-2-out-of-the-water-heres-why-i-think-the-rog-raikiri-ii-is-the-perfect-gamepad</link>
                                                                            <description>
                            <![CDATA[ After having used the Asus ROG Raikiri II for over a week, I wonder why anyone would spend more on the Xbox Elite Series 2 when Asus' offering is much better. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">annFi7KCj4Ptqa5VDaYWEc</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/jwZuEmAqQqnjD4GzSV4hLT-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 17 May 2026 06:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/jwZuEmAqQqnjD4GzSV4hLT-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A black Asus ROG Raikiri II Xbox and PC controller]]></media:description>                                                            <media:text><![CDATA[A black Asus ROG Raikiri II Xbox and PC controller]]></media:text>
                                <media:title type="plain"><![CDATA[A black Asus ROG Raikiri II Xbox and PC controller]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/jwZuEmAqQqnjD4GzSV4hLT-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Gaming is one of my favorite hobbies. When I’m not working, you’ll usually find me sinking hours into my most-loved RPGs. I am, then, very lucky that I get to play video games for a living. Well, that’s a bit of an exaggeration — I test many gaming peripherals, including the <a href="https://www.tomsguide.com/best-picks/best-pc-game-controllers">best controllers</a>, which means I get to play video games and call it work.</p><p>The most recent controller I’ve tested has, no lie, blown me away. They honestly don’t get better than this. The <a href="https://www.tomsguide.com/gaming/gaming-peripherals/asus-rog-raikiri-ii-review">Asus ROG Raikiri II</a> is a powerful gamepad for Microsoft’s consoles, and it beats the first-party Xbox Elite Series 2 in every which way.</p><div class="product"><a data-dimension112="e55bc805-bb5f-4364-bc45-b233aeefa8fc" data-action="Deal Block" data-label="ROG Raikiri II" data-dimension48="ROG Raikiri II" data-dimension25="$149" href="https://www.amazon.com/ASUS-ROG-II-Wireless-Controller/dp/B0G36827DR/" 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:69.40%;"><img id="LFmDmTeecmqNP5URYzDbK5" name="Raikiri-II-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/LFmDmTeecmqNP5URYzDbK5.jpg" mos="" align="middle" fullscreen="" width="1500" height="1041" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Asus ROG Raikiri II is the best third-party Xbox and PC controller you can buy right now, period. Packing impressive TMR sticks and triggers that let you precisely fine-tune your movements and give you a competitive advantage, the Raikiri II boasts peerless gaming performance. Long battery life, extensive customization, and 1,000Hz polling set it apart from the competition, and the ergonomic design ensures all-day comfort.<a class="view-deal button" href="https://www.amazon.com/ASUS-ROG-II-Wireless-Controller/dp/B0G36827DR/" target="_blank" rel="nofollow" data-dimension112="e55bc805-bb5f-4364-bc45-b233aeefa8fc" data-action="Deal Block" data-label="ROG Raikiri II" data-dimension48="ROG Raikiri II" data-dimension25="$149">View Deal</a></p></div><p>It’s comfortable and packs performance in spades, and with extensive customization to boot, it gives you the advantage sought after by competitive players. Why do I say it’s better than the Xbox Elite 2? That’s what I’m here to talk about, so you’ll have to continue reading. </p><p>Spoiler alert: it might have something to do with the Raikiri II’s TMR thumbsticks and triggers…</p><h2 id="tmr-stands-for-this-mechanic-rocks">‘TMR’ stands for ‘This Mechanic Rocks’</h2><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="X9pNTRiR4VryF3TKwoMLqS" name="Asus_ROG_RAIKIRI_II_ 9.JPG" alt="A black Asus ROG Raikiri II Xbox and PC controller" src="https://cdn.mos.cms.futurecdn.net/X9pNTRiR4VryF3TKwoMLqS.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>One of the things that stops me from recommending the first-party Xbox Elite Series 2 outright is its omission of Hall Effect or TMR sticks. The Elite 2 uses traditional analog sticks, although its triggers feature Hall Effect sensors. The downside of analog sticks is that they’re susceptible to stick drift — and as any gamer will know, stick drift is truly awful. To ensure longevity, many third-party manufacturers now fit Hall Effect or TMR sensors into their sticks.</p><p>Because the Asus ROG Raikiri II packs TMR tech into its sticks as well as triggers, it upstages the Elite 2 without breaking a sweat. TMR is an up-and-coming technology, and not many controllers feature it yet. <a href="https://www.tomsguide.com/gaming/gaming-peripherals/so-long-hall-effect-im-only-using-controllers-with-tmr-sensors-from-now-on">TMR stands for Tunnel Magneto Resistance</a>, and it uses weak electromagnetic waves rather than strong ones, which means that minute adjustments and movements are picked up by the sensor. It can get very technical but all you need to know is that it essentially gives you a massive competitive advantage — something analog sticks simply cannot 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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zpB2g25ihkBRKKp4rLEpaT" name="Asus_ROG_RAIKIRI_II_ 10.JPG" alt="A black Asus ROG Raikiri II Xbox and PC controller" src="https://cdn.mos.cms.futurecdn.net/zpB2g25ihkBRKKp4rLEpaT.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 Raikiri II goes a step further by using TMR in its triggers instead of Hall Effect, and becomes the first controller (at the time of writing) to do so. The triggers’ sensitivity can be changed between short clicky presses (great for FPS titles) and long presses (excellent for racing games), and they can be further extensively customized by Asus Gear Link. Once you start using a controller with TMR, it’s extremely difficult to go back to a non-TMR (or non-Hall Effect) one.</p><h2 id="even-better-in-practice">Even better in practice</h2><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="wE7AVR3jmPXUbozAv6sK2T" name="Asus_ROG_RAIKIRI_II_ 4.JPG" alt="A black Asus ROG Raikiri II Xbox and PC controller" src="https://cdn.mos.cms.futurecdn.net/wE7AVR3jmPXUbozAv6sK2T.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>So, in theory, TMR is excellent, which in turn makes the Asus ROG Raikiri II outstanding on paper, but how does the controller hold up in real-world usage? </p><p>Phenomenally, if you ask me. </p><p>I’ve used it extensively to play <a href="https://www.tomsguide.com/reviews/cyberpunk-2077-phantom-liberty">Cyberpunk 2077</a> and F1 25 on our testing rig, and <a href="https://www.tomsguide.com/gaming/clair-obscur-expedition-33-review">Clair Obscur: Expedition 33</a> on an <a href="https://www.tomsguide.com/reviews/xbox-series-s">Xbox Series S</a>. Being able to adjust each trigger’s sensitivity on the fly, via the locks on the back, is super handy.</p><p>In Cyberpunk 2077, I opted for short clicky presses as I didn’t want to press RT all the way down to rain gunfire down on NPCs, and my fingers didn’t feel fatigued either. </p><p>I opted for clicky presses in Expedition 33 too, as all I had to do to execute a Gradient Counter at the right moment was simply tap RT. Not only did this help me time my parries perfectly, but it also felt very satisfying as the short travel distance makes RT and LT feel like mouse clicks.</p><p>And those TMR sticks are something else too. Like I said earlier, TMR uses weak electromagnetic waves and even the most minute of movements is registered. With a sniper rifle equipped, I adjusted my aim ever so slightly in Cyberpunk 2077 to take out a specific NPC standing next to multiple others. </p><p>The extra-sensitive TMR sticks also had a chance to shine in F1 25 as they helped me make very slight changes to my car’s direction, especially when I was right behind another car and needed to overtake.</p><h2 id="but-is-the-price-right">But is the price right?</h2><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="adjYpnSoRuydWAuRvGkCGS" name="Asus_ROG_RAIKIRI_II_ 2.JPG" alt="A black Asus ROG Raikiri II Xbox and PC controller" src="https://cdn.mos.cms.futurecdn.net/adjYpnSoRuydWAuRvGkCGS.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>Given that the Asus ROG Raikiri II utilizes the latest tech, it shouldn’t come as a surprise to anyone that it costs a premium. The Raikiri II retails for <a href="https://www.amazon.com/ASUS-ROG-II-Wireless-Controller/dp/B0G36827DR/" target="_blank" rel="nofollow">$189</a> / <a href="https://www.amazon.co.uk/ASUS-ROG-II-Wireless-Controller/dp/B0G36827DR/" target="_blank" rel="nofollow">£180 at Amazon</a> which is quite a bit, but it’s also $10 cheaper than the first-party Xbox Elite Series 2. In my opinion, the TMR thumbsticks and triggers alone do more than enough to justify that price tag. Why would you spend almost the same on the Elite 2 when you can get the superior Raikiri II?</p><p>Alongside the fantastic triggers and sticks, you’re also getting 50 hours of battery life — 10 more than the Elite 2. There’s more customization potential too, and the Raikiri II even comes with a charging dock to neatly display your controller. I really can’t think of a better Xbox controller, and the Raikiri II has really made me question why anyone would pay full price for the Elite 2.</p><p>But what do you think? Have you tried the Raikiri II? Or are you happy with the Elite Series 2? Or do you use a third-party controller that <em>isn’t </em>the Raikiri II? Let me know in the comments below!</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WVqNGe"></div>                            </div>                            <script src="https://kwizly.com/embed/WVqNGe.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/gaming/gaming-peripherals/asus-rog-raikiri-ii-review">‘The Xbox Elite 2 better watch its back’: I just tested the Asus ROG Raikiri II and it puts every other competitive controller to shame</a></li><li><a href="https://www.tomsguide.com/gaming/gaming-peripherals/so-long-hall-effect-im-only-using-controllers-with-tmr-sensors-from-now-on">So long Hall Effect — I'm only using controllers with TMR sensors from now on</a></li><li><a href="https://www.tomsguide.com/gaming/gaming-peripherals/ive-finally-found-a-ps5-controller-thats-better-than-the-dualsense-and-no-its-not-the-dualsense-edge">I’ve finally found a PS5 controller that’s better than the DualSense — and no, it’s not the DualSense Edge</a></li></ul><div data-widget-type="review" data-model-name="Asus ROG Raikiri II Xbox Wireless Controller"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ ‘The Xbox Elite 2 better watch its back’: I just tested the Asus ROG Raikiri II and it puts every other competitive controller to shame ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The<a href="https://www.tomsguide.com/best-picks/best-pc-game-controllers"> best controllers</a> can give you a competitive advantage that makes your opponents weep — and equally, they can be excellent for single-player titles. In a crowded market, the Asus ROG Raikiri II is a cut above the rest, thanks to its impressive TMR thumbsticks and triggers, which are, in one word, glorious. Ergonomically designed, the Raikiri II is the ideal controller for those who play for long hours.</p><p>With long battery life and extensive customization available through user-friendly (and web-based) software to boot, the Raikiri II is a very easy-to-love gamepad. It isn’t without its shortcomings, of course, as the accompanying charging dock feels a little plasticky, and the controller doesn’t come cheap.</p><p>Should either of those drawbacks keep you from buying it? I don’t believe so. For the complete breakdown, read my full Asus ROG Raikiri II review.</p><h2 class="article-body__section" id="section-asus-rog-raikiri-ii-review-specs"><span>Asus ROG Raikiri II review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/ASUS-ROG-II-Wireless-Controller/dp/B0G36827DR/" target="_blank" rel="nofollow">$189</a> / <a href="https://www.amazon.co.uk/ASUS-ROG-II-Wireless-Controller/dp/B0G36827DR/" target="_blank" rel="nofollow">£180</a></p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Bluetooth, 2.4GHz, wired</p></td></tr><tr><td class="firstcol " ><p><strong>Compatibility</strong></p></td><td  ><p>Xbox Series X, Xbox Series S, Windows 11</p></td></tr><tr><td class="firstcol " ><p><strong>Layout</strong></p></td><td  ><p>ABXY</p></td></tr><tr><td class="firstcol " ><p><strong>Triggers</strong></p></td><td  ><p>TMR</p></td></tr><tr><td class="firstcol " ><p><strong>Thumbsticks</strong></p></td><td  ><p>TMR</p></td></tr><tr><td class="firstcol " ><p><strong>Polling rate</strong></p></td><td  ><p>1000Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Back buttons</strong></p></td><td  ><p>4</p></td></tr><tr><td class="firstcol " ><p><strong>Rumble</strong></p></td><td  ><p>2x motors</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>6.1 x 4.13 x 2.55 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>12.16oz</p></td></tr><tr><td class="firstcol " ><p><strong>Color</strong></p></td><td  ><p>Black</p></td></tr><tr><td class="firstcol " ><p><strong>Battery (rated)</strong></p></td><td  ><p>50 hours (2.4GHz, no vibration or RGB); charging dock included</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-asus-rog-raikiri-ii-review-cheat-sheet"><span>Asus ROG Raikiri II review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>A wireless Xbox controller with 1,000Hz polling, and TMR thumbsticks and triggers</li><li><strong>Who is it for? </strong>Competitive gamers or even casual players who want best-in-class performance</li><li><strong>How much does it cost?</strong> The Asus ROG Raikiri II is available for <a href="https://www.amazon.com/ASUS-ROG-II-Wireless-Controller/dp/B0G36827DR/" target="_blank" rel="nofollow">$189</a> / <a href="https://www.amazon.co.uk/ASUS-ROG-II-Wireless-Controller/dp/B0G36827DR/" target="_blank" rel="nofollow">£180</a></li><li><strong>What do we like? </strong>The ergonomic design, phenomenal gaming performance thanks to TMR sticks and triggers, long battery life, and extensive customization</li><li><strong>What don’t we like?</strong> The cheap-feeling charging dock and the premium price tag</li></ul><h2 class="article-body__section" id="section-asus-rog-raikiri-ii-review-the-ups"><span>Asus ROG Raikiri II review: The ups</span></h2><p>From its comfortable design and extensive customization via Asus Gear Link to its powerful TMR sticks and triggers, the Asus ROG Raikiri II is a phenomenal controller.</p><h2 id="comfortable-and-ergonomic">Comfortable and ergonomic</h2><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="zpB2g25ihkBRKKp4rLEpaT" name="Asus_ROG_RAIKIRI_II_ 10.JPG" alt="A black Asus ROG Raikiri II Xbox and PC controller" src="https://cdn.mos.cms.futurecdn.net/zpB2g25ihkBRKKp4rLEpaT.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If a controller isn’t comfortable and doesn’t let you play games all day long, you shouldn’t spend any amount of money on it, no matter how much. Thankfully, the Asus ROG Raikiri II wins full points from me in the design and comfort department.</p><p>The Raikiri II looks a lot like the first-party <a href="https://www.tomsguide.com/reviews/xbox-elite-wireless-controller-series-2">Xbox Elite Wireless Controller Series 2</a> ($199), and by that I mean it sports a rounded and contoured shape, one that fits naturally in your hands. Officially licensed by Microsoft, the Raikiri II packs asymmetrical thumbsticks, ABXY face buttons, and, of course, an X-shaped home button.</p><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="jwZuEmAqQqnjD4GzSV4hLT" name="Asus_ROG_RAIKIRI_II_ 6.JPG" alt="A black Asus ROG Raikiri II Xbox and PC controller" src="https://cdn.mos.cms.futurecdn.net/jwZuEmAqQqnjD4GzSV4hLT.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As soon as I took the controller out of the box, I was impressed by its design and chunky grips. Measuring 6.1 x 4.13 x 2.55 inches, the Raikiri II feels perfect for my medium-sized hands, and even those with bigger hands shouldn’t find this controller uncomfortable. It weighs 12.16oz, so it’s the same weight as the Xbox Elite 2. Though I’ve gotten used to the lighter weight of the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/turtle-beach-victrix-pro-bfg-reloaded-review">Turtle Beach Victrix Pro BFG Reloaded</a> ($209, 9.3oz), I’ve still enjoyed using the Raikiri II. It feels sturdy and substantial, and having used it for a six-hour gaming session, I can confirm it’s superbly comfortable.</p><p>Also aiding the Raikiri II’s ergonomics are the well-placed micro-switch back buttons. Unlike on the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/gamesir-cyclone-2-controller-review">GameSir Cyclone 2</a> ($49), where the rear buttons felt slightly obtrusive, the buttons on the Raikiri II are placed lower on the grips, so my fingers didn’t keep unintentionally hitting them. Overall, the Raikiri II is worth its salt.</p><h2 id="phenomenal-gaming-performance">Phenomenal gaming performance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="adjYpnSoRuydWAuRvGkCGS" name="Asus_ROG_RAIKIRI_II_ 2.JPG" alt="A black Asus ROG Raikiri II Xbox and PC controller" src="https://cdn.mos.cms.futurecdn.net/adjYpnSoRuydWAuRvGkCGS.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><div  class="fancy-box"><div class="fancy_box-title">Tom's Guide reviews gaming platform</div><div class="fancy_box_body"><p class="fancy-box__body-text"><strong>Supplied by: </strong><a data-analytics-id="inline-link" href="https://www.msi.com/" target="_blank" rel="nofollow"><strong>MSI</strong></a><strong> | Tom's Guide</strong><br><strong></strong><br><strong>CPU:</strong> <a data-analytics-id="inline-link" href="https://www.amazon.com/AMD-7700X-16-Thread-Unlocked-Processor/dp/B0BBHHT8LY/" target="_blank" rel="nofollow">AMD Ryzen 7 7700X</a><strong> </strong>|<strong> Graphics card:</strong> <a data-analytics-id="inline-link" href="https://www.msi.com/Graphics-Card/GeForce-RTX-5070-Ti-16G-VANGUARD-SOC" target="_blank" rel="nofollow">MSI RTX 5070 Ti 16GB Vanguard SOC</a><strong> </strong>|<strong> Motherboard: </strong><a data-analytics-id="inline-link" href="https://www.msi.com/Motherboard/B850-GAMING-PLUS-WIFI" target="_blank" rel="nofollow">MSI B850E Gaming Plus WiFi</a><strong> </strong>|<strong> RAM: </strong><a data-analytics-id="inline-link" href="https://www.newegg.com/kingston-technology-corp-fury-renegade-32gb-ddr5-8000-cas-latency-cl38-desktop-memory-silver-black/p/N82E16820242829" target="_blank" rel="nofollow">Kingston Fury Renegade DDR5 32GB</a><strong> </strong>|<strong> Cooler:</strong> <a data-analytics-id="inline-link" href="https://www.amazon.com/Noctua-NH-U12S-chromax-Black-Single-Tower-Cooler/dp/B07Y88BNYZ" target="_blank">Noctua NH-U12S</a><strong> </strong>|<strong> PSU:</strong> <a data-analytics-id="inline-link" href="https://www.msi.com/Power-Supply/MEG-Ai1300P-PCIE5" target="_blank" rel="nofollow">MSI MEG Ai1300P PCIE5</a><strong> </strong>|<strong> Case: </strong><a data-analytics-id="inline-link" href="https://www.msi.com/PC-Case/MPG-GUNGNIR-110R" target="_blank" rel="nofollow">MSI MPG GUNGNIR 110R</a></p></div></div><p>Analog thumbsticks are soooo 2010s — it’s all about TMR and Hall Effect now, and the Asus ROG Raikiri II employs the latest tech to deliver powerful gaming performance. Much like the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-raiju-v3-pro-review">Razer Raiju V3 Pro</a> ($219), the Raikiri II utilizes Tunnel Magneto Resistance (TMR) in its thumbsticks and triggers — the latter makes this the first controller with TMR triggers that I’ve tested, and I’ll get into the performance shortly.</p><p>If you want an in-depth insight into how this technology works, <a href="https://www.tomsguide.com/gaming/gaming-peripherals/so-long-hall-effect-im-only-using-controllers-with-tmr-sensors-from-now-on">read our explainer on TMR</a>. In short, TMR achieves greater precision than Hall Effect because it uses weak electromagnetic waves, which allow the sensors to detect minute adjustments and movements, making TMR controllers unbeatable for competitive gaming. Sounds excellent on paper, right? It’s even better in practice.</p><p><strong>TMR thumbsticks</strong></p><p>I tested the Raikiri II by playing <a href="https://www.tomsguide.com/reviews/forza-horizon-5">Forza Horizon 5</a>, F1 25, and <a href="https://www.tomsguide.com/reviews/cyberpunk-2077-phantom-liberty">Cyberpunk 2077</a> on our gaming rig, as well as <a href="https://www.tomsguide.com/gaming/clair-obscur-expedition-33-review">Clair Obscur: Expedition 33</a> on a friend’s <a href="https://www.tomsguide.com/reviews/xbox-series-s">Xbox Series S</a>. Regardless of the game I played, I was thoroughly impressed with the gamepad’s performance, and its TMR sticks and triggers were an utter delight to use.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:960px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="styXo5zLEzNBuDuaaq7NFS" name="Asus_ROG_RAIKIRI_II_ 1.JPG" alt="A black Asus ROG Raikiri II Xbox and PC controller" src="https://cdn.mos.cms.futurecdn.net/v2/t:141,l:419,cw:960,ch:540,q:80/styXo5zLEzNBuDuaaq7NFS.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I’ll talk about the thumbsticks first, which showed their prowess in racing games. Turning tight corners was a walk in the park in F1 25, as I could make minute adjustments to my car’s direction. I was also able to execute split-second overtakes when I was within touching distance of the racer ahead of me, and this gave me a competitive edge as I overtook them with ease.</p><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="X9pNTRiR4VryF3TKwoMLqS" name="Asus_ROG_RAIKIRI_II_ 9.JPG" alt="A black Asus ROG Raikiri II Xbox and PC controller" src="https://cdn.mos.cms.futurecdn.net/X9pNTRiR4VryF3TKwoMLqS.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>Jumping into Cyberpunk 2077 further emphasized the joysticks’ accuracy. I grabbed my sniper rifle and perched on a rooftop, and spotted a group of NPCs to take out. I then aimed my sniper at them and made minuscule adjustments to the right thumbsticks, taking them out one by one. What’s great about the sticks is that they come to a complete stop when you drag and let them go — something you can’t always do with analog sticks — which helped me aim at enemies one after another, and they never saw it coming. </p><p><strong>TMR triggers</strong></p><p>TMR triggers are similar to Hall Effect ones, as you can adjust the sensitivity of both. Via two switches around the back, the Raikiri II’s TMR Dual Mode triggers can be switched between short-travel, micro-switch, clicky ones, and full travel long presses (like on any other controller). Each mode is well-suited to specific game genres. For instance, in Forza Horizon 5 and F1 25 — so racing games — I opted for the triggers’ full travel distance as it gave me more control over throttle and braking, and I could manage my speed better.</p><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="HHpiDTY8aLkFXUCmr9AbkT" name="Asus_ROG_RAIKIRI_II_ 11.JPG" alt="A black Asus ROG Raikiri II Xbox and PC controller" src="https://cdn.mos.cms.futurecdn.net/HHpiDTY8aLkFXUCmr9AbkT.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>On the other hand, in Clair Obscur: Expedition 33 and Cyberpunk 2077 — so RPGs and FPS titles — I appreciated the triggers’ short-travel, clicky mode. When I needed to execute a Gradient Counter in Expedition 33, all I had to do was tap RT instead of pressing it all the way down, which helped me time it perfectly. The clicky presses feel like mouse clicks, and they gave me a competitive advantage in Cyberpunk 2077, too — and raining gunfire down on enemies didn’t feel as fatiguing.</p><p><strong>Clicky face buttons</strong></p><p>Last but not least, the Raikiri II’s micro-switch face and four back buttons are excellent too. Again, these feel like mouse clicks, and they register inputs instantaneously. I much prefer them over the spongy feel of the first-party Xbox controller’s face buttons. Combined with the 1,000Hz polling rate, I didn’t experience any latency issues or input lag.</p><h2 id="extensive-customization">Extensive customization</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/EQX9hfoGVyDRQhJrEtxTsa.jpg" alt="Asus Gear Link web-based app screenshot" /><figcaption><small role="credit">Asus / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/H7yRKrSuNtciBh8zc9APua.jpg" alt="Asus Gear Link web-based app screenshot" /><figcaption><small role="credit">Asus / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Zyc6F5zgDiMUeekQPqiapa.jpg" alt="Asus Gear Link web-based app screenshot" /><figcaption><small role="credit">Asus / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/p37MkaWxKkJuSZWAwktMsa.jpg" alt="Asus Gear Link web-based app screenshot" /><figcaption><small role="credit">Asus / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/YTKoq5PLLxDxrFdjobAVpa.jpg" alt="Asus Gear Link web-based app screenshot" /><figcaption><small role="credit">Asus / Tom's Guide</small></figcaption></figure></figure><p>The Asus ROG Raikiri II is extensively customizable, too, and all you need to do to personalize it is access <a href="https://gearlink.asus.com/en" target="_blank" rel="nofollow">Asus Gear Link</a> in a browser on a laptop. I really appreciate not having to download third-party software or bloatware onto my machine. Asus Gear Link sports a user-friendly interface, and there are no intrusive pop-ups.</p><p>Within Asus Gear Link, you can adjust each trigger’s start and end points if you’re using them in long-press mode, adjust the sticks’ response range based on a curve (or choose one of three presets), customize the back buttons, customize the level of vibration, and make adjustments to the RGB lighting. If your triggers are giving you a bit of trouble, you can calibrate them, too.</p><h2 id="long-battery-life">Long battery life</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="oc3vDwbPYDD3qdcZqs7NpS" name="Asus_ROG_RAIKIRI_II_ 5.JPG" alt="A black Asus ROG Raikiri II Xbox and PC controller" src="https://cdn.mos.cms.futurecdn.net/oc3vDwbPYDD3qdcZqs7NpS.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If it’s a long-lasting controller you’re after, the Asus ROG Raikiri II won’t give you much to complain about, as it boasts excellent battery life. Asus claims that with RGB and vibration turned off and over a 2.4GHz connection, the Raikiri II can last for 50 hours, which is outstanding. I know it doesn’t sound like a lot, but when you look at how the competition is lagging, you’ll appreciate it more.</p><p>For context, the first-party Xbox Elite Wireless Controller Series 2 lasts up to 40 hours; the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-wolverine-v3-pro-review">Razer Wolverine V3 Pro</a> ($199) has a 20-hour battery life; and so does the Turtle Beach Victrix Pro BFG Reloaded. Compared to all four alternatives, the Raikiri II is the longest-lasting gamepad.</p><p>Unlike its competitors, the Raikiri II comes with a charging dock so that you can display and charge your controller at the same time, and the case has a USB-C port for charging too — in case you want to give it some juice while traveling. Very cool, very useful.</p><h2 class="article-body__section" id="section-asus-rog-raikiri-ii-review-the-downs"><span>Asus ROG Raikiri II review: The downs</span></h2><p>There isn’t a lot wrong with the Asus ROG Raikiri II, but it’s important to note that its charging dock feels a little cheap, and the controller costs a premium.</p><h2 id="cheap-feeling-charging-dock">Cheap-feeling charging dock</h2><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="baYp8NDMCFaRN36Ah2H92T" name="Asus_ROG_RAIKIRI_II_ 7.JPG" alt="A black Asus ROG Raikiri II Xbox and PC controller" src="https://cdn.mos.cms.futurecdn.net/baYp8NDMCFaRN36Ah2H92T.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I love it when manufacturers include charging docks with their controllers, as they help me display my gamepads and lend a cleaner look to my setup. I loved the one that came with the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/gamesir-g7-pro-review">GameSir G7 Pro</a> ($79), and I so desperately wish the Turtle Beach Victrix Pro BFG Reloaded came with one too, as I use that controller nearly every day. Happily, Asus has included a charging dock in the Raikiri II’s box… but I’m not entirely happy with it.</p><p>You see, while the charging dock is sleek and good-looking, it feels a little cheap, and not something I’d expect from a gamepad that costs a premium (more on that next). It’s quite plasticky, and it doesn’t feel too sturdy, as the rubberized grip at the bottom doesn’t feel too grippy. Given that, it’s prone to getting knocked about, which is disappointing.</p><h2 id="a-little-expensive">A little expensive</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wE7AVR3jmPXUbozAv6sK2T" name="Asus_ROG_RAIKIRI_II_ 4.JPG" alt="A black Asus ROG Raikiri II Xbox and PC controller" src="https://cdn.mos.cms.futurecdn.net/wE7AVR3jmPXUbozAv6sK2T.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There’s no sugarcoating this: the Asus ROG Raikiri II will cost you a pretty penny. Such is the nature of many competitive controllers. The Raikiri II retails for <a href="https://www.amazon.com/ASUS-ROG-II-Wireless-Controller/dp/B0G36827DR/" target="_blank" rel="nofollow">$189</a> / <a href="https://www.amazon.co.uk/ASUS-ROG-II-Wireless-Controller/dp/B0G36827DR/" target="_blank" rel="nofollow">£180 at Amazon</a>, so it’s not too different from other serious gamepads I’ve tested. Naturally, the Raikiri II’s most prominent rival is the Xbox Elite Wireless Controller Series 2, which has a retail price of $199. Then you’ve got the Razer Wolverine V3 Pro, which also costs $199.</p><p>I don’t think this is necessarily a drawback — but it’s something to consider before you pull the trigger. The thing is, there are plenty of budget options available today, which might make it difficult to justify the Raikiri II’s high price point. The GameSir G7 Pro, for instance, carries many of the Raikiri’s features (barring TMR triggers) and costs $79. Oh, and there’s the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/pb-tails-metal-crush-defender-review">PB Tails Metal Crush Defender</a> ($109). There’s no dearth of alternatives, so unless you’re sold on the Raikiri II’s design, it’s worth considering the cheaper alternatives.</p><h2 class="article-body__section" id="section-asus-rog-raikiri-ii-review-verdict"><span>Asus ROG Raikiri II review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="M4qW65dgj8pxDdS4gKUeRG" name="Asus_ROG_RAIKIRI_II_ 3.JPG" alt="A black Asus ROG Raikiri II PC and Xbox controller" src="https://cdn.mos.cms.futurecdn.net/M4qW65dgj8pxDdS4gKUeRG.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>Competitive controllers don’t always come cheap, but the Asus ROG Raikiri II makes a compelling case as to why it’s worth the investment. By swapping traditional analog components for TMR in both its thumbsticks and triggers, the Raikiri II offers an extreme level of precision in all genres — RPGs, FPS, racing, you name it.</p><p>Ergonomically, it’s extremely comfortable and doesn’t give you much to complain about. Throw extensive customization and long battery life into the mix, and you’ve got yourself a winning combination. While the $189 price tag is a bit steep and the included charging dock feels surprisingly plasticky for such a premium product, these feel like minor issues, especially when you consider all the other goodies you’re getting.</p><p>For serious PC and Xbox players, and even casual gamers, there’s no better third-party controller on the market right now. The Raikiri II is a phenomenal, high-performance powerhouse that gets nearly everything right.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/asus-rog-raikiri-ii-review</link>
                                                                            <description>
                            <![CDATA[ The Asus ROG Raikiri II features great TMR sticks and triggers as well as 1,000Hz polling to give you a competitive edge, and there aren't many flaws either. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">H8cphXzBnkvbViv5rzErw7</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/styXo5zLEzNBuDuaaq7NFS-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 14 May 2026 12:34:41 +0000</pubDate>                                                                                                                                <updated>Tue, 09 Jun 2026 10:32:35 +0000</updated>
                                                                                                                                            <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres.&lt;/p&gt;&lt;p&gt;A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/styXo5zLEzNBuDuaaq7NFS-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A black Asus ROG Raikiri II Xbox and PC controller]]></media:description>                                                            <media:text><![CDATA[A black Asus ROG Raikiri II Xbox and PC controller]]></media:text>
                                <media:title type="plain"><![CDATA[A black Asus ROG Raikiri II Xbox and PC controller]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/styXo5zLEzNBuDuaaq7NFS-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The<a href="https://www.tomsguide.com/best-picks/best-pc-game-controllers"> best controllers</a> can give you a competitive advantage that makes your opponents weep — and equally, they can be excellent for single-player titles. In a crowded market, the Asus ROG Raikiri II is a cut above the rest, thanks to its impressive TMR thumbsticks and triggers, which are, in one word, glorious. Ergonomically designed, the Raikiri II is the ideal controller for those who play for long hours.</p><p>With long battery life and extensive customization available through user-friendly (and web-based) software to boot, the Raikiri II is a very easy-to-love gamepad. It isn’t without its shortcomings, of course, as the accompanying charging dock feels a little plasticky, and the controller doesn’t come cheap.</p><p>Should either of those drawbacks keep you from buying it? I don’t believe so. For the complete breakdown, read my full Asus ROG Raikiri II review.</p><h2 class="article-body__section" id="section-asus-rog-raikiri-ii-review-specs"><span>Asus ROG Raikiri II review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/ASUS-ROG-II-Wireless-Controller/dp/B0G36827DR/" target="_blank" rel="nofollow">$189</a> / <a href="https://www.amazon.co.uk/ASUS-ROG-II-Wireless-Controller/dp/B0G36827DR/" target="_blank" rel="nofollow">£180</a></p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Bluetooth, 2.4GHz, wired</p></td></tr><tr><td class="firstcol " ><p><strong>Compatibility</strong></p></td><td  ><p>Xbox Series X, Xbox Series S, Windows 11</p></td></tr><tr><td class="firstcol " ><p><strong>Layout</strong></p></td><td  ><p>ABXY</p></td></tr><tr><td class="firstcol " ><p><strong>Triggers</strong></p></td><td  ><p>TMR</p></td></tr><tr><td class="firstcol " ><p><strong>Thumbsticks</strong></p></td><td  ><p>TMR</p></td></tr><tr><td class="firstcol " ><p><strong>Polling rate</strong></p></td><td  ><p>1000Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Back buttons</strong></p></td><td  ><p>4</p></td></tr><tr><td class="firstcol " ><p><strong>Rumble</strong></p></td><td  ><p>2x motors</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>6.1 x 4.13 x 2.55 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>12.16oz</p></td></tr><tr><td class="firstcol " ><p><strong>Color</strong></p></td><td  ><p>Black</p></td></tr><tr><td class="firstcol " ><p><strong>Battery (rated)</strong></p></td><td  ><p>50 hours (2.4GHz, no vibration or RGB); charging dock included</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-asus-rog-raikiri-ii-review-cheat-sheet"><span>Asus ROG Raikiri II review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>A wireless Xbox controller with 1,000Hz polling, and TMR thumbsticks and triggers</li><li><strong>Who is it for? </strong>Competitive gamers or even casual players who want best-in-class performance</li><li><strong>How much does it cost?</strong> The Asus ROG Raikiri II is available for <a href="https://www.amazon.com/ASUS-ROG-II-Wireless-Controller/dp/B0G36827DR/" target="_blank" rel="nofollow">$189</a> / <a href="https://www.amazon.co.uk/ASUS-ROG-II-Wireless-Controller/dp/B0G36827DR/" target="_blank" rel="nofollow">£180</a></li><li><strong>What do we like? </strong>The ergonomic design, phenomenal gaming performance thanks to TMR sticks and triggers, long battery life, and extensive customization</li><li><strong>What don’t we like?</strong> The cheap-feeling charging dock and the premium price tag</li></ul><h2 class="article-body__section" id="section-asus-rog-raikiri-ii-review-the-ups"><span>Asus ROG Raikiri II review: The ups</span></h2><p>From its comfortable design and extensive customization via Asus Gear Link to its powerful TMR sticks and triggers, the Asus ROG Raikiri II is a phenomenal controller.</p><h2 id="comfortable-and-ergonomic">Comfortable and ergonomic</h2><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="zpB2g25ihkBRKKp4rLEpaT" name="Asus_ROG_RAIKIRI_II_ 10.JPG" alt="A black Asus ROG Raikiri II Xbox and PC controller" src="https://cdn.mos.cms.futurecdn.net/zpB2g25ihkBRKKp4rLEpaT.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If a controller isn’t comfortable and doesn’t let you play games all day long, you shouldn’t spend any amount of money on it, no matter how much. Thankfully, the Asus ROG Raikiri II wins full points from me in the design and comfort department.</p><p>The Raikiri II looks a lot like the first-party <a href="https://www.tomsguide.com/reviews/xbox-elite-wireless-controller-series-2">Xbox Elite Wireless Controller Series 2</a> ($199), and by that I mean it sports a rounded and contoured shape, one that fits naturally in your hands. Officially licensed by Microsoft, the Raikiri II packs asymmetrical thumbsticks, ABXY face buttons, and, of course, an X-shaped home button.</p><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="jwZuEmAqQqnjD4GzSV4hLT" name="Asus_ROG_RAIKIRI_II_ 6.JPG" alt="A black Asus ROG Raikiri II Xbox and PC controller" src="https://cdn.mos.cms.futurecdn.net/jwZuEmAqQqnjD4GzSV4hLT.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As soon as I took the controller out of the box, I was impressed by its design and chunky grips. Measuring 6.1 x 4.13 x 2.55 inches, the Raikiri II feels perfect for my medium-sized hands, and even those with bigger hands shouldn’t find this controller uncomfortable. It weighs 12.16oz, so it’s the same weight as the Xbox Elite 2. Though I’ve gotten used to the lighter weight of the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/turtle-beach-victrix-pro-bfg-reloaded-review">Turtle Beach Victrix Pro BFG Reloaded</a> ($209, 9.3oz), I’ve still enjoyed using the Raikiri II. It feels sturdy and substantial, and having used it for a six-hour gaming session, I can confirm it’s superbly comfortable.</p><p>Also aiding the Raikiri II’s ergonomics are the well-placed micro-switch back buttons. Unlike on the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/gamesir-cyclone-2-controller-review">GameSir Cyclone 2</a> ($49), where the rear buttons felt slightly obtrusive, the buttons on the Raikiri II are placed lower on the grips, so my fingers didn’t keep unintentionally hitting them. Overall, the Raikiri II is worth its salt.</p><h2 id="phenomenal-gaming-performance">Phenomenal gaming performance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="adjYpnSoRuydWAuRvGkCGS" name="Asus_ROG_RAIKIRI_II_ 2.JPG" alt="A black Asus ROG Raikiri II Xbox and PC controller" src="https://cdn.mos.cms.futurecdn.net/adjYpnSoRuydWAuRvGkCGS.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><div  class="fancy-box"><div class="fancy_box-title">Tom's Guide reviews gaming platform</div><div class="fancy_box_body"><p class="fancy-box__body-text"><strong>Supplied by: </strong><a data-analytics-id="inline-link" href="https://www.msi.com/" target="_blank" rel="nofollow"><strong>MSI</strong></a><strong> | Tom's Guide</strong><br><strong></strong><br><strong>CPU:</strong> <a data-analytics-id="inline-link" href="https://www.amazon.com/AMD-7700X-16-Thread-Unlocked-Processor/dp/B0BBHHT8LY/" target="_blank" rel="nofollow">AMD Ryzen 7 7700X</a><strong> </strong>|<strong> Graphics card:</strong> <a data-analytics-id="inline-link" href="https://www.msi.com/Graphics-Card/GeForce-RTX-5070-Ti-16G-VANGUARD-SOC" target="_blank" rel="nofollow">MSI RTX 5070 Ti 16GB Vanguard SOC</a><strong> </strong>|<strong> Motherboard: </strong><a data-analytics-id="inline-link" href="https://www.msi.com/Motherboard/B850-GAMING-PLUS-WIFI" target="_blank" rel="nofollow">MSI B850E Gaming Plus WiFi</a><strong> </strong>|<strong> RAM: </strong><a data-analytics-id="inline-link" href="https://www.newegg.com/kingston-technology-corp-fury-renegade-32gb-ddr5-8000-cas-latency-cl38-desktop-memory-silver-black/p/N82E16820242829" target="_blank" rel="nofollow">Kingston Fury Renegade DDR5 32GB</a><strong> </strong>|<strong> Cooler:</strong> <a data-analytics-id="inline-link" href="https://www.amazon.com/Noctua-NH-U12S-chromax-Black-Single-Tower-Cooler/dp/B07Y88BNYZ" target="_blank">Noctua NH-U12S</a><strong> </strong>|<strong> PSU:</strong> <a data-analytics-id="inline-link" href="https://www.msi.com/Power-Supply/MEG-Ai1300P-PCIE5" target="_blank" rel="nofollow">MSI MEG Ai1300P PCIE5</a><strong> </strong>|<strong> Case: </strong><a data-analytics-id="inline-link" href="https://www.msi.com/PC-Case/MPG-GUNGNIR-110R" target="_blank" rel="nofollow">MSI MPG GUNGNIR 110R</a></p></div></div><p>Analog thumbsticks are soooo 2010s — it’s all about TMR and Hall Effect now, and the Asus ROG Raikiri II employs the latest tech to deliver powerful gaming performance. Much like the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-raiju-v3-pro-review">Razer Raiju V3 Pro</a> ($219), the Raikiri II utilizes Tunnel Magneto Resistance (TMR) in its thumbsticks and triggers — the latter makes this the first controller with TMR triggers that I’ve tested, and I’ll get into the performance shortly.</p><p>If you want an in-depth insight into how this technology works, <a href="https://www.tomsguide.com/gaming/gaming-peripherals/so-long-hall-effect-im-only-using-controllers-with-tmr-sensors-from-now-on">read our explainer on TMR</a>. In short, TMR achieves greater precision than Hall Effect because it uses weak electromagnetic waves, which allow the sensors to detect minute adjustments and movements, making TMR controllers unbeatable for competitive gaming. Sounds excellent on paper, right? It’s even better in practice.</p><p><strong>TMR thumbsticks</strong></p><p>I tested the Raikiri II by playing <a href="https://www.tomsguide.com/reviews/forza-horizon-5">Forza Horizon 5</a>, F1 25, and <a href="https://www.tomsguide.com/reviews/cyberpunk-2077-phantom-liberty">Cyberpunk 2077</a> on our gaming rig, as well as <a href="https://www.tomsguide.com/gaming/clair-obscur-expedition-33-review">Clair Obscur: Expedition 33</a> on a friend’s <a href="https://www.tomsguide.com/reviews/xbox-series-s">Xbox Series S</a>. Regardless of the game I played, I was thoroughly impressed with the gamepad’s performance, and its TMR sticks and triggers were an utter delight to use.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:960px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="styXo5zLEzNBuDuaaq7NFS" name="Asus_ROG_RAIKIRI_II_ 1.JPG" alt="A black Asus ROG Raikiri II Xbox and PC controller" src="https://cdn.mos.cms.futurecdn.net/v2/t:141,l:419,cw:960,ch:540,q:80/styXo5zLEzNBuDuaaq7NFS.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I’ll talk about the thumbsticks first, which showed their prowess in racing games. Turning tight corners was a walk in the park in F1 25, as I could make minute adjustments to my car’s direction. I was also able to execute split-second overtakes when I was within touching distance of the racer ahead of me, and this gave me a competitive edge as I overtook them with ease.</p><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="X9pNTRiR4VryF3TKwoMLqS" name="Asus_ROG_RAIKIRI_II_ 9.JPG" alt="A black Asus ROG Raikiri II Xbox and PC controller" src="https://cdn.mos.cms.futurecdn.net/X9pNTRiR4VryF3TKwoMLqS.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>Jumping into Cyberpunk 2077 further emphasized the joysticks’ accuracy. I grabbed my sniper rifle and perched on a rooftop, and spotted a group of NPCs to take out. I then aimed my sniper at them and made minuscule adjustments to the right thumbsticks, taking them out one by one. What’s great about the sticks is that they come to a complete stop when you drag and let them go — something you can’t always do with analog sticks — which helped me aim at enemies one after another, and they never saw it coming. </p><p><strong>TMR triggers</strong></p><p>TMR triggers are similar to Hall Effect ones, as you can adjust the sensitivity of both. Via two switches around the back, the Raikiri II’s TMR Dual Mode triggers can be switched between short-travel, micro-switch, clicky ones, and full travel long presses (like on any other controller). Each mode is well-suited to specific game genres. For instance, in Forza Horizon 5 and F1 25 — so racing games — I opted for the triggers’ full travel distance as it gave me more control over throttle and braking, and I could manage my speed better.</p><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="HHpiDTY8aLkFXUCmr9AbkT" name="Asus_ROG_RAIKIRI_II_ 11.JPG" alt="A black Asus ROG Raikiri II Xbox and PC controller" src="https://cdn.mos.cms.futurecdn.net/HHpiDTY8aLkFXUCmr9AbkT.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>On the other hand, in Clair Obscur: Expedition 33 and Cyberpunk 2077 — so RPGs and FPS titles — I appreciated the triggers’ short-travel, clicky mode. When I needed to execute a Gradient Counter in Expedition 33, all I had to do was tap RT instead of pressing it all the way down, which helped me time it perfectly. The clicky presses feel like mouse clicks, and they gave me a competitive advantage in Cyberpunk 2077, too — and raining gunfire down on enemies didn’t feel as fatiguing.</p><p><strong>Clicky face buttons</strong></p><p>Last but not least, the Raikiri II’s micro-switch face and four back buttons are excellent too. Again, these feel like mouse clicks, and they register inputs instantaneously. I much prefer them over the spongy feel of the first-party Xbox controller’s face buttons. Combined with the 1,000Hz polling rate, I didn’t experience any latency issues or input lag.</p><h2 id="extensive-customization">Extensive customization</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/EQX9hfoGVyDRQhJrEtxTsa.jpg" alt="Asus Gear Link web-based app screenshot" /><figcaption><small role="credit">Asus / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/H7yRKrSuNtciBh8zc9APua.jpg" alt="Asus Gear Link web-based app screenshot" /><figcaption><small role="credit">Asus / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Zyc6F5zgDiMUeekQPqiapa.jpg" alt="Asus Gear Link web-based app screenshot" /><figcaption><small role="credit">Asus / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/p37MkaWxKkJuSZWAwktMsa.jpg" alt="Asus Gear Link web-based app screenshot" /><figcaption><small role="credit">Asus / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/YTKoq5PLLxDxrFdjobAVpa.jpg" alt="Asus Gear Link web-based app screenshot" /><figcaption><small role="credit">Asus / Tom's Guide</small></figcaption></figure></figure><p>The Asus ROG Raikiri II is extensively customizable, too, and all you need to do to personalize it is access <a href="https://gearlink.asus.com/en" target="_blank" rel="nofollow">Asus Gear Link</a> in a browser on a laptop. I really appreciate not having to download third-party software or bloatware onto my machine. Asus Gear Link sports a user-friendly interface, and there are no intrusive pop-ups.</p><p>Within Asus Gear Link, you can adjust each trigger’s start and end points if you’re using them in long-press mode, adjust the sticks’ response range based on a curve (or choose one of three presets), customize the back buttons, customize the level of vibration, and make adjustments to the RGB lighting. If your triggers are giving you a bit of trouble, you can calibrate them, too.</p><h2 id="long-battery-life">Long battery life</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="oc3vDwbPYDD3qdcZqs7NpS" name="Asus_ROG_RAIKIRI_II_ 5.JPG" alt="A black Asus ROG Raikiri II Xbox and PC controller" src="https://cdn.mos.cms.futurecdn.net/oc3vDwbPYDD3qdcZqs7NpS.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If it’s a long-lasting controller you’re after, the Asus ROG Raikiri II won’t give you much to complain about, as it boasts excellent battery life. Asus claims that with RGB and vibration turned off and over a 2.4GHz connection, the Raikiri II can last for 50 hours, which is outstanding. I know it doesn’t sound like a lot, but when you look at how the competition is lagging, you’ll appreciate it more.</p><p>For context, the first-party Xbox Elite Wireless Controller Series 2 lasts up to 40 hours; the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-wolverine-v3-pro-review">Razer Wolverine V3 Pro</a> ($199) has a 20-hour battery life; and so does the Turtle Beach Victrix Pro BFG Reloaded. Compared to all four alternatives, the Raikiri II is the longest-lasting gamepad.</p><p>Unlike its competitors, the Raikiri II comes with a charging dock so that you can display and charge your controller at the same time, and the case has a USB-C port for charging too — in case you want to give it some juice while traveling. Very cool, very useful.</p><h2 class="article-body__section" id="section-asus-rog-raikiri-ii-review-the-downs"><span>Asus ROG Raikiri II review: The downs</span></h2><p>There isn’t a lot wrong with the Asus ROG Raikiri II, but it’s important to note that its charging dock feels a little cheap, and the controller costs a premium.</p><h2 id="cheap-feeling-charging-dock">Cheap-feeling charging dock</h2><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="baYp8NDMCFaRN36Ah2H92T" name="Asus_ROG_RAIKIRI_II_ 7.JPG" alt="A black Asus ROG Raikiri II Xbox and PC controller" src="https://cdn.mos.cms.futurecdn.net/baYp8NDMCFaRN36Ah2H92T.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I love it when manufacturers include charging docks with their controllers, as they help me display my gamepads and lend a cleaner look to my setup. I loved the one that came with the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/gamesir-g7-pro-review">GameSir G7 Pro</a> ($79), and I so desperately wish the Turtle Beach Victrix Pro BFG Reloaded came with one too, as I use that controller nearly every day. Happily, Asus has included a charging dock in the Raikiri II’s box… but I’m not entirely happy with it.</p><p>You see, while the charging dock is sleek and good-looking, it feels a little cheap, and not something I’d expect from a gamepad that costs a premium (more on that next). It’s quite plasticky, and it doesn’t feel too sturdy, as the rubberized grip at the bottom doesn’t feel too grippy. Given that, it’s prone to getting knocked about, which is disappointing.</p><h2 id="a-little-expensive">A little expensive</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wE7AVR3jmPXUbozAv6sK2T" name="Asus_ROG_RAIKIRI_II_ 4.JPG" alt="A black Asus ROG Raikiri II Xbox and PC controller" src="https://cdn.mos.cms.futurecdn.net/wE7AVR3jmPXUbozAv6sK2T.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There’s no sugarcoating this: the Asus ROG Raikiri II will cost you a pretty penny. Such is the nature of many competitive controllers. The Raikiri II retails for <a href="https://www.amazon.com/ASUS-ROG-II-Wireless-Controller/dp/B0G36827DR/" target="_blank" rel="nofollow">$189</a> / <a href="https://www.amazon.co.uk/ASUS-ROG-II-Wireless-Controller/dp/B0G36827DR/" target="_blank" rel="nofollow">£180 at Amazon</a>, so it’s not too different from other serious gamepads I’ve tested. Naturally, the Raikiri II’s most prominent rival is the Xbox Elite Wireless Controller Series 2, which has a retail price of $199. Then you’ve got the Razer Wolverine V3 Pro, which also costs $199.</p><p>I don’t think this is necessarily a drawback — but it’s something to consider before you pull the trigger. The thing is, there are plenty of budget options available today, which might make it difficult to justify the Raikiri II’s high price point. The GameSir G7 Pro, for instance, carries many of the Raikiri’s features (barring TMR triggers) and costs $79. Oh, and there’s the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/pb-tails-metal-crush-defender-review">PB Tails Metal Crush Defender</a> ($109). There’s no dearth of alternatives, so unless you’re sold on the Raikiri II’s design, it’s worth considering the cheaper alternatives.</p><h2 class="article-body__section" id="section-asus-rog-raikiri-ii-review-verdict"><span>Asus ROG Raikiri II review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="M4qW65dgj8pxDdS4gKUeRG" name="Asus_ROG_RAIKIRI_II_ 3.JPG" alt="A black Asus ROG Raikiri II PC and Xbox controller" src="https://cdn.mos.cms.futurecdn.net/M4qW65dgj8pxDdS4gKUeRG.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>Competitive controllers don’t always come cheap, but the Asus ROG Raikiri II makes a compelling case as to why it’s worth the investment. By swapping traditional analog components for TMR in both its thumbsticks and triggers, the Raikiri II offers an extreme level of precision in all genres — RPGs, FPS, racing, you name it.</p><p>Ergonomically, it’s extremely comfortable and doesn’t give you much to complain about. Throw extensive customization and long battery life into the mix, and you’ve got yourself a winning combination. While the $189 price tag is a bit steep and the included charging dock feels surprisingly plasticky for such a premium product, these feel like minor issues, especially when you consider all the other goodies you’re getting.</p><p>For serious PC and Xbox players, and even casual gamers, there’s no better third-party controller on the market right now. The Raikiri II is a phenomenal, high-performance powerhouse that gets nearly everything right.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Valve is opening a Steam Controller reservation queue to combat resellers starting this weekend ]]></title>
                                                                                                <dc:content><![CDATA[ <p>When Valve finally loosed the new <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steam-controller-review">Steam Controller</a> on the world this past Monday (May 4) stock <a href="https://www.tomsguide.com/gaming/pc-gaming/the-steam-controller-is-officially-out-of-stock-but-valve-promises-a-restock-is-on-the-way">disappeared within 30 minutes</a> and reportedly broke Steam. At the time of writing, it's currently sold out everywhere except for scalper listings on eBay where some greedy pockets are demanding up to <a href="https://www.ebay.com/itm/147293873337?itmmeta=01KR1WCMG0Y59M0QFKREVZ3P0A&hash=item224b6624b9:g:ttoAAeSwajBp-OOV&itmprp=enc%3AAQALAAAAwDKQclQvzFwZQpmMrsO4LupnwVXaIyzWV9ItUAnr11XE8xCy0dTA78N7i8N8dFSTEYxB3Gb13OZt5tTu24e4xQ5RXyV5VpumYCeBegrnaevhPsnAdkMXjMrLPsELbT83uymOLhvGLTz0yPslG6spOfRpm87VdQ7ZONzNJ3AtewJ2lgQtBnWrdICMW8YTs%2FNV0k01KjcgL0lGmVsTK1BCrqprJM3kB4iyvaZIWx%2BcXpeX14f%2ByG5%2FCqmVFoV6IDqseg%3D%3D%7Ctkp%3ABk9SR4zIsrzAZw" target="_blank">three times the $99 price tag.</a></p><p>Today (May 7), <a href="https://store.steampowered.com/news/group/45479024/view/702141174212725149" target="_blank">Valve announced a new plan</a> to help more gamers get their paws on a Steam Controller. The company also acknowledged that the "experience" of trying to buy it was "incredibly frustrating."</p><p>The Steam Controller is one of the <a href="https://www.tomsguide.com/best-picks/best-pc-game-controllers">best PC game controllers</a>, so it's no surprise that it would get snatched up quickly. Valve's new plan aims to make buying one easier and while circumventing scalpers.</p><p>“We plan to continue replenishing stock as we get more in, but in the meantime wanted to share changes we’re making to improve the purchase experience and to limit reseller activity," the Valve announcement says.</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>Starting on Friday (May 8) at 10 am PT/1 pm ET/6 pm BST, Valve is opening a reservation queue for the Steam Controller. Initially, the queue will only be available in US and Canada with the UK, EU and Australia in the following weeks.</p><p>Adding yourself to the queue puts you in line. When stock is available and it's your spot, you will have 72 hours to buy the controller. Order emails will be sent to your associated account. </p><p>There are some stipulations.</p><p>Valve says that anyone who has already purchased a Steam Controller is ineligible to reserve another one. The company did not specify how long that will last.</p><p>Additionally, your account must be in good standing on Steam and you need to have made a purchase on Steam prior to April 27, 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/gaming/nintendo/nintendo-switch-2-price-hike-fears-grow-after-reports-investors-dont-like-how-cheap-the-console-is">Nintendo Switch 2 price hike fears grow after reports investors don't like how cheap the console is</a></li><li><a href="https://www.tomsguide.com/audio/headphones/gaming-headphones-are-finally-good-for-listening-to-music-these-open-backs-prove-that-you-dont-need-two-separate-sets-of-cans">Gaming headphones are finally good for listening to music — these open-backs prove that you don’t need two separate sets of cans</a></li><li><a href="https://www.tomsguide.com/gaming/007-first-light-hands-on-review">I played 3 hours of 007 First Light — this could be the best Bond game since GoldenEye</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/valve-is-opening-a-steam-controller-reservation-queue-to-combat-resellers-starting-this-weekend</link>
                                                                            <description>
                            <![CDATA[ Valve has a new reservation queue that should make it easier for you to get a Steam Controller. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">CDuXCumwxCaaW4p5so7Pkc</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Kj6wiCa3UKHcrsq83PFtWN-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 07 May 2026 20:02:42 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></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/Kj6wiCa3UKHcrsq83PFtWN-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Steam Controller up close]]></media:description>                                                            <media:text><![CDATA[Steam Controller up close]]></media:text>
                                <media:title type="plain"><![CDATA[Steam Controller up close]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Kj6wiCa3UKHcrsq83PFtWN-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>When Valve finally loosed the new <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steam-controller-review">Steam Controller</a> on the world this past Monday (May 4) stock <a href="https://www.tomsguide.com/gaming/pc-gaming/the-steam-controller-is-officially-out-of-stock-but-valve-promises-a-restock-is-on-the-way">disappeared within 30 minutes</a> and reportedly broke Steam. At the time of writing, it's currently sold out everywhere except for scalper listings on eBay where some greedy pockets are demanding up to <a href="https://www.ebay.com/itm/147293873337?itmmeta=01KR1WCMG0Y59M0QFKREVZ3P0A&hash=item224b6624b9:g:ttoAAeSwajBp-OOV&itmprp=enc%3AAQALAAAAwDKQclQvzFwZQpmMrsO4LupnwVXaIyzWV9ItUAnr11XE8xCy0dTA78N7i8N8dFSTEYxB3Gb13OZt5tTu24e4xQ5RXyV5VpumYCeBegrnaevhPsnAdkMXjMrLPsELbT83uymOLhvGLTz0yPslG6spOfRpm87VdQ7ZONzNJ3AtewJ2lgQtBnWrdICMW8YTs%2FNV0k01KjcgL0lGmVsTK1BCrqprJM3kB4iyvaZIWx%2BcXpeX14f%2ByG5%2FCqmVFoV6IDqseg%3D%3D%7Ctkp%3ABk9SR4zIsrzAZw" target="_blank">three times the $99 price tag.</a></p><p>Today (May 7), <a href="https://store.steampowered.com/news/group/45479024/view/702141174212725149" target="_blank">Valve announced a new plan</a> to help more gamers get their paws on a Steam Controller. The company also acknowledged that the "experience" of trying to buy it was "incredibly frustrating."</p><p>The Steam Controller is one of the <a href="https://www.tomsguide.com/best-picks/best-pc-game-controllers">best PC game controllers</a>, so it's no surprise that it would get snatched up quickly. Valve's new plan aims to make buying one easier and while circumventing scalpers.</p><p>“We plan to continue replenishing stock as we get more in, but in the meantime wanted to share changes we’re making to improve the purchase experience and to limit reseller activity," the Valve announcement says.</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>Starting on Friday (May 8) at 10 am PT/1 pm ET/6 pm BST, Valve is opening a reservation queue for the Steam Controller. Initially, the queue will only be available in US and Canada with the UK, EU and Australia in the following weeks.</p><p>Adding yourself to the queue puts you in line. When stock is available and it's your spot, you will have 72 hours to buy the controller. Order emails will be sent to your associated account. </p><p>There are some stipulations.</p><p>Valve says that anyone who has already purchased a Steam Controller is ineligible to reserve another one. The company did not specify how long that will last.</p><p>Additionally, your account must be in good standing on Steam and you need to have made a purchase on Steam prior to April 27, 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/gaming/nintendo/nintendo-switch-2-price-hike-fears-grow-after-reports-investors-dont-like-how-cheap-the-console-is">Nintendo Switch 2 price hike fears grow after reports investors don't like how cheap the console is</a></li><li><a href="https://www.tomsguide.com/audio/headphones/gaming-headphones-are-finally-good-for-listening-to-music-these-open-backs-prove-that-you-dont-need-two-separate-sets-of-cans">Gaming headphones are finally good for listening to music — these open-backs prove that you don’t need two separate sets of cans</a></li><li><a href="https://www.tomsguide.com/gaming/007-first-light-hands-on-review">I played 3 hours of 007 First Light — this could be the best Bond game since GoldenEye</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Revosim and Aston Martin just unleashed my dream F1 sim racing upgrade, so I took it rallying instead like a madman ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Yes, I know that to the sim racers amongst you, this is a cursed image — an F1-style wheel with a gear shifter and handbrake. The layout is also cursed too, but you can blame the limited space to bolt addons to the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-raced-an-entire-f1-season-in-this-sim-racing-seat-and-its-the-ultimate-upgrade">PlaySeat Formula Instinct rig</a>.</p><p>The big news here is that Revosim has teamed up with Aston Martin to bring this new F1 wheel add-on to the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/nacon-revosim-rs-pure-review">RS Pure Sim</a> — including this flatter, wider F1-style wheel, magnetic mounting cap with the badge, driving gloves and the carbon paddles <a href="https://www.nacongaming.com/en-GB/accessories/revosim" target="_blank" rel="nofollow">for £129.</a> In my testing, for enhancing steering feel in these beasty cars, this definitely performs much better than the real-life team is doing right now (...that was low, apologies to the team).</p><p>But while I am very much a track racer, I want the flexibility to dip into rally and drifting too. So I got the <a href="https://www.nacongaming.com/en-GB/accessories/revosim" target="_blank" rel="nofollow">£439 Revosim bundle</a> with shifter, loadcell handbrake and clutch pedal too for the full experience, and while I absolutely suck at rallying right now, it’s <strong>a lot </strong>of fun with these. Let me explain.</p><h2 id="p1-for-f1-racing">P1 for F1 racing</h2><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="zs2VbxcnmTDntVV7qTSkfK" name="Revosim RS Pure" alt="Revosim RS Pure" src="https://cdn.mos.cms.futurecdn.net/zs2VbxcnmTDntVV7qTSkfK.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>So let’s talk about the Aston Martin tie in here to begin with, because this is a great attachment if track racing is your thing. For those not in the know, there are some real benefits to a formula-style wheel that fundamentally changes the ergonomics and physics of how you interact with the sim</p><p>For the 180-degree rotation range of a track car over the 360 degrees of a standard roadcar, you’ll have your hands permanently locked to the wheel in the 9-and-3 position. This is built <em>perfectly </em>for that with an ergonomic placement of comfortable hand grips (with the gloves adding a nice grippiness to them too). </p><p>You aren’t fighting the inertia of a larger, heavier outer ring, so my steering inputs react to the competition around me and hit that apex first much faster. For even more weight-saving, you can change those metal paddles out for carbon fiber, but I still prefer the chunky click of the originals personally.</p><p>The well-design width also ensures that the key controls are just a thumb’s reach away for managing ERS and Brake Bias on-the-fly during a qualifying lap. Throw in the magnetic Aston Martin badge (which can be taken off if you’re coping as a Ferrari fanboy…hi btw) and you’ve got a fully-branded, high quality sim racing experience with that full.</p><p>Would I have loved a standalone wheel with a built-in display for telemetry? Sure. But that’s where the bluetooth-connected app comes in, and there are already on-board lights for rev counter and whatnot. This is a solid attachment to specialize your setup.</p><h2 id="if-in-doubt-flat-out">“If in doubt, flat out”</h2><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="JKd24AGDD5sYwXa7BSqRPK" name="Revosim RS Pure" alt="Revosim RS Pure" src="https://cdn.mos.cms.futurecdn.net/JKd24AGDD5sYwXa7BSqRPK.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>Colin McRae said it better than anyone else could — easily one of the most legendary rally drivers in the sport’s history. Turns out when I started going flat out in Assetto Corsa Rally, I wrapped my Lancia around many, many trees.</p><p>This is seriously sim racing on hard mode (in my opinion), as there’s much more to think about from not just gear choice, but also how to approach each corner based on the surface you’re driving over, the tightness of it, whether there are small obstacles or holes on each side that could send you flying, and much more.</p><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="ttLJsA2BF5eMjWRxwsDHZK" name="Revosim RS Pure" alt="Revosim RS Pure" src="https://cdn.mos.cms.futurecdn.net/ttLJsA2BF5eMjWRxwsDHZK.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>But while it took me a long time to get acquainted to it, I can’t blame the tools, as I absolutely love the satisfying chunk of the hybrid gear box and pressurized pull of the load cell handbrake. These feel incredibly well-built and hefty with solid handles and zero flex in the metal shells as you put them through their paces.</p><p>And when I finally managed to nail the perfect handbrake flick around a hairpin turn, it was <em>so </em>satisfying. It quickly became muscle memory, which is a testament to the precise readings of that handbrake, and powering out with a tactile click on every shift really amped up the immersion.</p><p>…did I end up driving off a cliff? Maybe. But it was worth it.</p><h2 id="outlook-3">Outlook</h2><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="8rPu9TEWVwS8vJBYcQFxUK" name="Revosim RS Pure" alt="Revosim RS Pure" src="https://cdn.mos.cms.futurecdn.net/8rPu9TEWVwS8vJBYcQFxUK.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>If you remember my review of the RS Pure back last year, one of my main frustrations was that the ecosystem may take a while to gain steam. We still don’t have any PlayStation compatibility (yet), and these accessories are not available in the U.S. But at the very least, we’re getting the full accessory set on PC to make this the all-purpose sim setup you need.</p><p>The Aston Martin wheel attachment is a great addition for anyone looking to level-up their track racing, and the gearbox and handbrake have that satisfyingly hefty feeling that makes you feel like you’re firing a V10 monster from the 90s around a tight turn in the middle of the Welsh forest.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/gaming/gaming-peripherals/building-the-best-sim-racing-rig-for-usd500-driving-on-the-cheap-is-a-lot-better-than-you-think">Building the best sim racing rig for $500 — driving on the cheap is a lot better than you think</a></li><li><a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-felt-like-i-was-driving-a-real-racing-car-when-testing-this-sim-racing-rig-this-is-next-level-simulation-tech">I felt like I was driving a real racing car when testing this sim racing rig — this is next-level simulation tech</a></li><li><a href="https://www.tomsguide.com/gaming/gaming-peripherals/asetek-forte-review">I drove 1,000 miles with the Asetek Forte sim rig and it humbled me in the best way</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/revosim-and-aston-martin-just-unleashed-my-dream-f1-sim-racing-upgrade-so-i-took-it-rallying-instead-like-a-madman</link>
                                                                            <description>
                            <![CDATA[ Revosim x Aston Martin F1 wheel meets rally racing. I go hands-on with all the RS Pure add-ons, from carbon paddles to load cell handbrakes. Is it cursed? Yes. Is it fun? Absolutely. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">hS98Pcvibn6agfsxNja4PN</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/5dpyyVmf4NiuPhnYo87vLK-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 07 May 2026 18:45:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gaming Peripherals]]></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/5dpyyVmf4NiuPhnYo87vLK-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Revosim RS Pure]]></media:description>                                                            <media:text><![CDATA[Revosim RS Pure]]></media:text>
                                <media:title type="plain"><![CDATA[Revosim RS Pure]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/5dpyyVmf4NiuPhnYo87vLK-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Yes, I know that to the sim racers amongst you, this is a cursed image — an F1-style wheel with a gear shifter and handbrake. The layout is also cursed too, but you can blame the limited space to bolt addons to the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-raced-an-entire-f1-season-in-this-sim-racing-seat-and-its-the-ultimate-upgrade">PlaySeat Formula Instinct rig</a>.</p><p>The big news here is that Revosim has teamed up with Aston Martin to bring this new F1 wheel add-on to the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/nacon-revosim-rs-pure-review">RS Pure Sim</a> — including this flatter, wider F1-style wheel, magnetic mounting cap with the badge, driving gloves and the carbon paddles <a href="https://www.nacongaming.com/en-GB/accessories/revosim" target="_blank" rel="nofollow">for £129.</a> In my testing, for enhancing steering feel in these beasty cars, this definitely performs much better than the real-life team is doing right now (...that was low, apologies to the team).</p><p>But while I am very much a track racer, I want the flexibility to dip into rally and drifting too. So I got the <a href="https://www.nacongaming.com/en-GB/accessories/revosim" target="_blank" rel="nofollow">£439 Revosim bundle</a> with shifter, loadcell handbrake and clutch pedal too for the full experience, and while I absolutely suck at rallying right now, it’s <strong>a lot </strong>of fun with these. Let me explain.</p><h2 id="p1-for-f1-racing">P1 for F1 racing</h2><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="zs2VbxcnmTDntVV7qTSkfK" name="Revosim RS Pure" alt="Revosim RS Pure" src="https://cdn.mos.cms.futurecdn.net/zs2VbxcnmTDntVV7qTSkfK.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>So let’s talk about the Aston Martin tie in here to begin with, because this is a great attachment if track racing is your thing. For those not in the know, there are some real benefits to a formula-style wheel that fundamentally changes the ergonomics and physics of how you interact with the sim</p><p>For the 180-degree rotation range of a track car over the 360 degrees of a standard roadcar, you’ll have your hands permanently locked to the wheel in the 9-and-3 position. This is built <em>perfectly </em>for that with an ergonomic placement of comfortable hand grips (with the gloves adding a nice grippiness to them too). </p><p>You aren’t fighting the inertia of a larger, heavier outer ring, so my steering inputs react to the competition around me and hit that apex first much faster. For even more weight-saving, you can change those metal paddles out for carbon fiber, but I still prefer the chunky click of the originals personally.</p><p>The well-design width also ensures that the key controls are just a thumb’s reach away for managing ERS and Brake Bias on-the-fly during a qualifying lap. Throw in the magnetic Aston Martin badge (which can be taken off if you’re coping as a Ferrari fanboy…hi btw) and you’ve got a fully-branded, high quality sim racing experience with that full.</p><p>Would I have loved a standalone wheel with a built-in display for telemetry? Sure. But that’s where the bluetooth-connected app comes in, and there are already on-board lights for rev counter and whatnot. This is a solid attachment to specialize your setup.</p><h2 id="if-in-doubt-flat-out">“If in doubt, flat out”</h2><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="JKd24AGDD5sYwXa7BSqRPK" name="Revosim RS Pure" alt="Revosim RS Pure" src="https://cdn.mos.cms.futurecdn.net/JKd24AGDD5sYwXa7BSqRPK.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>Colin McRae said it better than anyone else could — easily one of the most legendary rally drivers in the sport’s history. Turns out when I started going flat out in Assetto Corsa Rally, I wrapped my Lancia around many, many trees.</p><p>This is seriously sim racing on hard mode (in my opinion), as there’s much more to think about from not just gear choice, but also how to approach each corner based on the surface you’re driving over, the tightness of it, whether there are small obstacles or holes on each side that could send you flying, and much more.</p><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="ttLJsA2BF5eMjWRxwsDHZK" name="Revosim RS Pure" alt="Revosim RS Pure" src="https://cdn.mos.cms.futurecdn.net/ttLJsA2BF5eMjWRxwsDHZK.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>But while it took me a long time to get acquainted to it, I can’t blame the tools, as I absolutely love the satisfying chunk of the hybrid gear box and pressurized pull of the load cell handbrake. These feel incredibly well-built and hefty with solid handles and zero flex in the metal shells as you put them through their paces.</p><p>And when I finally managed to nail the perfect handbrake flick around a hairpin turn, it was <em>so </em>satisfying. It quickly became muscle memory, which is a testament to the precise readings of that handbrake, and powering out with a tactile click on every shift really amped up the immersion.</p><p>…did I end up driving off a cliff? Maybe. But it was worth it.</p><h2 id="outlook-3">Outlook</h2><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="8rPu9TEWVwS8vJBYcQFxUK" name="Revosim RS Pure" alt="Revosim RS Pure" src="https://cdn.mos.cms.futurecdn.net/8rPu9TEWVwS8vJBYcQFxUK.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>If you remember my review of the RS Pure back last year, one of my main frustrations was that the ecosystem may take a while to gain steam. We still don’t have any PlayStation compatibility (yet), and these accessories are not available in the U.S. But at the very least, we’re getting the full accessory set on PC to make this the all-purpose sim setup you need.</p><p>The Aston Martin wheel attachment is a great addition for anyone looking to level-up their track racing, and the gearbox and handbrake have that satisfyingly hefty feeling that makes you feel like you’re firing a V10 monster from the 90s around a tight turn in the middle of the Welsh forest.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/gaming/gaming-peripherals/building-the-best-sim-racing-rig-for-usd500-driving-on-the-cheap-is-a-lot-better-than-you-think">Building the best sim racing rig for $500 — driving on the cheap is a lot better than you think</a></li><li><a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-felt-like-i-was-driving-a-real-racing-car-when-testing-this-sim-racing-rig-this-is-next-level-simulation-tech">I felt like I was driving a real racing car when testing this sim racing rig — this is next-level simulation tech</a></li><li><a href="https://www.tomsguide.com/gaming/gaming-peripherals/asetek-forte-review">I drove 1,000 miles with the Asetek Forte sim rig and it humbled me in the best way</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I just tested the new Steam Controller — and it's the only PC gamepad I'll ever need ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The new Steam Controller ($99 / AU$149) is arguably the best peripheral for playing Steam games on PC and on 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>. While we don’t yet have the Steam Machine this controller was supposed to ship with, having it available right now isn’t a bad compromise. Even without its parent console/PC hybrid, this is a brilliant controller that’s a major improvement over the controversial original that launched 11 years ago.</p><p>Don’t let pictures fool you, as the Steam Controller is only slightly bigger than an Xbox controller. Because of that, it feels natural to hold. Except for the large touchpads under the thumbsticks and four back buttons, the controller has the same basic layout you’re familiar with from other game pads.</p><p>Since this is a Steam device, pairing it with any machine running <a href="https://www.tomsguide.com/us/steamos-faq-machines,news-17614.html">SteamOS</a> or the Steam App is seamless. It’s also fun, as you can charge and pair the controller to your PC or handheld via an included puck. Though the puck makes charging and pairing simple, you can always connect via a USB cable or Bluetooth connection.</p><p>Though it’s pricier than a standard controller and isn’t compatible with gaming consoles, there’s no denying that Valve knocked it out of the park with the Steam Controller. As a dedicated Steam user, I might dabble with other controllers, but this will be my go-to from now on. Find out more in my full review.</p><div class="product"><a data-dimension112="6f8776aa-cda2-479c-b15a-aff75942fd4e" data-action="Deal Block" data-label="Steam Controller" data-dimension48="Steam Controller" 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. It's not on sale yet, but the product page says it will be available on May 4.<br><a class="view-deal button" href="https://store.steampowered.com/sale/steamcontroller" target="_blank" rel="nofollow" data-dimension112="6f8776aa-cda2-479c-b15a-aff75942fd4e" data-action="Deal Block" data-label="Steam Controller" data-dimension48="Steam Controller" data-dimension25="$99">View Deal</a></p></div><h3 class="article-body__section" id="section-steam-controller-review-cheat-sheet"><span>Steam Controller review: Cheat sheet</span></h3><ul><li><strong>What is it?</strong> It’s an update of the original Steam Controller, with a more ergonomic and practical design.</li><li><strong>Who is it for?</strong> This controller is for dedicated Steam users who want a controller that works seamlessly with Valve’s ecosystem.</li><li><strong>What does it cost?</strong> The Steam Controller costs $99 / AU$149 and is available only on the <a href="https://store.steampowered.com/hardware/steamcontroller" target="_blank" rel="nofollow"><u>Steam Store</u></a>.</li><li><strong>What do we like?</strong> We like the comfortable design, easy pairing with SteamOS, smooth performance, and high customization.</li><li><strong>What don’t we like?</strong> We don’t like that it doesn’t support other PC launchers or consoles.</li></ul><h3 class="article-body__section" id="section-steam-controller-review-specs"><span>Steam Controller review: Specs</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Steam Controller</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$99 / AU$149</p></td></tr><tr><td class="firstcol " ><p><strong>Compatibility</strong></p></td><td  ><p>SteamOS</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Steam Controller Puck (2.4GHz Wireless), Bluetooth, USB-C</p></td></tr><tr><td class="firstcol " ><p><strong>Thumbsticks</strong></p></td><td  ><p>TMR</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>4.37 x 6.26 x 2.24 inches / 111mm x 159mm x 57mm</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>0.64 pounds / 292 grams</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-steam-controller-review-the-ups"><span>Steam Controller review: The ups</span></h3><p>The Steam Controller is the perfect controller for Steam users thanks to its comfortable build, intuitive control layout, extensive customization options, and simple pairing and charging.</p><h2 id="ergonomic-design">Ergonomic design</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="pYbKmQsMkuRoQvKm5FAh8c" name="Steam Controller-6" alt="The Steam Controller flat on a desk." src="https://cdn.mos.cms.futurecdn.net/pYbKmQsMkuRoQvKm5FAh8c.jpg" mos="" align="middle" fullscreen="" width="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>Design-wise, the Steam Controller is both traditional and unique. The top half has a layout similar to an Xbox controller, with a d-pad, face buttons, thumbsticks, and shoulder buttons. The bottom half is where things get interesting, as it’s rather large to accommodate the touchpads. This also gives your hands more room for a better grip.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DMZnrKJ8hvF2LA5XzD2cLW" name="Steam Controller-2" alt="The back of the Steam Controller." src="https://cdn.mos.cms.futurecdn.net/DMZnrKJ8hvF2LA5XzD2cLW.jpg" mos="" align="middle" fullscreen="" width="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 large back buttons are strategically placed right where your middle and ring fingers naturally rest. Since they’re pretty unintrusive, you can ignore them if you’re not a fan of back buttons. Like the back buttons, the shoulder buttons are also smartly placed where your fingers rest.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="UwNaPz8frxECNkhbcBQRAc" name="Steam Controller-5" alt="Steam Controller" src="https://cdn.mos.cms.futurecdn.net/UwNaPz8frxECNkhbcBQRAc.jpg" mos="" align="middle" fullscreen="" width="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 controller has the same matte finish as the Steam Deck, which means it not only feels nice to hold, but it’s also very grippy.</p><h2 id="responsive-controls">Responsive controls</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HJ6ZRxVDUjBBGPfdRCPNrm" name="Steam Controller-12" alt="Steam Controller" src="https://cdn.mos.cms.futurecdn.net/HJ6ZRxVDUjBBGPfdRCPNrm.jpg" mos="" align="middle" fullscreen="" width="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 Steam Controller is not only fun to hold, but it’s also extremely responsive. Valve could have easily just used the Steam Deck’s components, but the company went a step further by including some features you’d only find on pricier pro controllers.</p><p>First up are the new TMR thumbsticks, which are designed to be even more responsive and less prone to stick drift than Hall-effect sensors. I’ll spare you the details on how these magnetic technologies differ from one another, but suffice it to say that the TMR sticks on the Steam Deck feel amazing and allowed me to make small and large movements seamlessly.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="t2uYK7KSJZephgu4LyShBk" name="Steam Controller-3" alt="The top of the Steam Controller" src="https://cdn.mos.cms.futurecdn.net/t2uYK7KSJZephgu4LyShBk.jpg" mos="" align="middle" fullscreen="" width="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>Then we have the haptic touchpads beneath the thumbsticks. Every click and thumb movement makes them vibrate. Thanks to their large size, you can use them in place of thumbsticks, which isn’t just a gimmick, since it makes playing point-and-click games much more intuitive. The original Steam Controller had super huge touchpads instead of traditional thumbsticks, so I’m glad Valve shrunk them without sacrificing performance.</p><p>The other inputs are just as great to use. While I wish the ABXY face buttons were a tad clickier, they work as well as you’d expect. The left and right bumpers are also relatively quiet and have a satisfying travel distance. This also applies to the trigger buttons, though they don’t have trigger locks to cut down the actuation point.</p><h2 id="unique-pairing-and-charging">Unique pairing and charging</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="2on6Q6pXBJRLv9qybxnqm9" name="Steam Controller-8" alt="Steam Controller puck" src="https://cdn.mos.cms.futurecdn.net/2on6Q6pXBJRLv9qybxnqm9.jpg" mos="" align="middle" fullscreen="" width="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 of the coolest features is the included Steam Controller Puck. It's a 2.4GHz USB-C transmitter that can also charge the controller and pair it with the device you’re playing on.</p><p>Speaking of pairing, you can connect up to four Steam Controllers to the puck in case you want to play games with friends locally. It also magnetically attaches to the controller with a satisfying click.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Vnw4Z2Uhp2MxLz9byPeVi6" name="Steam Controller-9" alt="Steam Controller puck snapped on" src="https://cdn.mos.cms.futurecdn.net/Vnw4Z2Uhp2MxLz9byPeVi6.jpg" mos="" align="middle" fullscreen="" width="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 connect the puck to your PC using the included USB-C to USB-A cable, though you can theoretically use any cable with power delivery. I like that you can keep the controller connected, easily snap it off to play wirelessly, and snap it back on when you’re done.</p><p>Valve claims the controller can last over 35 hours on a single charge. I haven’t had the controller long enough to fully drain it, but it has already lasted significantly longer than the PS5 DualSense. Based on what other reviewers have said about battery life, it appears Valve’s claims aren’t just baseless boasting.</p><h2 id="highly-customizable">Highly customizable</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wXqarwHGksv9v9Rda4jNQG" name="Steam Controller-13" alt="Steam Controller customization" src="https://cdn.mos.cms.futurecdn.net/wXqarwHGksv9v9Rda4jNQG.jpg" mos="" align="middle" fullscreen="" width="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 Steam Controller offers a slew of customization options. For instance, you can program the dual touchpads to act as a mouse for shooters, a traditional D-Pad for 2D games, or even a scroll wheel for navigating menus. Other features also enable more fine-tuning for specific game genres, effectively giving you multiple controllers in a single device.</p><p>Naturally, you can remap all the buttons as you see fit. Beyond that, you can add visual overlays like Radial Menus to your screen to handle dozens of keyboard shortcuts with a quick thumb swipe. You can also make the haptic feedback provide clicks and notches to help guide your movements. These types of controls are perfect for games traditionally played with a mouse and keyboard.</p><p>There’s more I could detail, but let’s just say you could spend hours tinkering with all the customization options. And if you don’t, you can always download popular, pre-made configurations that players from the Steam community have created.</p><h3 class="article-body__section" id="section-steam-controller-review-the-downs"><span>Steam Controller review: The downs</span></h3><p>The Steam Controller is a brilliant peripheral for dedicated Steam users. However, it has one major flaw for those who play outside of Steam.</p><h2 id="for-steamos-only">For SteamOS only</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Kj6wiCa3UKHcrsq83PFtWN" name="Steam Controller-7" alt="Steam Controller up close" src="https://cdn.mos.cms.futurecdn.net/Kj6wiCa3UKHcrsq83PFtWN.jpg" mos="" align="middle" fullscreen="" width="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 Steam Controller works seamlessly with SteamOS. That’s certainly a strength, but it’s also its main weakness. If you hoped to easily use Valve’s controller on other PC game launchers like the Epic Games Store or the Xbox App for PC, you’re going to be out of luck. This also applies to gaming consoles.</p><p>If you’re like me and rarely leave Steam when PC gaming, then this likely won’t be an issue. And given how clever the PC gaming community is, I’m sure someone will find a workaround before I finish this sentence. Again, this won’t be the end of the world for most players given Steam’s ubiquity, but it’s worth keeping in mind.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-evvmme"></div>                            </div>                            <script src="https://kwizly.com/embed/evvmme.js" async></script><h3 class="article-body__section" id="section-steam-controller-review-verdict"><span>Steam Controller review: Verdict</span></h3><p>Some believe that $99 / AU$149 is too much for the Steam Controller, but I say the price is more than justified for dedicated Steam users. Sure, Valve’s peripheral costs $20 to $30 more than a standard console controller, but it packs pro controller-like features for $50-$100 less than you’d pay for those premium devices. In that way, you’re actually getting a fantastic deal.</p><p>Though it’s admittedly strange to have the Steam Controller without the platform it was designed for, I’m glad that Valve decided to launch this peripheral now so we can get acclimated to it before the Steam Machine’s arrival. Like I said before, switching to another PC controller won’t be easy, since this one gives me everything I need. If you live in the Steam ecosystem, I’m sure you’ll feel the same way.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/steam-controller-review</link>
                                                                            <description>
                            <![CDATA[ The Steam Controller is arguably the best PC game controller for Steam users, thanks to its ergonomic design and high degree of customization. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">pgfzGnjfhNHUY7BznZ49L6</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/VA2D2h27873kpRELmPwZHS-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 04 May 2026 18:04:28 +0000</pubDate>                                                                                                                                <updated>Wed, 10 Jun 2026 14:33:27 +0000</updated>
                                                                                                                                            <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></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/VA2D2h27873kpRELmPwZHS-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Steam Controller on a desk.]]></media:description>                                                            <media:text><![CDATA[The Steam Controller on a desk.]]></media:text>
                                <media:title type="plain"><![CDATA[The Steam Controller on a desk.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/VA2D2h27873kpRELmPwZHS-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The new Steam Controller ($99 / AU$149) is arguably the best peripheral for playing Steam games on PC and on 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>. While we don’t yet have the Steam Machine this controller was supposed to ship with, having it available right now isn’t a bad compromise. Even without its parent console/PC hybrid, this is a brilliant controller that’s a major improvement over the controversial original that launched 11 years ago.</p><p>Don’t let pictures fool you, as the Steam Controller is only slightly bigger than an Xbox controller. Because of that, it feels natural to hold. Except for the large touchpads under the thumbsticks and four back buttons, the controller has the same basic layout you’re familiar with from other game pads.</p><p>Since this is a Steam device, pairing it with any machine running <a href="https://www.tomsguide.com/us/steamos-faq-machines,news-17614.html">SteamOS</a> or the Steam App is seamless. It’s also fun, as you can charge and pair the controller to your PC or handheld via an included puck. Though the puck makes charging and pairing simple, you can always connect via a USB cable or Bluetooth connection.</p><p>Though it’s pricier than a standard controller and isn’t compatible with gaming consoles, there’s no denying that Valve knocked it out of the park with the Steam Controller. As a dedicated Steam user, I might dabble with other controllers, but this will be my go-to from now on. Find out more in my full review.</p><div class="product"><a data-dimension112="6f8776aa-cda2-479c-b15a-aff75942fd4e" data-action="Deal Block" data-label="Steam Controller" data-dimension48="Steam Controller" 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. It's not on sale yet, but the product page says it will be available on May 4.<br><a class="view-deal button" href="https://store.steampowered.com/sale/steamcontroller" target="_blank" rel="nofollow" data-dimension112="6f8776aa-cda2-479c-b15a-aff75942fd4e" data-action="Deal Block" data-label="Steam Controller" data-dimension48="Steam Controller" data-dimension25="$99">View Deal</a></p></div><h3 class="article-body__section" id="section-steam-controller-review-cheat-sheet"><span>Steam Controller review: Cheat sheet</span></h3><ul><li><strong>What is it?</strong> It’s an update of the original Steam Controller, with a more ergonomic and practical design.</li><li><strong>Who is it for?</strong> This controller is for dedicated Steam users who want a controller that works seamlessly with Valve’s ecosystem.</li><li><strong>What does it cost?</strong> The Steam Controller costs $99 / AU$149 and is available only on the <a href="https://store.steampowered.com/hardware/steamcontroller" target="_blank" rel="nofollow"><u>Steam Store</u></a>.</li><li><strong>What do we like?</strong> We like the comfortable design, easy pairing with SteamOS, smooth performance, and high customization.</li><li><strong>What don’t we like?</strong> We don’t like that it doesn’t support other PC launchers or consoles.</li></ul><h3 class="article-body__section" id="section-steam-controller-review-specs"><span>Steam Controller review: Specs</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Steam Controller</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$99 / AU$149</p></td></tr><tr><td class="firstcol " ><p><strong>Compatibility</strong></p></td><td  ><p>SteamOS</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Steam Controller Puck (2.4GHz Wireless), Bluetooth, USB-C</p></td></tr><tr><td class="firstcol " ><p><strong>Thumbsticks</strong></p></td><td  ><p>TMR</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>4.37 x 6.26 x 2.24 inches / 111mm x 159mm x 57mm</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>0.64 pounds / 292 grams</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-steam-controller-review-the-ups"><span>Steam Controller review: The ups</span></h3><p>The Steam Controller is the perfect controller for Steam users thanks to its comfortable build, intuitive control layout, extensive customization options, and simple pairing and charging.</p><h2 id="ergonomic-design">Ergonomic design</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="pYbKmQsMkuRoQvKm5FAh8c" name="Steam Controller-6" alt="The Steam Controller flat on a desk." src="https://cdn.mos.cms.futurecdn.net/pYbKmQsMkuRoQvKm5FAh8c.jpg" mos="" align="middle" fullscreen="" width="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>Design-wise, the Steam Controller is both traditional and unique. The top half has a layout similar to an Xbox controller, with a d-pad, face buttons, thumbsticks, and shoulder buttons. The bottom half is where things get interesting, as it’s rather large to accommodate the touchpads. This also gives your hands more room for a better grip.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DMZnrKJ8hvF2LA5XzD2cLW" name="Steam Controller-2" alt="The back of the Steam Controller." src="https://cdn.mos.cms.futurecdn.net/DMZnrKJ8hvF2LA5XzD2cLW.jpg" mos="" align="middle" fullscreen="" width="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 large back buttons are strategically placed right where your middle and ring fingers naturally rest. Since they’re pretty unintrusive, you can ignore them if you’re not a fan of back buttons. Like the back buttons, the shoulder buttons are also smartly placed where your fingers rest.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="UwNaPz8frxECNkhbcBQRAc" name="Steam Controller-5" alt="Steam Controller" src="https://cdn.mos.cms.futurecdn.net/UwNaPz8frxECNkhbcBQRAc.jpg" mos="" align="middle" fullscreen="" width="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 controller has the same matte finish as the Steam Deck, which means it not only feels nice to hold, but it’s also very grippy.</p><h2 id="responsive-controls">Responsive controls</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HJ6ZRxVDUjBBGPfdRCPNrm" name="Steam Controller-12" alt="Steam Controller" src="https://cdn.mos.cms.futurecdn.net/HJ6ZRxVDUjBBGPfdRCPNrm.jpg" mos="" align="middle" fullscreen="" width="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 Steam Controller is not only fun to hold, but it’s also extremely responsive. Valve could have easily just used the Steam Deck’s components, but the company went a step further by including some features you’d only find on pricier pro controllers.</p><p>First up are the new TMR thumbsticks, which are designed to be even more responsive and less prone to stick drift than Hall-effect sensors. I’ll spare you the details on how these magnetic technologies differ from one another, but suffice it to say that the TMR sticks on the Steam Deck feel amazing and allowed me to make small and large movements seamlessly.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="t2uYK7KSJZephgu4LyShBk" name="Steam Controller-3" alt="The top of the Steam Controller" src="https://cdn.mos.cms.futurecdn.net/t2uYK7KSJZephgu4LyShBk.jpg" mos="" align="middle" fullscreen="" width="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>Then we have the haptic touchpads beneath the thumbsticks. Every click and thumb movement makes them vibrate. Thanks to their large size, you can use them in place of thumbsticks, which isn’t just a gimmick, since it makes playing point-and-click games much more intuitive. The original Steam Controller had super huge touchpads instead of traditional thumbsticks, so I’m glad Valve shrunk them without sacrificing performance.</p><p>The other inputs are just as great to use. While I wish the ABXY face buttons were a tad clickier, they work as well as you’d expect. The left and right bumpers are also relatively quiet and have a satisfying travel distance. This also applies to the trigger buttons, though they don’t have trigger locks to cut down the actuation point.</p><h2 id="unique-pairing-and-charging">Unique pairing and charging</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="2on6Q6pXBJRLv9qybxnqm9" name="Steam Controller-8" alt="Steam Controller puck" src="https://cdn.mos.cms.futurecdn.net/2on6Q6pXBJRLv9qybxnqm9.jpg" mos="" align="middle" fullscreen="" width="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 of the coolest features is the included Steam Controller Puck. It's a 2.4GHz USB-C transmitter that can also charge the controller and pair it with the device you’re playing on.</p><p>Speaking of pairing, you can connect up to four Steam Controllers to the puck in case you want to play games with friends locally. It also magnetically attaches to the controller with a satisfying click.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Vnw4Z2Uhp2MxLz9byPeVi6" name="Steam Controller-9" alt="Steam Controller puck snapped on" src="https://cdn.mos.cms.futurecdn.net/Vnw4Z2Uhp2MxLz9byPeVi6.jpg" mos="" align="middle" fullscreen="" width="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 connect the puck to your PC using the included USB-C to USB-A cable, though you can theoretically use any cable with power delivery. I like that you can keep the controller connected, easily snap it off to play wirelessly, and snap it back on when you’re done.</p><p>Valve claims the controller can last over 35 hours on a single charge. I haven’t had the controller long enough to fully drain it, but it has already lasted significantly longer than the PS5 DualSense. Based on what other reviewers have said about battery life, it appears Valve’s claims aren’t just baseless boasting.</p><h2 id="highly-customizable">Highly customizable</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wXqarwHGksv9v9Rda4jNQG" name="Steam Controller-13" alt="Steam Controller customization" src="https://cdn.mos.cms.futurecdn.net/wXqarwHGksv9v9Rda4jNQG.jpg" mos="" align="middle" fullscreen="" width="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 Steam Controller offers a slew of customization options. For instance, you can program the dual touchpads to act as a mouse for shooters, a traditional D-Pad for 2D games, or even a scroll wheel for navigating menus. Other features also enable more fine-tuning for specific game genres, effectively giving you multiple controllers in a single device.</p><p>Naturally, you can remap all the buttons as you see fit. Beyond that, you can add visual overlays like Radial Menus to your screen to handle dozens of keyboard shortcuts with a quick thumb swipe. You can also make the haptic feedback provide clicks and notches to help guide your movements. These types of controls are perfect for games traditionally played with a mouse and keyboard.</p><p>There’s more I could detail, but let’s just say you could spend hours tinkering with all the customization options. And if you don’t, you can always download popular, pre-made configurations that players from the Steam community have created.</p><h3 class="article-body__section" id="section-steam-controller-review-the-downs"><span>Steam Controller review: The downs</span></h3><p>The Steam Controller is a brilliant peripheral for dedicated Steam users. However, it has one major flaw for those who play outside of Steam.</p><h2 id="for-steamos-only">For SteamOS only</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Kj6wiCa3UKHcrsq83PFtWN" name="Steam Controller-7" alt="Steam Controller up close" src="https://cdn.mos.cms.futurecdn.net/Kj6wiCa3UKHcrsq83PFtWN.jpg" mos="" align="middle" fullscreen="" width="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 Steam Controller works seamlessly with SteamOS. That’s certainly a strength, but it’s also its main weakness. If you hoped to easily use Valve’s controller on other PC game launchers like the Epic Games Store or the Xbox App for PC, you’re going to be out of luck. This also applies to gaming consoles.</p><p>If you’re like me and rarely leave Steam when PC gaming, then this likely won’t be an issue. And given how clever the PC gaming community is, I’m sure someone will find a workaround before I finish this sentence. Again, this won’t be the end of the world for most players given Steam’s ubiquity, but it’s worth keeping in mind.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-evvmme"></div>                            </div>                            <script src="https://kwizly.com/embed/evvmme.js" async></script><h3 class="article-body__section" id="section-steam-controller-review-verdict"><span>Steam Controller review: Verdict</span></h3><p>Some believe that $99 / AU$149 is too much for the Steam Controller, but I say the price is more than justified for dedicated Steam users. Sure, Valve’s peripheral costs $20 to $30 more than a standard console controller, but it packs pro controller-like features for $50-$100 less than you’d pay for those premium devices. In that way, you’re actually getting a fantastic deal.</p><p>Though it’s admittedly strange to have the Steam Controller without the platform it was designed for, I’m glad that Valve decided to launch this peripheral now so we can get acclimated to it before the Steam Machine’s arrival. Like I said before, switching to another PC controller won’t be easy, since this one gives me everything I need. If you live in the Steam ecosystem, I’m sure you’ll feel the same way.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Gaming headphones are finally good for listening to music — these open-backs prove that you don’t need two separate sets of cans ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Have you heard of "deinfluencing"? It's a popular social media trend where content creators advise their followers against buying overhyped or unnecessary products in a bid to combat excessive consumerism. My job, as a reviews writer, oftentimes feels like that. </p><p>I don't believe overconsumption is a good thing for us or the planet, and it's okay to not want the latest tech that everyone keeps talking about. See? Deinfluencing.</p><p>Today, I'm here to deinfluence you and tell you that you don't <em>need</em> two separate pairs of headphones for music <em>and </em>gaming. Historically, gaming headsets haven't been particularly great for audiophile listening because of how they're tuned, but I feel like that's changing — and leading the charge is the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/sony-inzone-h6-air-review">Sony Inzone H6 Air</a>. It's one of the <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">best gaming headsets</a> as well as one of the <a href="https://www.tomsguide.com/best-picks/best-audiophile-headphones">best audiophile headphones</a> I've ever tested, period.<em> </em></p><div class="product"><a data-dimension112="59750348-9419-4e94-9910-2aa3824f75d4" data-action="Deal Block" data-label="Inzone H6 Air" data-dimension48="Inzone H6 Air" data-dimension25="$199" href="https://www.amazon.com/Sony-INZONE-Open-Back-Gaming-Headset/dp/B0GT6CX8MV/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1188px;"><p class="vanilla-image-block" style="padding-top:126.26%;"><img id="zpnC9Hg9M6JRpLQeVtGy44" name="Inzone-h6-air-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/zpnC9Hg9M6JRpLQeVtGy44.jpg" mos="" align="middle" fullscreen="" width="1188" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Sony Inzone H6 Air makes a compelling case for using open-back headphones in gaming, and you might not want to go back to wireless cans after trying it. This headset is fitted with 40mm drivers also found in studio monitor headphones, and they deliver outstanding sound quality in games and while listening to music.<a class="view-deal button" href="https://www.amazon.com/Sony-INZONE-Open-Back-Gaming-Headset/dp/B0GT6CX8MV/" target="_blank" rel="nofollow" data-dimension112="59750348-9419-4e94-9910-2aa3824f75d4" data-action="Deal Block" data-label="Inzone H6 Air" data-dimension48="Inzone H6 Air" data-dimension25="$199">View Deal</a></p></div><p>I could go on all day about why the H6 Airs are wonderful gaming cans, but I want to talk about the audio quality instead, and tell you that this is the only set of cans you need. That's because the H6 Airs, unlike many other gaming-first headsets, have an ace up their sleeves: they use studio-grade drivers. </p><p>If you're an audiophile and a gamer, there is no better headset. </p><h2 id="open-backs-everything-else">Open-backs > Everything else</h2><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="WC9B4SaikRZxkMfpLEJA5b" name="Inzone_H6_ 5.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/WC9B4SaikRZxkMfpLEJA5b.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 term "open-backs" is generally associated with regular, music-first headphones. Though Sony has a few open-back headphones under its belt, the Inzone H6 Air is the giant's first-ever open-back gaming headset (and it's nothing short of a triumph). Open-backs are usually more comfortable than closed-back headphones, such as the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/fractal-design-scape-review">Fractal Design Scape</a> gaming headset, or the <a href="https://www.tomsguide.com/reviews/bose-quietcomfort-ultra-headphones">Bose QuietComfort Ultra</a> cans.</p><p>It's not that closed-back headphones are <em>uncomfortable </em>per se, all I'm saying is that open-backs are much airier and lighter than closed-backs. If you want a listening experience that's free of fatigue, open-backs are the way to go.</p><p>Rear air pressure buildup is extremely common on sealed cans because there's nowhere for the air to go (hence, the holes). The H6 Airs, like many open-backs, allow air to pass through the earcups (the holes, remember?), which reduces fatigue and eliminates sweat buildup, enabling you to wear the headphones for hours on end.</p><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="goBbNKPNj33FbLmrhTC5qZ" name="Inzone_H6_ 1.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/goBbNKPNj33FbLmrhTC5qZ.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>Also adding to their wearability is the fact that they weigh just 7.01oz — they're ridiculously lightweight.  The suspended headband helps reduce pressure you’d otherwise feel on the top of their head. Finally, the H6 Air use light nylon ear cushions that nestle your ears like two clouds loosely hugging them.</p><p>I've tested the, extensively — for gaming and listening to music — and the longest I've gone wearing them has been nine hours straight. Whether you plan on gaming with them or listening to several albums back-to-back, the H6 Air has you covered.</p><h2 id="studio-grade-drivers-for-audiophile-sound">Studio-grade drivers for audiophile sound</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4RhGyd87d2HwoJgDz5WLFb" name="Inzone_H6_ 10.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/4RhGyd87d2HwoJgDz5WLFb.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>It's a good thing that Sony went wired with the H6 Air: Wired headphones are generally better than their wireless counterparts because there's no loss of information and compression occurring over Bluetooth. They transmit uncompressed audio data, leading to high-fidelity sound. Combine that with studio-grade drivers and you've got a winning formula — Sony does, at least.</p><p>The H6 Airs are fitted with 40mm Open-Back Dynamic which you'll also find in the Sony MDR-MV1 studio monitoring headphones. Naturally, as they're gaming cans, these drivers in the H6 Air have been re-tuned for gaming with enhanced bass. But they're still phenomenal for music. </p><p>You can read all about the gaming performance in the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/sony-inzone-h6-air-review">full review</a>, so I'll discuss music quality instead. Hit play on the playlist below to listening along to my testing songs while you read my analysis.</p><iframe allow="" height="390" width="378" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://widget.qobuz.com/playlist/63018398?zone=GB-en"></iframe><p>The first thing I noticed while listening to ‘First Light’ by Lana Del Rey was the expansiveness of the H6 Air. It felt like I was standing in the middle of a crowded room at a gig, and my body was engulfed in the orchestral production. </p><p>The H6 Air feature spatial audio, and the headphones created a fantastic 3D effect in the 007 theme. Lana's "Will you? Will you?" whispers felt like they were positioned at different depths, and like they were swirling around my head instead of through detached left and right channels.</p><p>At the time of writing the review, I was obsessed with ‘Black Water’ by Poets of the Fall, and the song sounded the most beautiful it ever has through these headphones. The opening acoustic guitar carried startling clarity, with the zip of fingers sliding from note to note without sounding too harsh or distorted. The headphones never once got overwhelmed — whether that was when all the other instruments kicked in, or Marko Saaresto hit the highest note.</p><p>Despite being open-back, tight basslines are the H6 Air's specialty too. Airy high frequencies and accurate bass in 'No Chances' by Twenty One Pilots made me love the track even more. The bassline through the H6 Air reverberates in a way that you can feel it in your chest, and the subtle drop in notes felt apparent. </p><p>Lastly, 'Money' by Pink Floyd was another great testing track for the H6 Air, with the clinks of coins balancing well against the blues-based, driving riff played in an unusual 7/4 time signature. </p><h2 id="one-headset-for-two-purposes">One headset for two purposes</h2><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="MALMDEyfcevEbm52E3y5Gb" name="Inzone_H6_ 6.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/MALMDEyfcevEbm52E3y5Gb.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 Sony Inzone H6 Air have quickly become some of my favorite headphones, for gaming and listening to music. They're spacious and expansive, and they're extremely comfortable — perhaps the most comfortable over-ears I've tested so far. Being able to plug them into any device and console you own is a massive advantage, and the wired design means you're getting high-fidelity audio at all times.</p><p>You may still want a pair of wireless headphones for when you're traveling, and of course, open-backs doesn't boast the best active noise cancellation due to the limitations posed by their design. But if you want one pair of wired headphones for both gaming and careful listening, I can't think of a better option.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OdvmQe"></div>                            </div>                            <script src="https://kwizly.com/embed/OdvmQe.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/gaming/gaming-peripherals/sony-inzone-h6-air-review">The Sony Inzone H6 Air is a compelling case to ditch wireless cans and use open-backs for gaming — here’s my honest verdict</a></li><li><a href="https://www.tomsguide.com/audio/bluetooth-speakers/jbl-go-5-versus-jbl-go-4-face-off">I tested the JBL Go 5 vs JBL Go 4 budget Bluetooth speakers — and there’s a clear winner under $60</a></li><li><a href="https://www.tomsguide.com/audio/soundbars/move-over-sonos-this-marshall-soundbar-is-now-my-favorite-for-small-spaces">Move over, Sonos — this Marshall soundbar is now my favorite for small spaces</a></li></ul><div data-widget-type="review" data-model-name="Sony Inzone H6 Air"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/audio/headphones/gaming-headphones-are-finally-good-for-listening-to-music-these-open-backs-prove-that-you-dont-need-two-separate-sets-of-cans</link>
                                                                            <description>
                            <![CDATA[ I just finished reviewing Sony's first-ever open-backs for gaming, the Inzone H6 Air, and these headphones can pull double duty for both gaming and audiophile listening. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">CToU26xKwFkbzF9C2MEw3c</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/x49TPj7jjbrzfZ5qRWvh5a-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 03 May 2026 08:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Headphones]]></category>
                                                    <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/x49TPj7jjbrzfZ5qRWvh5a-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A black Sony Inzone H6 Air open-back gaming headset]]></media:description>                                                            <media:text><![CDATA[A black Sony Inzone H6 Air open-back gaming headset]]></media:text>
                                <media:title type="plain"><![CDATA[A black Sony Inzone H6 Air open-back gaming headset]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/x49TPj7jjbrzfZ5qRWvh5a-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Have you heard of "deinfluencing"? It's a popular social media trend where content creators advise their followers against buying overhyped or unnecessary products in a bid to combat excessive consumerism. My job, as a reviews writer, oftentimes feels like that. </p><p>I don't believe overconsumption is a good thing for us or the planet, and it's okay to not want the latest tech that everyone keeps talking about. See? Deinfluencing.</p><p>Today, I'm here to deinfluence you and tell you that you don't <em>need</em> two separate pairs of headphones for music <em>and </em>gaming. Historically, gaming headsets haven't been particularly great for audiophile listening because of how they're tuned, but I feel like that's changing — and leading the charge is the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/sony-inzone-h6-air-review">Sony Inzone H6 Air</a>. It's one of the <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">best gaming headsets</a> as well as one of the <a href="https://www.tomsguide.com/best-picks/best-audiophile-headphones">best audiophile headphones</a> I've ever tested, period.<em> </em></p><div class="product"><a data-dimension112="59750348-9419-4e94-9910-2aa3824f75d4" data-action="Deal Block" data-label="Inzone H6 Air" data-dimension48="Inzone H6 Air" data-dimension25="$199" href="https://www.amazon.com/Sony-INZONE-Open-Back-Gaming-Headset/dp/B0GT6CX8MV/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1188px;"><p class="vanilla-image-block" style="padding-top:126.26%;"><img id="zpnC9Hg9M6JRpLQeVtGy44" name="Inzone-h6-air-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/zpnC9Hg9M6JRpLQeVtGy44.jpg" mos="" align="middle" fullscreen="" width="1188" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Sony Inzone H6 Air makes a compelling case for using open-back headphones in gaming, and you might not want to go back to wireless cans after trying it. This headset is fitted with 40mm drivers also found in studio monitor headphones, and they deliver outstanding sound quality in games and while listening to music.<a class="view-deal button" href="https://www.amazon.com/Sony-INZONE-Open-Back-Gaming-Headset/dp/B0GT6CX8MV/" target="_blank" rel="nofollow" data-dimension112="59750348-9419-4e94-9910-2aa3824f75d4" data-action="Deal Block" data-label="Inzone H6 Air" data-dimension48="Inzone H6 Air" data-dimension25="$199">View Deal</a></p></div><p>I could go on all day about why the H6 Airs are wonderful gaming cans, but I want to talk about the audio quality instead, and tell you that this is the only set of cans you need. That's because the H6 Airs, unlike many other gaming-first headsets, have an ace up their sleeves: they use studio-grade drivers. </p><p>If you're an audiophile and a gamer, there is no better headset. </p><h2 id="open-backs-everything-else">Open-backs > Everything else</h2><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="WC9B4SaikRZxkMfpLEJA5b" name="Inzone_H6_ 5.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/WC9B4SaikRZxkMfpLEJA5b.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 term "open-backs" is generally associated with regular, music-first headphones. Though Sony has a few open-back headphones under its belt, the Inzone H6 Air is the giant's first-ever open-back gaming headset (and it's nothing short of a triumph). Open-backs are usually more comfortable than closed-back headphones, such as the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/fractal-design-scape-review">Fractal Design Scape</a> gaming headset, or the <a href="https://www.tomsguide.com/reviews/bose-quietcomfort-ultra-headphones">Bose QuietComfort Ultra</a> cans.</p><p>It's not that closed-back headphones are <em>uncomfortable </em>per se, all I'm saying is that open-backs are much airier and lighter than closed-backs. If you want a listening experience that's free of fatigue, open-backs are the way to go.</p><p>Rear air pressure buildup is extremely common on sealed cans because there's nowhere for the air to go (hence, the holes). The H6 Airs, like many open-backs, allow air to pass through the earcups (the holes, remember?), which reduces fatigue and eliminates sweat buildup, enabling you to wear the headphones for hours on end.</p><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="goBbNKPNj33FbLmrhTC5qZ" name="Inzone_H6_ 1.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/goBbNKPNj33FbLmrhTC5qZ.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>Also adding to their wearability is the fact that they weigh just 7.01oz — they're ridiculously lightweight.  The suspended headband helps reduce pressure you’d otherwise feel on the top of their head. Finally, the H6 Air use light nylon ear cushions that nestle your ears like two clouds loosely hugging them.</p><p>I've tested the, extensively — for gaming and listening to music — and the longest I've gone wearing them has been nine hours straight. Whether you plan on gaming with them or listening to several albums back-to-back, the H6 Air has you covered.</p><h2 id="studio-grade-drivers-for-audiophile-sound">Studio-grade drivers for audiophile sound</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4RhGyd87d2HwoJgDz5WLFb" name="Inzone_H6_ 10.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/4RhGyd87d2HwoJgDz5WLFb.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>It's a good thing that Sony went wired with the H6 Air: Wired headphones are generally better than their wireless counterparts because there's no loss of information and compression occurring over Bluetooth. They transmit uncompressed audio data, leading to high-fidelity sound. Combine that with studio-grade drivers and you've got a winning formula — Sony does, at least.</p><p>The H6 Airs are fitted with 40mm Open-Back Dynamic which you'll also find in the Sony MDR-MV1 studio monitoring headphones. Naturally, as they're gaming cans, these drivers in the H6 Air have been re-tuned for gaming with enhanced bass. But they're still phenomenal for music. </p><p>You can read all about the gaming performance in the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/sony-inzone-h6-air-review">full review</a>, so I'll discuss music quality instead. Hit play on the playlist below to listening along to my testing songs while you read my analysis.</p><iframe allow="" height="390" width="378" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://widget.qobuz.com/playlist/63018398?zone=GB-en"></iframe><p>The first thing I noticed while listening to ‘First Light’ by Lana Del Rey was the expansiveness of the H6 Air. It felt like I was standing in the middle of a crowded room at a gig, and my body was engulfed in the orchestral production. </p><p>The H6 Air feature spatial audio, and the headphones created a fantastic 3D effect in the 007 theme. Lana's "Will you? Will you?" whispers felt like they were positioned at different depths, and like they were swirling around my head instead of through detached left and right channels.</p><p>At the time of writing the review, I was obsessed with ‘Black Water’ by Poets of the Fall, and the song sounded the most beautiful it ever has through these headphones. The opening acoustic guitar carried startling clarity, with the zip of fingers sliding from note to note without sounding too harsh or distorted. The headphones never once got overwhelmed — whether that was when all the other instruments kicked in, or Marko Saaresto hit the highest note.</p><p>Despite being open-back, tight basslines are the H6 Air's specialty too. Airy high frequencies and accurate bass in 'No Chances' by Twenty One Pilots made me love the track even more. The bassline through the H6 Air reverberates in a way that you can feel it in your chest, and the subtle drop in notes felt apparent. </p><p>Lastly, 'Money' by Pink Floyd was another great testing track for the H6 Air, with the clinks of coins balancing well against the blues-based, driving riff played in an unusual 7/4 time signature. </p><h2 id="one-headset-for-two-purposes">One headset for two purposes</h2><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="MALMDEyfcevEbm52E3y5Gb" name="Inzone_H6_ 6.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/MALMDEyfcevEbm52E3y5Gb.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 Sony Inzone H6 Air have quickly become some of my favorite headphones, for gaming and listening to music. They're spacious and expansive, and they're extremely comfortable — perhaps the most comfortable over-ears I've tested so far. Being able to plug them into any device and console you own is a massive advantage, and the wired design means you're getting high-fidelity audio at all times.</p><p>You may still want a pair of wireless headphones for when you're traveling, and of course, open-backs doesn't boast the best active noise cancellation due to the limitations posed by their design. But if you want one pair of wired headphones for both gaming and careful listening, I can't think of a better option.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OdvmQe"></div>                            </div>                            <script src="https://kwizly.com/embed/OdvmQe.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/gaming/gaming-peripherals/sony-inzone-h6-air-review">The Sony Inzone H6 Air is a compelling case to ditch wireless cans and use open-backs for gaming — here’s my honest verdict</a></li><li><a href="https://www.tomsguide.com/audio/bluetooth-speakers/jbl-go-5-versus-jbl-go-4-face-off">I tested the JBL Go 5 vs JBL Go 4 budget Bluetooth speakers — and there’s a clear winner under $60</a></li><li><a href="https://www.tomsguide.com/audio/soundbars/move-over-sonos-this-marshall-soundbar-is-now-my-favorite-for-small-spaces">Move over, Sonos — this Marshall soundbar is now my favorite for small spaces</a></li></ul><div data-widget-type="review" data-model-name="Sony Inzone H6 Air"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The Sony Inzone H6 Air is a compelling case to ditch wireless cans and use open-backs for gaming — here’s my honest verdict ]]></title>
                                                                                                <dc:content><![CDATA[ <p>At the time of writing, open-back headphones designed specifically for gaming haven’t been around for that long, and Sony has just dipped its toe into these waters. The Sony Inzone H6 Air is nothing short of a triumph, and the brand’s first-ever gaming open-backs offer studio-grade sound quality in both gaming and for listening to music.</p><p>Sporting a lightweight build that’s ridiculously comfortable for long gaming sessions, the H6 Air is a 10/10 in the design department. It’s compatible with an array of consoles and devices, making it the only headset you’ll ever need. The 40mm drivers are from Sony’s studio monitoring headphones, tuned here for gaming rather than production, so you know you’re getting best-in-class sound quality — regardless of what you’re playing or listening to. With a decent mic to boot, the H6 Air has quickly become one of my favorite sets of cans.</p><p>Is this the <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">best gaming headset</a> for you? Read my full Sony Inzone H6 Air review to find out.</p><h2 class="article-body__section" id="section-sony-inzone-h6-air-review-specs"><span>Sony Inzone H6 Air review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/Sony-INZONE-Open-Back-Gaming-Headset/dp/B0GT6CX8MV/" target="_blank" rel="nofollow">$199</a> / <a href="https://www.amazon.co.uk/Sony-INZONE-Open-Back-Gaming-Headset-Black/dp/B0GVG68LQK/" target="_blank" rel="nofollow">£179</a></p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Black</p></td></tr><tr><td class="firstcol " ><p><strong>Platforms</strong></p></td><td  ><p>PS5, PS4, Xbox Series X|S, Xbox One, Nintendo Switch 2, Nintendo Switch, PC, iOS, Android</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>3.5mm wired or USB-C Audio Box</p></td></tr><tr><td class="firstcol " ><p><strong>Frequency response</strong></p></td><td  ><p>10Hz-20,000Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Drivers</strong></p></td><td  ><p>40mm Open-Back Dynamic</p></td></tr><tr><td class="firstcol " ><p><strong>Multipoint connectivity</strong></p></td><td  ><p>No</p></td></tr><tr><td class="firstcol " ><p><strong>Paired devices max</strong></p></td><td  ><p>1</p></td></tr><tr><td class="firstcol " ><p><strong>Microphone</strong></p></td><td  ><p>Cardioid unidirectional, detachable boom</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>7.01oz (without cable and mic)</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-sony-inzone-h6-air-review-cheat-sheet"><span>Sony Inzone H6 Air review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>Sony’s first-ever open-back gaming headphones for all-day play</li><li><strong>Who is it for? </strong>Anyone who wants a comfortable headset with studio-grade sound quality</li><li><strong>How much does it cost? </strong>The Sony Inzone H6 Air retails for <a href="https://www.amazon.com/Sony-INZONE-Open-Back-Gaming-Headset/dp/B0GT6CX8MV/" target="_blank" rel="nofollow">$199</a> / <a href="https://www.amazon.co.uk/Sony-INZONE-Open-Back-Gaming-Headset-Black/dp/B0GVG68LQK/" target="_blank" rel="nofollow">£179</a></li><li><strong>What do we like? </strong>The comfortable design, multi-platform compatibility, studio-grade sound, and great mic performance</li><li><strong>What don’t we like? </strong>The underwhelming software</li></ul><h2 class="article-body__section" id="section-sony-inzone-h6-air-review-the-ups"><span>Sony Inzone H6 Air review: The ups</span></h2><p>There’s so much to love about the Sony Inzone H6 Air, from its comfortable open-back design and multi-platform compatibility, to the studio-grade sound quality in video games and music.</p><h2 id="ridiculously-comfortable-for-all-day-play">Ridiculously comfortable for all-day play</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="WC9B4SaikRZxkMfpLEJA5b" name="Inzone_H6_ 5.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/WC9B4SaikRZxkMfpLEJA5b.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>Not only have I reviewed my fair share of gaming headsets, but I’ve extensively used them outside of a work capacity. Comfort level is the first thing I consider before buying (or while testing) a gaming headset, because there’s no point spending any amount of money on an uncomfortable set of cans. The Sony Inzone H6 Air is the most <em>ridiculously</em> comfortable gaming headset I’ve used so far.</p><p>The H6 Air bears striking resemblance to the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/the-new-sony-inzone-h9-ii-is-the-gaming-headset-ive-been-waiting-for-heres-why">Sony Inzone H9 II</a> ($349) but the biggest difference is that the H6 Air is an open-back headset. As is the nature of open-back headphones, the H6 Air offers superior comfort by allowing air to pass through the earcups. On sealed headphones, like the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/fractal-design-scape-review">Fractal Design Scape</a> ($199) and the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-7-gen-2-review">SteelSeries Arctis Nova 7 Gen 2</a> ($199), rear air pressure buildup is common as there’s nowhere for the air to go. By opting for an open-back design, the H6 Air reduces fatigue and eliminates sweat buildup — and I can confirm that.</p><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="w7YDy4PswzPab8BTigQe6a" name="Inzone_H6_ 12.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/w7YDy4PswzPab8BTigQe6a.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I’ve used the H6 Air extensively, and the longest I’ve worn it for has been a nine-hour gaming session. Not once did I feel like my ears were too hot or uncomfortable. Also aiding the H6 Air’s comfortable fit is its lightweight build. The headset weighs just 7.01oz (without cable and mic), making it much lighter than the SteelSeries Arctis Nova 7 Gen 2 (11oz) and the Fractal Design Scape (12oz). The suspended headband helps reduce pressure you’d otherwise feel on the top of their head, while the light nylon ear cushions nestle your ears like two clouds loosely hugging them. No complaints from me in the design and comfort department.</p><h2 id="one-headset-to-rule-them-all">One headset to rule them all</h2><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="4RhGyd87d2HwoJgDz5WLFb" name="Inzone_H6_ 10.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/4RhGyd87d2HwoJgDz5WLFb.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>A big advantage of using a wired headset is that, more often than not, it’s compatible with more consoles and systems than a wireless headset is. The Sony Inzone H6 Air, like all Inzone gear these days, is theoretically PC-gaming-first. However, it comes with a 3.5mm headphone jack as well as a USB-C Audio Box, so it’s compatible with essentially every console you own.</p><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="pukEFSzFSPwNtnMdvRXZ4b" name="Inzone_H6_ 9.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/pukEFSzFSPwNtnMdvRXZ4b.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>This includes PC, macOS, <a href="https://www.tomsguide.com/reviews/ps5">PlayStation 5</a>, PlayStation 4, <a href="https://www.tomsguide.com/reviews/xbox-series-x">Xbox Series X</a>, <a href="https://www.tomsguide.com/reviews/xbox-series-s">Xbox Series S</a>, <a href="https://www.tomsguide.com/gaming/nintendo/nintendo-switch-2-console-review">Nintendo Switch 2</a>, Nintendo Switch, and iOS and Android smartphones. You’ll be able to use it with your <a href="https://www.tomsguide.com/reviews/steam-deck-review-the-nintendo-switch-for-adults">Steam Deck</a> and other handheld consoles too. I tested the headset with my <a href="https://www.tomsguide.com/gaming/playstation/ps5-slim">PS5 Slim</a> by plugging the 3.5mm jack into the DualSense controller, and it worked like a charm.</p><h2 id="exceptional-studio-grade-in-game-sound">Exceptional studio-grade in-game sound</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ARNxpjkG6ju3EE69adJ54b" name="Inzone_H6_ 2.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/ARNxpjkG6ju3EE69adJ54b.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 Sony Inzone H6 Air is an exceptional headset offering detailed, crystal clear sound quality, regardless of the video game genre you’re playing. The headset utilizes 40mm Open-Back Dynamic drivers. You’ll also find these drivers in the Sony MDR-MV1 studio monitoring headphones, but for the H6 Air Sony has re-tuned them for gaming with enhanced bass, and they’ve given me nothing to complain about.</p><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="RB6jSYek8drGvoCiGoQm2a" name="Inzone_H6_ 3.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/RB6jSYek8drGvoCiGoQm2a.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 H6 Air covers a frequency response range of 10Hz-20,000Hz, which is standard for the <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">best gaming headsets</a>, covering from the highest frequencies down to deep bass tones. I was able to hear every soft footstep and every loud explosion with the utmost clarity, and it made for an immersive gaming experience. To test the headset, I played <a href="https://www.tomsguide.com/gaming/clair-obscur-expedition-33-review">Clair Obscur: Expedition 33</a>, <a href="https://www.tomsguide.com/reviews/cyberpunk-2077-phantom-liberty">Cyberpunk 2077</a>, and <a href="https://www.tomsguide.com/reviews/control">Control</a>.</p><p><em><strong>Cyberpunk 2077</strong></em></p><p>In Cyberpunk 2077, I found infiltrating enemy bases stealthily a walk in the park as I could hear NPCs clearly behind closed doors. I could pinpoint their movements exactly, and I made a mental note of their patterns so that I could quietly open the door, take them out, and continue my approach.</p><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="6qt8wfvc82HqhQjRvMeX3b" name="Inzone_H6_ 7.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/6qt8wfvc82HqhQjRvMeX3b.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>This doesn’t mean the bass takes a backseat. Cyberpunk 2077 features a busy, techno soundtrack that often kicks in when you’re fighting an enemy or executing a stealthy takedown. I found the tonal separation to be fantastic, and the soundtrack never once sounded muddy. Even with the soundtrack at its peak, I could still hear enemies flanking me in close quarters combat, which helped me determine the direction of my attack.</p><p><em><strong>Clair Obscur: Expedition 33</strong></em></p><p>I also loved the emphasis on sharp audio cues in Clair Obscur: Expedition 33, which helped me time my parries perfectly in battles. The treble never sounded overzealous or like it cut through the rest of the soundscape. On the contrary, every aspect of the soundstage was perfectly balanced. I could still appreciate the bass-heavy orchestra soundtracking my battles, while appreciating the sound of my magical and physical attacks landing.</p><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="adxW4CdFV9X7674GJWjW4b" name="Inzone_H6_ 4.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/adxW4CdFV9X7674GJWjW4b.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>Roaming the vast open world in Expedition 33 was thoroughly enjoyable too. The gloomy yet vibrant atmosphere of the game was conveyed well through the H6 Air. The transition between my character walking on concrete and then scattered petals was loud and clear as I could hear the soft <em>crunch </em>of the petals.</p><p><em><strong>Control</strong></em></p><p>In a similar vein, the spooky atmosphere in Control was exaggerated by the H6 Air, and it truly felt like <em>I </em>was walking through a derelict, haunted building. Hissing noises in the hallways, droplets trickling down walls, alien-like NPCs croaking, and the protagonist Jesse Faden’s shallow breathing after she’d just sprinted down the hall, all added to my immersion.</p><p>There are plenty of dialogue-heavy cutscenes in Control, and I was able to hear every word spoken with clarity. Words never bled into one another, and I love that the headset made it feel like I was there, with the characters. For instance, in a cavern, the characters’ voices echoed well, but not too much so that it felt unpleasant or like I couldn’t understand what they were saying. If it’s lifelike audio you’re after, the H6 Air should be your port of call.</p><h2 id="superb-for-music-listening-too">Superb for music listening, too</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="x49TPj7jjbrzfZ5qRWvh5a" name="Inzone_H6_ 11.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/x49TPj7jjbrzfZ5qRWvh5a.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>Because the Sony Inzone H6 Air utilizes studio-grade drivers found in monitoring headphones, I had to listen to music to test the headset’s caliber — and I was not disappointed. The opening acoustic guitar in ‘<a href="https://open.qobuz.com/album/jmnk8qepbqz9p" target="_blank" rel="nofollow">Black Water</a>’ by Poets of the Fall had startling clarity, and I could hear the zip of fingers sliding from note to note. When the other instruments kicked in, the headset never got overwhelmed. Sony’s 360 Spatial Sound made the vocals feel like they were swirling around my head rather than playing left or right.</p><p>The H6 Air’s drivers produce tight, accurate bass and clear, airy high frequencies, and this was apparent when listening to ‘<a href="https://open.qobuz.com/album/gcsfc9y5o0or4" target="_blank" rel="nofollow">First Light</a>’ by Lana Del Rey. Although the track doesn’t have a pounding bassline, it provides a subtle backbone to the song, and the bass through the H6 Air sounded nice and airy. This, in turn, made the orchestral crescendo feel grand rather than simply loud.</p><p>The headset creates a great 3D effect with the secondary vocals in ‘First Light’ too. The "Will you? Will you?" whispers felt like they were positioned at different depths, and Lana’s primary vocals had the centerstage here. This made the Bond theme feel more immersive and cinematic.</p><h2 id="great-mic-quality">Great mic quality</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="BnGjzqsaQYRRMha5EaA89a" name="Inzone_H6_ 8.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/BnGjzqsaQYRRMha5EaA89a.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 Sony Inzone H6 Air utilizes a detachable cardioid boom mic. A cardioid mic is like a unidirectional one, with a heart-shaped polar pattern that is most sensitive to sound at the front, and least sensitive at the back. This type of mic is great for gaming headsets, as it ensures that the words coming out of your mouth are the only ones that are heard. While it won’t replace the <a href="https://www.tomsguide.com/best-picks/best-microphones">best microphones</a> for streamers, it’s still decent for a headset.</p><audio src="https://cdn.mos.cms.futurecdn.net/f3n2EVQhdmkRziP5tdAuuW/Sony%20Inzone%20H6%20Air%20-%20Clip%201.mp3"  controls="controls" preload="none"></audio><p>To test the H6 Air’s mic, I first recorded myself with nothing else playing in the background. As you can hear in the clip above, my voice sounds loud and clear. It also sounds textured and true to what I sound like without a microphone. Unlike the similarly priced SteelSeries Arctis Nova 7 Gen 2 and the Fractal Design Scape, my voice doesn’t sound tinny or unpleasant, and there’s no clipping either.</p><audio src="https://cdn.mos.cms.futurecdn.net/aTC5cbry8FBVbJKwU7MguW/Sony%20Inzone%20H6%20Air%20-%20Clip%202.mp3"  controls="controls" preload="none"></audio><p>I then played an episode of Veep in the background, at approximately 50% volume on my phone, to see if the H6 Air isolated my voice. In the clip above, you can hear some background noise (i.e. characters’ voices) but it doesn’t particularly overpower my voice. The plosives are still clear and my words aren’t bleeding into one another. Again, better performance than the other two headsets previously mentioned.</p><h2 class="article-body__section" id="section-sony-inzone-h6-air-review-the-downs"><span>Sony Inzone H6 Air review: The downs</span></h2><p>The only real issue with the Sony Inzone H6 Air is that the companion software is a little underwhelming.</p><h2 id="underwhelming-companion-software">Underwhelming companion software</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1510px;"><p class="vanilla-image-block" style="padding-top:56.29%;"><img id="apSyetUn5riWMSNes6jcT6" name="inzone-h6-air-app" alt="Sony Inzone Hub screenshot" src="https://cdn.mos.cms.futurecdn.net/apSyetUn5riWMSNes6jcT6.jpg" mos="" align="middle" fullscreen="1" width="1510" height="850" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/apSyetUn5riWMSNes6jcT6.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: Sony / Tom's Guide)</span></figcaption></figure><p>To customize the Sony Inzone H6 Air, you’ll need to download <a href="https://www.sony.co.uk/electronics/support/others-software/inzone-hub/software/00279252" target="_blank" rel="nofollow">Inzone Hub</a> on your Windows laptop. There’s no software available on macOS, Android or iOS, so you’ll be left feeling shortchanged if you don’t have a Windows laptop to hand. While Inzone Hub is easy to use, there isn’t much you can do in terms of customization on the H6 Air.</p><p>You’ll need to plug in the H6 Air using the included USB-C Audio Box to customize the headset, and once you’ve adjusted the settings, they’ll be saved to the Audio Box so that you can use them across consoles. Within Inzone Hub, you can customize the 10-band equalizer, adjust the sidetone, and enable spatial sound. There’s also the option to boost the bass or toggle an FPS profile, but I found the former to be overpowering and the latter didn’t really make much difference, as the H6 Air’s already tuned to give you an advantage in competitive gaming.</p><p>Wired cans in general don’t usually have companion apps, or when they do, there isn’t much there in terms of personalization. If you want extensive customization, you might want to consider a wireless headset, like the Fractal Design Scape or the SteelSeries Arctis Nova 7 Gen 2.</p><h2 id="a-little-on-the-pricey-side">A little on the pricey side</h2><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="MALMDEyfcevEbm52E3y5Gb" name="Inzone_H6_ 6.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/MALMDEyfcevEbm52E3y5Gb.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 Sony Inzone H6 Air is a capable and competent gaming headset, and one of the finest I’ve ever tested. It’s a little on the pricey side but before you start panicking, trust me, this headset is worth the premium. The H6 Air retails for <a href="https://www.amazon.com/Sony-INZONE-Open-Back-Gaming-Headset/dp/B0GT6CX8MV/" target="_blank" rel="nofollow">$199</a> / <a href="https://www.amazon.co.uk/Sony-INZONE-Open-Back-Gaming-Headset-Black/dp/B0GVG68LQK/" target="_blank" rel="nofollow">£179 at Amazon</a> and, at the time of writing, hasn’t received any major discounts yet (as it just came out in April 2026).</p><p>But a great thing about the H6 Air is that it doesn’t <em>feel </em>like an overpriced headset. A ridiculously comfortable and lightweight design, studio-grade sound quality and multi-platform compatibility make it worth paying full price for — unlike the SteelSeries Arctis Nova 7 Gen 2 which we thought was $25-$50 overpriced. And hey, the H6 Air is cheaper than the Asus ROG Kithara open-backs, which costs a whopping <a href="https://www.amazon.com/ASUS-ROG-Audiophile-Open-Back-Headphones/dp/B0GG53SPJC/" target="_blank" rel="nofollow">$299</a>.</p><h2 class="article-body__section" id="section-sony-inzone-h6-air-review-verdict"><span>Sony Inzone H6 Air review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="S8G7sxWTGyeaisuB6J6P3a" name="Inzone_H6_.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/S8G7sxWTGyeaisuB6J6P3a.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>“Are open-back headphones good for gaming?” The Sony Inzone H6 Air certainly proves they are. Sony’s first open-back gaming headset is simply outstanding. Packing 40mm studio-grade drivers, the headset delivers well-rounded, fine-tuned sound in video games and music. You feel like you’re the main character. If, like me, you love spending your weekend gaming away, you’ll be pleased to know that the H6 Air is extremely comfortable and fit for the job.</p><p>Would I change anything about the H6 Air? The software could certainly use a bit more <em>oomph</em>, but as I mentioned earlier, that isn’t a dealbreaker. If you want powerful sound quality with exceptional bass, treble and mids, there’s no reason to not get the H6 Air. This headset has quickly become one of the best products I’ve tested so far, and I’m now hesitant to go back to wireless cans.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/sony-inzone-h6-air-review</link>
                                                                            <description>
                            <![CDATA[ The Sony Inzone H6 Air is an exceptionally comfortable open-back gaming headset, boasting studio-grade sound quality in games and while listening to music. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">g9CGrKLNmy2jqWZCpv43RS</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/goBbNKPNj33FbLmrhTC5qZ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 30 Apr 2026 09:22:01 +0000</pubDate>                                                                                                                                <updated>Tue, 09 Jun 2026 10:32:33 +0000</updated>
                                                                                                                                            <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres.&lt;/p&gt;&lt;p&gt;A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/goBbNKPNj33FbLmrhTC5qZ-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A black Sony Inzone H6 Air open-back gaming headset]]></media:description>                                                            <media:text><![CDATA[A black Sony Inzone H6 Air open-back gaming headset]]></media:text>
                                <media:title type="plain"><![CDATA[A black Sony Inzone H6 Air open-back gaming headset]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/goBbNKPNj33FbLmrhTC5qZ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>At the time of writing, open-back headphones designed specifically for gaming haven’t been around for that long, and Sony has just dipped its toe into these waters. The Sony Inzone H6 Air is nothing short of a triumph, and the brand’s first-ever gaming open-backs offer studio-grade sound quality in both gaming and for listening to music.</p><p>Sporting a lightweight build that’s ridiculously comfortable for long gaming sessions, the H6 Air is a 10/10 in the design department. It’s compatible with an array of consoles and devices, making it the only headset you’ll ever need. The 40mm drivers are from Sony’s studio monitoring headphones, tuned here for gaming rather than production, so you know you’re getting best-in-class sound quality — regardless of what you’re playing or listening to. With a decent mic to boot, the H6 Air has quickly become one of my favorite sets of cans.</p><p>Is this the <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">best gaming headset</a> for you? Read my full Sony Inzone H6 Air review to find out.</p><h2 class="article-body__section" id="section-sony-inzone-h6-air-review-specs"><span>Sony Inzone H6 Air review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/Sony-INZONE-Open-Back-Gaming-Headset/dp/B0GT6CX8MV/" target="_blank" rel="nofollow">$199</a> / <a href="https://www.amazon.co.uk/Sony-INZONE-Open-Back-Gaming-Headset-Black/dp/B0GVG68LQK/" target="_blank" rel="nofollow">£179</a></p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Black</p></td></tr><tr><td class="firstcol " ><p><strong>Platforms</strong></p></td><td  ><p>PS5, PS4, Xbox Series X|S, Xbox One, Nintendo Switch 2, Nintendo Switch, PC, iOS, Android</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>3.5mm wired or USB-C Audio Box</p></td></tr><tr><td class="firstcol " ><p><strong>Frequency response</strong></p></td><td  ><p>10Hz-20,000Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Drivers</strong></p></td><td  ><p>40mm Open-Back Dynamic</p></td></tr><tr><td class="firstcol " ><p><strong>Multipoint connectivity</strong></p></td><td  ><p>No</p></td></tr><tr><td class="firstcol " ><p><strong>Paired devices max</strong></p></td><td  ><p>1</p></td></tr><tr><td class="firstcol " ><p><strong>Microphone</strong></p></td><td  ><p>Cardioid unidirectional, detachable boom</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>7.01oz (without cable and mic)</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-sony-inzone-h6-air-review-cheat-sheet"><span>Sony Inzone H6 Air review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>Sony’s first-ever open-back gaming headphones for all-day play</li><li><strong>Who is it for? </strong>Anyone who wants a comfortable headset with studio-grade sound quality</li><li><strong>How much does it cost? </strong>The Sony Inzone H6 Air retails for <a href="https://www.amazon.com/Sony-INZONE-Open-Back-Gaming-Headset/dp/B0GT6CX8MV/" target="_blank" rel="nofollow">$199</a> / <a href="https://www.amazon.co.uk/Sony-INZONE-Open-Back-Gaming-Headset-Black/dp/B0GVG68LQK/" target="_blank" rel="nofollow">£179</a></li><li><strong>What do we like? </strong>The comfortable design, multi-platform compatibility, studio-grade sound, and great mic performance</li><li><strong>What don’t we like? </strong>The underwhelming software</li></ul><h2 class="article-body__section" id="section-sony-inzone-h6-air-review-the-ups"><span>Sony Inzone H6 Air review: The ups</span></h2><p>There’s so much to love about the Sony Inzone H6 Air, from its comfortable open-back design and multi-platform compatibility, to the studio-grade sound quality in video games and music.</p><h2 id="ridiculously-comfortable-for-all-day-play">Ridiculously comfortable for all-day play</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="WC9B4SaikRZxkMfpLEJA5b" name="Inzone_H6_ 5.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/WC9B4SaikRZxkMfpLEJA5b.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>Not only have I reviewed my fair share of gaming headsets, but I’ve extensively used them outside of a work capacity. Comfort level is the first thing I consider before buying (or while testing) a gaming headset, because there’s no point spending any amount of money on an uncomfortable set of cans. The Sony Inzone H6 Air is the most <em>ridiculously</em> comfortable gaming headset I’ve used so far.</p><p>The H6 Air bears striking resemblance to the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/the-new-sony-inzone-h9-ii-is-the-gaming-headset-ive-been-waiting-for-heres-why">Sony Inzone H9 II</a> ($349) but the biggest difference is that the H6 Air is an open-back headset. As is the nature of open-back headphones, the H6 Air offers superior comfort by allowing air to pass through the earcups. On sealed headphones, like the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/fractal-design-scape-review">Fractal Design Scape</a> ($199) and the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-7-gen-2-review">SteelSeries Arctis Nova 7 Gen 2</a> ($199), rear air pressure buildup is common as there’s nowhere for the air to go. By opting for an open-back design, the H6 Air reduces fatigue and eliminates sweat buildup — and I can confirm that.</p><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="w7YDy4PswzPab8BTigQe6a" name="Inzone_H6_ 12.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/w7YDy4PswzPab8BTigQe6a.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I’ve used the H6 Air extensively, and the longest I’ve worn it for has been a nine-hour gaming session. Not once did I feel like my ears were too hot or uncomfortable. Also aiding the H6 Air’s comfortable fit is its lightweight build. The headset weighs just 7.01oz (without cable and mic), making it much lighter than the SteelSeries Arctis Nova 7 Gen 2 (11oz) and the Fractal Design Scape (12oz). The suspended headband helps reduce pressure you’d otherwise feel on the top of their head, while the light nylon ear cushions nestle your ears like two clouds loosely hugging them. No complaints from me in the design and comfort department.</p><h2 id="one-headset-to-rule-them-all">One headset to rule them all</h2><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="4RhGyd87d2HwoJgDz5WLFb" name="Inzone_H6_ 10.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/4RhGyd87d2HwoJgDz5WLFb.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>A big advantage of using a wired headset is that, more often than not, it’s compatible with more consoles and systems than a wireless headset is. The Sony Inzone H6 Air, like all Inzone gear these days, is theoretically PC-gaming-first. However, it comes with a 3.5mm headphone jack as well as a USB-C Audio Box, so it’s compatible with essentially every console you own.</p><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="pukEFSzFSPwNtnMdvRXZ4b" name="Inzone_H6_ 9.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/pukEFSzFSPwNtnMdvRXZ4b.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>This includes PC, macOS, <a href="https://www.tomsguide.com/reviews/ps5">PlayStation 5</a>, PlayStation 4, <a href="https://www.tomsguide.com/reviews/xbox-series-x">Xbox Series X</a>, <a href="https://www.tomsguide.com/reviews/xbox-series-s">Xbox Series S</a>, <a href="https://www.tomsguide.com/gaming/nintendo/nintendo-switch-2-console-review">Nintendo Switch 2</a>, Nintendo Switch, and iOS and Android smartphones. You’ll be able to use it with your <a href="https://www.tomsguide.com/reviews/steam-deck-review-the-nintendo-switch-for-adults">Steam Deck</a> and other handheld consoles too. I tested the headset with my <a href="https://www.tomsguide.com/gaming/playstation/ps5-slim">PS5 Slim</a> by plugging the 3.5mm jack into the DualSense controller, and it worked like a charm.</p><h2 id="exceptional-studio-grade-in-game-sound">Exceptional studio-grade in-game sound</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ARNxpjkG6ju3EE69adJ54b" name="Inzone_H6_ 2.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/ARNxpjkG6ju3EE69adJ54b.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 Sony Inzone H6 Air is an exceptional headset offering detailed, crystal clear sound quality, regardless of the video game genre you’re playing. The headset utilizes 40mm Open-Back Dynamic drivers. You’ll also find these drivers in the Sony MDR-MV1 studio monitoring headphones, but for the H6 Air Sony has re-tuned them for gaming with enhanced bass, and they’ve given me nothing to complain about.</p><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="RB6jSYek8drGvoCiGoQm2a" name="Inzone_H6_ 3.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/RB6jSYek8drGvoCiGoQm2a.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 H6 Air covers a frequency response range of 10Hz-20,000Hz, which is standard for the <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">best gaming headsets</a>, covering from the highest frequencies down to deep bass tones. I was able to hear every soft footstep and every loud explosion with the utmost clarity, and it made for an immersive gaming experience. To test the headset, I played <a href="https://www.tomsguide.com/gaming/clair-obscur-expedition-33-review">Clair Obscur: Expedition 33</a>, <a href="https://www.tomsguide.com/reviews/cyberpunk-2077-phantom-liberty">Cyberpunk 2077</a>, and <a href="https://www.tomsguide.com/reviews/control">Control</a>.</p><p><em><strong>Cyberpunk 2077</strong></em></p><p>In Cyberpunk 2077, I found infiltrating enemy bases stealthily a walk in the park as I could hear NPCs clearly behind closed doors. I could pinpoint their movements exactly, and I made a mental note of their patterns so that I could quietly open the door, take them out, and continue my approach.</p><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="6qt8wfvc82HqhQjRvMeX3b" name="Inzone_H6_ 7.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/6qt8wfvc82HqhQjRvMeX3b.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>This doesn’t mean the bass takes a backseat. Cyberpunk 2077 features a busy, techno soundtrack that often kicks in when you’re fighting an enemy or executing a stealthy takedown. I found the tonal separation to be fantastic, and the soundtrack never once sounded muddy. Even with the soundtrack at its peak, I could still hear enemies flanking me in close quarters combat, which helped me determine the direction of my attack.</p><p><em><strong>Clair Obscur: Expedition 33</strong></em></p><p>I also loved the emphasis on sharp audio cues in Clair Obscur: Expedition 33, which helped me time my parries perfectly in battles. The treble never sounded overzealous or like it cut through the rest of the soundscape. On the contrary, every aspect of the soundstage was perfectly balanced. I could still appreciate the bass-heavy orchestra soundtracking my battles, while appreciating the sound of my magical and physical attacks landing.</p><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="adxW4CdFV9X7674GJWjW4b" name="Inzone_H6_ 4.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/adxW4CdFV9X7674GJWjW4b.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>Roaming the vast open world in Expedition 33 was thoroughly enjoyable too. The gloomy yet vibrant atmosphere of the game was conveyed well through the H6 Air. The transition between my character walking on concrete and then scattered petals was loud and clear as I could hear the soft <em>crunch </em>of the petals.</p><p><em><strong>Control</strong></em></p><p>In a similar vein, the spooky atmosphere in Control was exaggerated by the H6 Air, and it truly felt like <em>I </em>was walking through a derelict, haunted building. Hissing noises in the hallways, droplets trickling down walls, alien-like NPCs croaking, and the protagonist Jesse Faden’s shallow breathing after she’d just sprinted down the hall, all added to my immersion.</p><p>There are plenty of dialogue-heavy cutscenes in Control, and I was able to hear every word spoken with clarity. Words never bled into one another, and I love that the headset made it feel like I was there, with the characters. For instance, in a cavern, the characters’ voices echoed well, but not too much so that it felt unpleasant or like I couldn’t understand what they were saying. If it’s lifelike audio you’re after, the H6 Air should be your port of call.</p><h2 id="superb-for-music-listening-too">Superb for music listening, too</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="x49TPj7jjbrzfZ5qRWvh5a" name="Inzone_H6_ 11.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/x49TPj7jjbrzfZ5qRWvh5a.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>Because the Sony Inzone H6 Air utilizes studio-grade drivers found in monitoring headphones, I had to listen to music to test the headset’s caliber — and I was not disappointed. The opening acoustic guitar in ‘<a href="https://open.qobuz.com/album/jmnk8qepbqz9p" target="_blank" rel="nofollow">Black Water</a>’ by Poets of the Fall had startling clarity, and I could hear the zip of fingers sliding from note to note. When the other instruments kicked in, the headset never got overwhelmed. Sony’s 360 Spatial Sound made the vocals feel like they were swirling around my head rather than playing left or right.</p><p>The H6 Air’s drivers produce tight, accurate bass and clear, airy high frequencies, and this was apparent when listening to ‘<a href="https://open.qobuz.com/album/gcsfc9y5o0or4" target="_blank" rel="nofollow">First Light</a>’ by Lana Del Rey. Although the track doesn’t have a pounding bassline, it provides a subtle backbone to the song, and the bass through the H6 Air sounded nice and airy. This, in turn, made the orchestral crescendo feel grand rather than simply loud.</p><p>The headset creates a great 3D effect with the secondary vocals in ‘First Light’ too. The "Will you? Will you?" whispers felt like they were positioned at different depths, and Lana’s primary vocals had the centerstage here. This made the Bond theme feel more immersive and cinematic.</p><h2 id="great-mic-quality">Great mic quality</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="BnGjzqsaQYRRMha5EaA89a" name="Inzone_H6_ 8.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/BnGjzqsaQYRRMha5EaA89a.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 Sony Inzone H6 Air utilizes a detachable cardioid boom mic. A cardioid mic is like a unidirectional one, with a heart-shaped polar pattern that is most sensitive to sound at the front, and least sensitive at the back. This type of mic is great for gaming headsets, as it ensures that the words coming out of your mouth are the only ones that are heard. While it won’t replace the <a href="https://www.tomsguide.com/best-picks/best-microphones">best microphones</a> for streamers, it’s still decent for a headset.</p><audio src="https://cdn.mos.cms.futurecdn.net/f3n2EVQhdmkRziP5tdAuuW/Sony%20Inzone%20H6%20Air%20-%20Clip%201.mp3"  controls="controls" preload="none"></audio><p>To test the H6 Air’s mic, I first recorded myself with nothing else playing in the background. As you can hear in the clip above, my voice sounds loud and clear. It also sounds textured and true to what I sound like without a microphone. Unlike the similarly priced SteelSeries Arctis Nova 7 Gen 2 and the Fractal Design Scape, my voice doesn’t sound tinny or unpleasant, and there’s no clipping either.</p><audio src="https://cdn.mos.cms.futurecdn.net/aTC5cbry8FBVbJKwU7MguW/Sony%20Inzone%20H6%20Air%20-%20Clip%202.mp3"  controls="controls" preload="none"></audio><p>I then played an episode of Veep in the background, at approximately 50% volume on my phone, to see if the H6 Air isolated my voice. In the clip above, you can hear some background noise (i.e. characters’ voices) but it doesn’t particularly overpower my voice. The plosives are still clear and my words aren’t bleeding into one another. Again, better performance than the other two headsets previously mentioned.</p><h2 class="article-body__section" id="section-sony-inzone-h6-air-review-the-downs"><span>Sony Inzone H6 Air review: The downs</span></h2><p>The only real issue with the Sony Inzone H6 Air is that the companion software is a little underwhelming.</p><h2 id="underwhelming-companion-software">Underwhelming companion software</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1510px;"><p class="vanilla-image-block" style="padding-top:56.29%;"><img id="apSyetUn5riWMSNes6jcT6" name="inzone-h6-air-app" alt="Sony Inzone Hub screenshot" src="https://cdn.mos.cms.futurecdn.net/apSyetUn5riWMSNes6jcT6.jpg" mos="" align="middle" fullscreen="1" width="1510" height="850" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/apSyetUn5riWMSNes6jcT6.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: Sony / Tom's Guide)</span></figcaption></figure><p>To customize the Sony Inzone H6 Air, you’ll need to download <a href="https://www.sony.co.uk/electronics/support/others-software/inzone-hub/software/00279252" target="_blank" rel="nofollow">Inzone Hub</a> on your Windows laptop. There’s no software available on macOS, Android or iOS, so you’ll be left feeling shortchanged if you don’t have a Windows laptop to hand. While Inzone Hub is easy to use, there isn’t much you can do in terms of customization on the H6 Air.</p><p>You’ll need to plug in the H6 Air using the included USB-C Audio Box to customize the headset, and once you’ve adjusted the settings, they’ll be saved to the Audio Box so that you can use them across consoles. Within Inzone Hub, you can customize the 10-band equalizer, adjust the sidetone, and enable spatial sound. There’s also the option to boost the bass or toggle an FPS profile, but I found the former to be overpowering and the latter didn’t really make much difference, as the H6 Air’s already tuned to give you an advantage in competitive gaming.</p><p>Wired cans in general don’t usually have companion apps, or when they do, there isn’t much there in terms of personalization. If you want extensive customization, you might want to consider a wireless headset, like the Fractal Design Scape or the SteelSeries Arctis Nova 7 Gen 2.</p><h2 id="a-little-on-the-pricey-side">A little on the pricey side</h2><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="MALMDEyfcevEbm52E3y5Gb" name="Inzone_H6_ 6.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/MALMDEyfcevEbm52E3y5Gb.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 Sony Inzone H6 Air is a capable and competent gaming headset, and one of the finest I’ve ever tested. It’s a little on the pricey side but before you start panicking, trust me, this headset is worth the premium. The H6 Air retails for <a href="https://www.amazon.com/Sony-INZONE-Open-Back-Gaming-Headset/dp/B0GT6CX8MV/" target="_blank" rel="nofollow">$199</a> / <a href="https://www.amazon.co.uk/Sony-INZONE-Open-Back-Gaming-Headset-Black/dp/B0GVG68LQK/" target="_blank" rel="nofollow">£179 at Amazon</a> and, at the time of writing, hasn’t received any major discounts yet (as it just came out in April 2026).</p><p>But a great thing about the H6 Air is that it doesn’t <em>feel </em>like an overpriced headset. A ridiculously comfortable and lightweight design, studio-grade sound quality and multi-platform compatibility make it worth paying full price for — unlike the SteelSeries Arctis Nova 7 Gen 2 which we thought was $25-$50 overpriced. And hey, the H6 Air is cheaper than the Asus ROG Kithara open-backs, which costs a whopping <a href="https://www.amazon.com/ASUS-ROG-Audiophile-Open-Back-Headphones/dp/B0GG53SPJC/" target="_blank" rel="nofollow">$299</a>.</p><h2 class="article-body__section" id="section-sony-inzone-h6-air-review-verdict"><span>Sony Inzone H6 Air review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="S8G7sxWTGyeaisuB6J6P3a" name="Inzone_H6_.JPG" alt="A black Sony Inzone H6 Air open-back gaming headset" src="https://cdn.mos.cms.futurecdn.net/S8G7sxWTGyeaisuB6J6P3a.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>“Are open-back headphones good for gaming?” The Sony Inzone H6 Air certainly proves they are. Sony’s first open-back gaming headset is simply outstanding. Packing 40mm studio-grade drivers, the headset delivers well-rounded, fine-tuned sound in video games and music. You feel like you’re the main character. If, like me, you love spending your weekend gaming away, you’ll be pleased to know that the H6 Air is extremely comfortable and fit for the job.</p><p>Would I change anything about the H6 Air? The software could certainly use a bit more <em>oomph</em>, but as I mentioned earlier, that isn’t a dealbreaker. If you want powerful sound quality with exceptional bass, treble and mids, there’s no reason to not get the H6 Air. This headset has quickly become one of the best products I’ve tested so far, and I’m now hesitant to go back to wireless cans.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I'm a lifelong gamer, and I can't wait to try the Steam Controller — 3 reasons why ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Steam Controller is almost here, and I couldn’t be more excited. The first wave of <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steam-controller-review-roundup">Steam Controller reviews</a> began circulating today (May 27), and they’re almost universally positive. I was already on board when Valve announced the controller and the <a href="https://www.tomsguide.com/gaming/pc-gaming/valve-steam-machine-console-just-announced-6x-more-powerful-than-steam-deck">Steam Machine</a>, but after reading some reviews, I’m even more eager to get hands-on with this peripheral.</p><p>This isn’t the same <a href="https://www.tomsguide.com/us/valve-steam-controller,review-3263.html">Steam Controller</a> from 11 years ago. It features a brand-new, more ergonomic design. Standout features include TMR thumbsticks, large touchpads, and a unique USB dongle that also serves as a charger. Though the controller looks large and unwieldy, reviewers say it feels extremely comfortable.</p><p>I’ll have a full review once I’ve had some hands-on time with the Steam Controller. For now, here are the three main reasons I’m excited to try it.</p><div class="product"><a data-dimension112="bb94633b-4a78-4e73-8b3f-34095a4597e7" data-action="Deal Block" data-label="Steam Controller" data-dimension48="Steam Controller" 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. It's not on sale yet, but the product page says it will be available on May 4.<br><a class="view-deal button" href="https://store.steampowered.com/sale/steamcontroller" target="_blank" rel="nofollow" data-dimension112="bb94633b-4a78-4e73-8b3f-34095a4597e7" data-action="Deal Block" data-label="Steam Controller" data-dimension48="Steam Controller" data-dimension25="$99">View Deal</a></p></div><h2 id="tmr-thumbsticks">TMR thumbsticks</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/a55UIaiTE-A" allowfullscreen></iframe></div></div><p>Hall Effect magnetic sticks and buttons have been all the rage for gaming controllers in recent years, but Valve has taken the next step by using more advanced TMR technology. In short, these sticks should be even less prone to stick drift because they use magnetic sensing with no physical contact, unlike traditional analog sticks. This should, in theory, keep the sticks performing like new for many years.</p><p>The <a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-just-tested-the-new-scuf-valor-pro-controller-and-its-a-must-have-for-pc-gamers">Scuf Valor Pro</a> controller I reviewed also features TMR sticks, which I find extremely smooth and responsive. Given that the Steam Controller uses the same technology, I’m expecting a similar experience. Thankfully, virtually all reviews I’ve seen say the sticks are great to use and extremely responsive.</p><p>I’ll need to test the controller’s thumbsticks for myself to see if they’re up to snuff, but I have faith they’ll be as great as I imagine. This alone could make the relatively steep $99 asking price more than worth it—but there are other features I’m excited about as well.</p><h2 id="customization">Customization</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6xBrL6Zv4c8cVa3fWMuZtQ" name="image (1)" alt="Valve Steam Machine, Steam Frame, and Steam Controller devices" src="https://cdn.mos.cms.futurecdn.net/6xBrL6Zv4c8cVa3fWMuZtQ.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Valve)</span></figcaption></figure><p>Since it’s designed for PC gaming, the Steam Controller is highly customizable and reprogrammable, so you can adjust it for whatever game you’re playing.</p><p>You can remap every digital control to virtually any PC input, such as keystrokes, gamepad buttons, mouse clicks, or more. Reviewers say that sensitivities for analog sticks, triggers, touchpads, and gyro are also adjustable. For instance, triggers support separate actions for half-pull and full-pull, allowing for more in-game actions.</p><p>Some reviewers say that programming the controller can be daunting because there are so many customization options. Given the numerous inputs, I’m inclined to believe this.</p><p>I’m eager to dive into the Steam software configurator to explore all the customization options. If said options are as robust as reviewers claim, it’s understandable why so many of them now consider this the perfect PC gaming controller.</p><h2 id="battery-life-and-charging">Battery life and charging</h2><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:60.68%;"><img id="p7bernaLEm4CdAJq4wuD8f" name="SC_front_b" alt="Valve Steam Machine" src="https://cdn.mos.cms.futurecdn.net/p7bernaLEm4CdAJq4wuD8f.jpg" mos="" align="middle" fullscreen="" width="3840" height="2330" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Valve)</span></figcaption></figure><p>Valve claims the Steam Controller can last 35+ hours on a single charge. Reviewers who tested the controller said this claim isn’t just boasting, as none of them had the controller run out of power even during extended sessions. Considering how the PS5 DualSense lasts eight hours if you’re lucky, over 35 hours of endurance would be incredible.</p><p>Charging the controller is interesting because it’s done via the included “Steam Controller Puck.” This is a small 2.4GHz USB dongle that doubles as a magnetic charging dock and snaps onto pins on the back of the controller. The puck connects to your PC or Steam Deck via a 5-foot USB cable. Before you ask, the cable connects to the puck via a USB-C port, in case you want to use a different length cable. Additionally, there’s a standard USB-C port on top of the controller if you want to charge it that way.</p><p>The only concern I have is that the puck reportedly connects only one way and can be finicky on some desks. Bluetooth is supported as a backup, but it’s not recommended for the best performance, as <a href="https://gizmodo.com/steam-controller-review-trackpads-change-everything-for-pc-gaming-2000751120" target="_blank">Gizmodo</a> notes. This, like everything else, is something I’ll need to experience firsthand to see how it works.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-evvmme"></div>                            </div>                            <script src="https://kwizly.com/embed/evvmme.js" async></script><h2 id="outlook-4">Outlook</h2><p>With most reviewers saying the Steam Controller is now their preferred way to play PC games, I’m very stoked to try it for myself. The original Steam Controller was unconventional and polarizing, so it’s good to see the company release a controller that has received so much universal praise.</p><p>Stay tuned for more updates on the Steam Controller, and let us know in the comments if this is a peripheral you’re interested in.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/gaming/steam-machine-pricing-may-have-just-leaked-by-retailer-and-its-not-cheap">Steam Machine pricing may have just leaked by retailer</a></li><li><a href="https://www.tomsguide.com/gaming/pc-gaming/steam-machine-delayed-as-valve-will-revisit-the-cost-because-of-the-ram-price-crisis">Steam Machine delayed</a></li><li><a href="https://www.tomsguide.com/gaming/pc-gaming/i-might-ditch-my-gaming-pc-for-the-steam-machine-heres-why">I might ditch my gaming PC for the Steam Machine</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/im-a-lifelong-gamer-and-i-cant-wait-to-try-the-steam-controller-3-reasons-why</link>
                                                                            <description>
                            <![CDATA[ The Steam Controller arrives on May 4, and I can't wait to try it. Here are the top 3 reasons why this could be the best PC game controller yet. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">pbL7GG7gvAyLNzPWKPcT2B</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/pCdaysxcM5mpT5CdE2DmhV-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 28 Apr 2026 05:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></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/pCdaysxcM5mpT5CdE2DmhV-1280-80.jpg">
                                                            <media:credit><![CDATA[Valve]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A still image showing the Steam Controller]]></media:description>                                                            <media:text><![CDATA[A still image showing the Steam Controller]]></media:text>
                                <media:title type="plain"><![CDATA[A still image showing the Steam Controller]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/pCdaysxcM5mpT5CdE2DmhV-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Steam Controller is almost here, and I couldn’t be more excited. The first wave of <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steam-controller-review-roundup">Steam Controller reviews</a> began circulating today (May 27), and they’re almost universally positive. I was already on board when Valve announced the controller and the <a href="https://www.tomsguide.com/gaming/pc-gaming/valve-steam-machine-console-just-announced-6x-more-powerful-than-steam-deck">Steam Machine</a>, but after reading some reviews, I’m even more eager to get hands-on with this peripheral.</p><p>This isn’t the same <a href="https://www.tomsguide.com/us/valve-steam-controller,review-3263.html">Steam Controller</a> from 11 years ago. It features a brand-new, more ergonomic design. Standout features include TMR thumbsticks, large touchpads, and a unique USB dongle that also serves as a charger. Though the controller looks large and unwieldy, reviewers say it feels extremely comfortable.</p><p>I’ll have a full review once I’ve had some hands-on time with the Steam Controller. For now, here are the three main reasons I’m excited to try it.</p><div class="product"><a data-dimension112="bb94633b-4a78-4e73-8b3f-34095a4597e7" data-action="Deal Block" data-label="Steam Controller" data-dimension48="Steam Controller" 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. It's not on sale yet, but the product page says it will be available on May 4.<br><a class="view-deal button" href="https://store.steampowered.com/sale/steamcontroller" target="_blank" rel="nofollow" data-dimension112="bb94633b-4a78-4e73-8b3f-34095a4597e7" data-action="Deal Block" data-label="Steam Controller" data-dimension48="Steam Controller" data-dimension25="$99">View Deal</a></p></div><h2 id="tmr-thumbsticks">TMR thumbsticks</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/a55UIaiTE-A" allowfullscreen></iframe></div></div><p>Hall Effect magnetic sticks and buttons have been all the rage for gaming controllers in recent years, but Valve has taken the next step by using more advanced TMR technology. In short, these sticks should be even less prone to stick drift because they use magnetic sensing with no physical contact, unlike traditional analog sticks. This should, in theory, keep the sticks performing like new for many years.</p><p>The <a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-just-tested-the-new-scuf-valor-pro-controller-and-its-a-must-have-for-pc-gamers">Scuf Valor Pro</a> controller I reviewed also features TMR sticks, which I find extremely smooth and responsive. Given that the Steam Controller uses the same technology, I’m expecting a similar experience. Thankfully, virtually all reviews I’ve seen say the sticks are great to use and extremely responsive.</p><p>I’ll need to test the controller’s thumbsticks for myself to see if they’re up to snuff, but I have faith they’ll be as great as I imagine. This alone could make the relatively steep $99 asking price more than worth it—but there are other features I’m excited about as well.</p><h2 id="customization">Customization</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6xBrL6Zv4c8cVa3fWMuZtQ" name="image (1)" alt="Valve Steam Machine, Steam Frame, and Steam Controller devices" src="https://cdn.mos.cms.futurecdn.net/6xBrL6Zv4c8cVa3fWMuZtQ.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Valve)</span></figcaption></figure><p>Since it’s designed for PC gaming, the Steam Controller is highly customizable and reprogrammable, so you can adjust it for whatever game you’re playing.</p><p>You can remap every digital control to virtually any PC input, such as keystrokes, gamepad buttons, mouse clicks, or more. Reviewers say that sensitivities for analog sticks, triggers, touchpads, and gyro are also adjustable. For instance, triggers support separate actions for half-pull and full-pull, allowing for more in-game actions.</p><p>Some reviewers say that programming the controller can be daunting because there are so many customization options. Given the numerous inputs, I’m inclined to believe this.</p><p>I’m eager to dive into the Steam software configurator to explore all the customization options. If said options are as robust as reviewers claim, it’s understandable why so many of them now consider this the perfect PC gaming controller.</p><h2 id="battery-life-and-charging">Battery life and charging</h2><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:60.68%;"><img id="p7bernaLEm4CdAJq4wuD8f" name="SC_front_b" alt="Valve Steam Machine" src="https://cdn.mos.cms.futurecdn.net/p7bernaLEm4CdAJq4wuD8f.jpg" mos="" align="middle" fullscreen="" width="3840" height="2330" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Valve)</span></figcaption></figure><p>Valve claims the Steam Controller can last 35+ hours on a single charge. Reviewers who tested the controller said this claim isn’t just boasting, as none of them had the controller run out of power even during extended sessions. Considering how the PS5 DualSense lasts eight hours if you’re lucky, over 35 hours of endurance would be incredible.</p><p>Charging the controller is interesting because it’s done via the included “Steam Controller Puck.” This is a small 2.4GHz USB dongle that doubles as a magnetic charging dock and snaps onto pins on the back of the controller. The puck connects to your PC or Steam Deck via a 5-foot USB cable. Before you ask, the cable connects to the puck via a USB-C port, in case you want to use a different length cable. Additionally, there’s a standard USB-C port on top of the controller if you want to charge it that way.</p><p>The only concern I have is that the puck reportedly connects only one way and can be finicky on some desks. Bluetooth is supported as a backup, but it’s not recommended for the best performance, as <a href="https://gizmodo.com/steam-controller-review-trackpads-change-everything-for-pc-gaming-2000751120" target="_blank">Gizmodo</a> notes. This, like everything else, is something I’ll need to experience firsthand to see how it works.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-evvmme"></div>                            </div>                            <script src="https://kwizly.com/embed/evvmme.js" async></script><h2 id="outlook-4">Outlook</h2><p>With most reviewers saying the Steam Controller is now their preferred way to play PC games, I’m very stoked to try it for myself. The original Steam Controller was unconventional and polarizing, so it’s good to see the company release a controller that has received so much universal praise.</p><p>Stay tuned for more updates on the Steam Controller, and let us know in the comments if this is a peripheral you’re interested in.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/gaming/steam-machine-pricing-may-have-just-leaked-by-retailer-and-its-not-cheap">Steam Machine pricing may have just leaked by retailer</a></li><li><a href="https://www.tomsguide.com/gaming/pc-gaming/steam-machine-delayed-as-valve-will-revisit-the-cost-because-of-the-ram-price-crisis">Steam Machine delayed</a></li><li><a href="https://www.tomsguide.com/gaming/pc-gaming/i-might-ditch-my-gaming-pc-for-the-steam-machine-heres-why">I might ditch my gaming PC for the Steam Machine</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Steam Controller reviews are in: 'I can’t imagine playing my PC games with anything else' ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The first reviews of the Steam Controller have gone live. This peripheral is effectively a redesign of the original Steam Controller from over a decade ago, and is meant to complement the upcoming Steam Machine. It’s also compatible with PC, and of course, Valve’s own Steam Deck.</p><p>As we reported over the weekend, an industry insider named <a href="https://x.com/SadlyItsBradley/status/2046363689721245922" target="_blank"><u>Brad Lynch on X</u></a> found evidence of a "<a href="https://www.tomsguide.com/gaming/gaming-peripherals/steam-controller-launch-imminent-as-valve-uploads-secret-unboxing-heres-what-you-need-to-know"><u>Steam Controller Unboxing</u></a>" video that was uploaded to SteamDB. Soon after, reports of a potential Steam Controller price leak circulated online, suggesting the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steam-controller-price-leaked-online-and-id-start-saving-now"><u>peripheral would cost $99</u></a>. Given how reviews have gone live, it seems some folks spilled the beans prematurely.</p><p>The Steam Controller features TMR thumbsticks, rumble support, capacitive touch, and gyro controls. Like most controllers, it has four face buttons, four shoulder buttons, and the aforementioned pair of thumbsticks. Unique inputs include the large touchpads beneath the thumbsticks and four back buttons.</p><p>We’ll have our review of the Steam Controller soon. For now, here’s what tech reviewers are saying about Valve’s new peripheral.</p><div class="product"><a data-dimension112="821eeade-f5f9-4b44-b5e7-003106aa70fa" data-action="Deal Block" data-label="Steam Controller" data-dimension48="Steam Controller" 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. It's not on sale yet, but the product page says it will be available on May 4.<br><a class="view-deal button" href="https://store.steampowered.com/sale/steamcontroller" target="_blank" rel="nofollow" data-dimension112="821eeade-f5f9-4b44-b5e7-003106aa70fa" data-action="Deal Block" data-label="Steam Controller" data-dimension48="Steam Controller" data-dimension25="$99">View Deal</a></p></div><h2 id="what-are-reviewers-saying-about-the-steam-controller">What are reviewers saying about the Steam Controller?</h2><p>Steam Controller reviews are largely positive, with many sites and YouTube channels saying this is now their favorite PC game controller. That’s high praise, especially considering how controversial the original Steam Controller was.</p><p><a href="https://www.techradar.com/computing/peripherals-accessories/valve-steam-controller-2026" target="_blank">TechRadar’</a>s Matt Hanson says the Steam Controller is “a massive improvement over the flawed original, offering some great innovations while also coming with a more conventional — and user-friendly —design.”</p><p>This is a sentiment that <a href="https://www.pcmag.com/reviews/valve-steam-controller-2026?test_uuid=06f2t2mKxAWPbc1xmAn5J4t&test_variant=B" target="_blank">PCMag</a>’s Will Greenwald shares, saying that the controller is “fundamentally better in every way thanks to a deep feature set, terrific feel, and customizable controls like those on the Steam Deck.”</p><p>“I’ve spent so much time with Valve’s second attempt at its Steam Controller that I can’t imagine playing my PC games with anything else,” says <a href="https://www.polygon.com/steam-controller-2026-review/" target="_blank">Polygon</a>’s Giovanni Colantonio. Similarly, <a href="https://www.youtube.com/watch?v=I2RVnFP5rBI" target="_blank">IGN</a>’s Bo Moore said it was his “favorite controller for PC gaming.”</p><div><blockquote><p>I’ve spent so much time with Valve’s second attempt at its Steam Controller that I can’t imagine playing my PC games with anything else.</p><p>Giovanni Colantonio</p></blockquote></div><p>So what do reviewers love about the Steam Controller? Matt Hanson says the more conventional design is a major factor. “This makes it much easier to get to grips with if you’re used to other gamepads.” Gizmodo’s Kyle Barr echoes this sentiment, saying that the “new Steam Controller feels far more natural for anybody used to a PS5 DualSense-like design.”</p><p>The new thumbsticks also won over reviewers, thanks to TMR technology for improved performance. Not only does this lead to quicker actions, but it also allows them to glide smoothly.</p><p>“The new thumbsticks are no slouches, either, thanks to tunneling magneto-resistance (TMR) technology, which is the tech of choice for most premium gamepads. This uses small magnets to measure even the smallest of movements, which improves precision, and excels in genres such as shooters and racing games, where even the smallest of movements need to be accurately recorded and reflected in-game,” says Matt Hanson.</p><div><blockquote><p>The Steam Controller’s joysticks have the right amount of resistance to add a tactile feel to your movements.</p><p>Kyle Barr</p></blockquote></div><p>Kyle Barr says that the Steam Controller’s “joysticks have the right amount of resistance to add a tactile feel to your movements.”</p><p>One sticking point is the controller’s price of $99. While that’s certainly less than many “pro” controllers like the PS5 DualSense Edge, it’s still $20-$30 more expensive than standard PS5 or Xbox controllers. However, given its features, most reviewers say the price is justified. “But considering everything it does,” says Will Greenwald, “the Steam Controller is a worthwhile purchase if you mostly play games on Steam.”</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>Right now, it seems like the Steam Controller is a hit among reviewers, and I’m certainly eager to go hands-on with it myself. I’m curious how the gaming community will view Valve’s latest peripherals. It won’t be long to get that answer, as the Steam Controller is set to launch on May 4.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/gaming/pc-gaming/valve-steam-machine-console-just-announced-6x-more-powerful-than-steam-deck">Steam Machine console challenges PS5 and Xbox</a></li><li><a href="https://www.tomsguide.com/gaming/pc-gaming/i-might-ditch-my-gaming-pc-for-the-steam-machine-heres-why">I might ditch my gaming PC for the Steam Machine</a></li><li><a href="https://www.tomsguide.com/gaming/pc-gaming/steam-machine-delayed-as-valve-will-revisit-the-cost-because-of-the-ram-price-crisis">Steam Machine delayed</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/steam-controller-review-roundup</link>
                                                                            <description>
                            <![CDATA[ The first reviews of the Steam Controller have gone live. Here's what tech reviewers have to say about Valve's latest peripheral. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">cWsu7h8zSyN6YEcgvAZodT</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/p7bernaLEm4CdAJq4wuD8f-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 27 Apr 2026 17:47:40 +0000</pubDate>                                                                                                                                <updated>Mon, 27 Apr 2026 18:09:59 +0000</updated>
                                                                                                                                            <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></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/p7bernaLEm4CdAJq4wuD8f-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/p7bernaLEm4CdAJq4wuD8f-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The first reviews of the Steam Controller have gone live. This peripheral is effectively a redesign of the original Steam Controller from over a decade ago, and is meant to complement the upcoming Steam Machine. It’s also compatible with PC, and of course, Valve’s own Steam Deck.</p><p>As we reported over the weekend, an industry insider named <a href="https://x.com/SadlyItsBradley/status/2046363689721245922" target="_blank"><u>Brad Lynch on X</u></a> found evidence of a "<a href="https://www.tomsguide.com/gaming/gaming-peripherals/steam-controller-launch-imminent-as-valve-uploads-secret-unboxing-heres-what-you-need-to-know"><u>Steam Controller Unboxing</u></a>" video that was uploaded to SteamDB. Soon after, reports of a potential Steam Controller price leak circulated online, suggesting the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steam-controller-price-leaked-online-and-id-start-saving-now"><u>peripheral would cost $99</u></a>. Given how reviews have gone live, it seems some folks spilled the beans prematurely.</p><p>The Steam Controller features TMR thumbsticks, rumble support, capacitive touch, and gyro controls. Like most controllers, it has four face buttons, four shoulder buttons, and the aforementioned pair of thumbsticks. Unique inputs include the large touchpads beneath the thumbsticks and four back buttons.</p><p>We’ll have our review of the Steam Controller soon. For now, here’s what tech reviewers are saying about Valve’s new peripheral.</p><div class="product"><a data-dimension112="821eeade-f5f9-4b44-b5e7-003106aa70fa" data-action="Deal Block" data-label="Steam Controller" data-dimension48="Steam Controller" 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. It's not on sale yet, but the product page says it will be available on May 4.<br><a class="view-deal button" href="https://store.steampowered.com/sale/steamcontroller" target="_blank" rel="nofollow" data-dimension112="821eeade-f5f9-4b44-b5e7-003106aa70fa" data-action="Deal Block" data-label="Steam Controller" data-dimension48="Steam Controller" data-dimension25="$99">View Deal</a></p></div><h2 id="what-are-reviewers-saying-about-the-steam-controller">What are reviewers saying about the Steam Controller?</h2><p>Steam Controller reviews are largely positive, with many sites and YouTube channels saying this is now their favorite PC game controller. That’s high praise, especially considering how controversial the original Steam Controller was.</p><p><a href="https://www.techradar.com/computing/peripherals-accessories/valve-steam-controller-2026" target="_blank">TechRadar’</a>s Matt Hanson says the Steam Controller is “a massive improvement over the flawed original, offering some great innovations while also coming with a more conventional — and user-friendly —design.”</p><p>This is a sentiment that <a href="https://www.pcmag.com/reviews/valve-steam-controller-2026?test_uuid=06f2t2mKxAWPbc1xmAn5J4t&test_variant=B" target="_blank">PCMag</a>’s Will Greenwald shares, saying that the controller is “fundamentally better in every way thanks to a deep feature set, terrific feel, and customizable controls like those on the Steam Deck.”</p><p>“I’ve spent so much time with Valve’s second attempt at its Steam Controller that I can’t imagine playing my PC games with anything else,” says <a href="https://www.polygon.com/steam-controller-2026-review/" target="_blank">Polygon</a>’s Giovanni Colantonio. Similarly, <a href="https://www.youtube.com/watch?v=I2RVnFP5rBI" target="_blank">IGN</a>’s Bo Moore said it was his “favorite controller for PC gaming.”</p><div><blockquote><p>I’ve spent so much time with Valve’s second attempt at its Steam Controller that I can’t imagine playing my PC games with anything else.</p><p>Giovanni Colantonio</p></blockquote></div><p>So what do reviewers love about the Steam Controller? Matt Hanson says the more conventional design is a major factor. “This makes it much easier to get to grips with if you’re used to other gamepads.” Gizmodo’s Kyle Barr echoes this sentiment, saying that the “new Steam Controller feels far more natural for anybody used to a PS5 DualSense-like design.”</p><p>The new thumbsticks also won over reviewers, thanks to TMR technology for improved performance. Not only does this lead to quicker actions, but it also allows them to glide smoothly.</p><p>“The new thumbsticks are no slouches, either, thanks to tunneling magneto-resistance (TMR) technology, which is the tech of choice for most premium gamepads. This uses small magnets to measure even the smallest of movements, which improves precision, and excels in genres such as shooters and racing games, where even the smallest of movements need to be accurately recorded and reflected in-game,” says Matt Hanson.</p><div><blockquote><p>The Steam Controller’s joysticks have the right amount of resistance to add a tactile feel to your movements.</p><p>Kyle Barr</p></blockquote></div><p>Kyle Barr says that the Steam Controller’s “joysticks have the right amount of resistance to add a tactile feel to your movements.”</p><p>One sticking point is the controller’s price of $99. While that’s certainly less than many “pro” controllers like the PS5 DualSense Edge, it’s still $20-$30 more expensive than standard PS5 or Xbox controllers. However, given its features, most reviewers say the price is justified. “But considering everything it does,” says Will Greenwald, “the Steam Controller is a worthwhile purchase if you mostly play games on Steam.”</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>Right now, it seems like the Steam Controller is a hit among reviewers, and I’m certainly eager to go hands-on with it myself. I’m curious how the gaming community will view Valve’s latest peripherals. It won’t be long to get that answer, as the Steam Controller is set to launch on May 4.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/gaming/pc-gaming/valve-steam-machine-console-just-announced-6x-more-powerful-than-steam-deck">Steam Machine console challenges PS5 and Xbox</a></li><li><a href="https://www.tomsguide.com/gaming/pc-gaming/i-might-ditch-my-gaming-pc-for-the-steam-machine-heres-why">I might ditch my gaming PC for the Steam Machine</a></li><li><a href="https://www.tomsguide.com/gaming/pc-gaming/steam-machine-delayed-as-valve-will-revisit-the-cost-because-of-the-ram-price-crisis">Steam Machine delayed</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tested Secretlab’s more affordable Magnus Evo standing desk for six months and I don’t miss the Magnus Pro’s all-metal desktop ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Secretlab Magnus Evo is a dual-motor, electric standing desk that offers many of the "Pro" features of its predecessor at a more approachable price. Starting at $749 without accessories, it’s still a serious investment, but its sleek, less "gamer-focused" aesthetic allows it to work just as well in a professional home office as it does in a game room.</p><p>The most significant departure from the <a href="https://www.tomsguide.com/home-office/secretlab-magnus-pro-review">Secretlab Magnus Pro</a> — which I consider one of the <a href="https://www.tomsguide.com/best-picks/best-gaming-desks">best gaming desks</a> overall — is the desktop itself. Instead of an all-metal surface, the Evo features a two-tone top with a soft-touch, ultra-matte laminate finish. Additionally, while the Pro integrates a massive full-length cable tray into its frame, the Evo uses a smaller version that attaches to the underside. More importantly, the Evo retains a full-length metal edge at the back along with its metal legs and frame, which makes it compatible with Secretlab’s existing ecosystem of magnetic cable management accessories.</p><p>After using the Magnus Evo daily for the past six months, I’m impressed by how well it holds its own. You do lose the premium 3-stage legs and the ability to quickly transform the look of the entire desk with one of Secretlab’s magnetic MagPad desk mats, but the overall experience remains quite premium. However, there are a few downsides: the optional accessories add up quickly, and while that matte finish feels great, it is noticeably prone to micro-scratches.</p><p>My Secretlab Magnus Evo review will help you decide if this is the <a href="https://www.tomsguide.com/home/home-office/best-standing-desks">best standing desk</a> for your setup, or if you’re better off with a simpler desk and putting that extra cash toward your gaming PC.</p><h3 class="article-body__section" id="section-secretlab-magnus-evo-cheat-sheet"><span>Secretlab Magnus Evo: 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="PdB8uKTWnnz25Cpf86SEJN" name="Secretlab Magnus Evo-2" alt="The Secretlab Magnus Evo standing desk raised up against a wall" src="https://cdn.mos.cms.futurecdn.net/PdB8uKTWnnz25Cpf86SEJN.jpg" mos="" align="middle" fullscreen="" width="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>An electric, sit/stand desk with a focus on cable management and magnetic accessories.</li><li><strong>Who is it for? </strong>It’s targeted at gamers but subdued enough to make it a good fit for anyone working from home that wants a high-tech standing desk.</li><li><strong>What does it cost? </strong>The Secretlab Magnus Evo <a href="https://secretlab.co/products/magnus-evo?sku=3MAGE-B15B" target="_blank" rel="nofollow">costs $749</a> while the larger Secretlab Magnus Evo XL <a href="https://secretlab.co/products/magnus-evo?sku=3MAGE-B15B" target="_blank" rel="nofollow">costs $849</a>.</li><li><strong>What do we like? </strong>The simple and straightforward assembly process, the included cable management tray, the metal strip at the back of the desk for magnetic accessories and the integrated power supply column.</li><li><strong>What don’t we like? </strong>That its soft-touch ultra matte laminate finish is prone to scratches, how you’re limited to low-profile monitor arms and that the optional accessories can get expensive.</li></ul><h3 class="article-body__section" id="section-secretlab-magnus-evo-specs"><span>Secretlab Magnus Evo: Specs</span></h3><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p>Magnus Evo (as tested)</p></th><th  ><p>Magnus Evo XL</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Desktop size</strong></p></td><td  ><p>59.2 x 25.2 inches</p></td><td  ><p>70 x 25.2 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Desktop style</strong></p></td><td  ><p>Soft-touch ultra matte laminate with full metal rear edge</p></td><td  ><p>Soft-touch ultra matte laminate with full metal rear edge</p></td></tr><tr><td class="firstcol " ><p><strong>Leg colors</strong></p></td><td  ><p>Black</p></td><td  ><p>Black</p></td></tr><tr><td class="firstcol " ><p><strong>Min/max height</strong></p></td><td  ><p>28.3-46.1 inches</p></td><td  ><p>28.3-46.1 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Max supported weight</strong></p></td><td  ><p>265 pounds</p></td><td  ><p>265 pounds</p></td></tr><tr><td class="firstcol " ><p><strong>Electric</strong></p></td><td  ><p>Yes, dual-motor </p></td><td  ><p>Yes, dual-motor </p></td></tr><tr><td class="firstcol " ><p><strong>Noise level</strong></p></td><td  ><p>57 dB (moving up), 45-47 dB (moving down)</p></td><td  ><p>N/A</p></td></tr><tr><td class="firstcol " ><p><strong>Memory presets</strong></p></td><td  ><p>3</p></td><td  ><p>3</p></td></tr><tr><td class="firstcol " ><p><strong>Grommets</strong></p></td><td  ><p>No</p></td><td  ><p>No</p></td></tr><tr><td class="firstcol " ><p><strong>Cable management</strong></p></td><td  ><p>Magnetic metal tray included</p></td><td  ><p>Magnetic metal tray included</p></td></tr><tr><td class="firstcol " ><p><strong>Warranty</strong></p></td><td  ><p>Up to 5 years</p></td><td  ><p>Up to 5 years</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-secretlab-magnus-evo-the-ups"><span>Secretlab Magnus Evo: The ups</span></h3><p>As the more affordable follow-up to its Pro predecessor, the Secretlab Magnus Evo manages to hold its own with a powerful yet quiet dual-motor system and strategic metal placement for the company’s full line of magnetic accessories. However, it’s the sleek, two-tone design and a more flexible, straightforward assembly process that really make this desk shine.</p><h2 id="pre-wired-assembly">Pre-wired assembly</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bdkwfPR8YxpxKyFGZGJMhR" name="Secretlab Magnus Evo-15" alt="The box the Secretlab Magnus Evo arrived in" src="https://cdn.mos.cms.futurecdn.net/bdkwfPR8YxpxKyFGZGJMhR.jpg" mos="" align="middle" fullscreen="" width="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>Much to my surprise, the Magnus Evo arrived in one large brown box. Normally, standing desks come in two — with a separate box for the legs and one for the desktop. Everything was extremely well-packaged with plenty of foam to protect all the pieces too. The reason everything fits in one box is due to the fact that Secretlab does a lot of the heavy lifting for 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="3ESMfDhMDhJrWS9CPS3mwU" name="Secretlab Magnus Evo-14" alt="The Secretlab Magnus Evo unboxed with all of its parts on laid out on the floor" src="https://cdn.mos.cms.futurecdn.net/3ESMfDhMDhJrWS9CPS3mwU.jpg" mos="" align="middle" fullscreen="" width="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 everything unpacked, I was left with the center portion of the desktop, a pair of desk extensions, two legs and feet, and all of the hardware needed to put the Magnus Evo 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="Zi2iwUewSgwtj54gCHQvEY" name="Secretlab Magnus Evo-12" alt="The pre-installed and wired control box inside the Secretlab Magnus Evo" src="https://cdn.mos.cms.futurecdn.net/Zi2iwUewSgwtj54gCHQvEY.jpg" mos="" align="middle" fullscreen="" width="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>After bolting the two extensions onto either side of the desktop, the rest of the build process was quite straightforward. This is because the Magnus Evo is largely pre-wired; the electrical control box is already mounted to the underside of the center panel. Since the motors are housed directly inside the leg columns, you don't have to worry about mounting them yourself. Instead, you simply plug the legs into the pre-installed control box and you're good to go.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6tB5UdgvksWvZwJxzPhBob" name="Secretlab Magnus Evo-13" alt="Cables coming out of the center of the Secretlab Magnus Evo's frame" src="https://cdn.mos.cms.futurecdn.net/6tB5UdgvksWvZwJxzPhBob.jpg" mos="" align="middle" fullscreen="" width="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 thing you do have to take into consideration is which side of the desk you want the integrated power supply column on. With the Magnus Pro, you only had one option: the left side of the desk. By giving you the choice between the left or the right leg for the power passthrough, the Magnus Evo is actually a lot more versatile.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xYpyHdWqEo2krkiHJDovMe" name="Secretlab Magnus Evo-11" alt="Attaching the legs to the Secretlab Magnus Evo" src="https://cdn.mos.cms.futurecdn.net/xYpyHdWqEo2krkiHJDovMe.jpg" mos="" align="middle" fullscreen="" width="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 installed the legs and attached their feet at the bottom using the included bolts and the specialized magnetic screwdriver. Of all the standing desks I’ve built, the Magnus Evo has been one of the easiest to assemble. In fact, I’d go as far to say that it’s as easy to put together as the <a href="https://www.tomsguide.com/reviews/vari-electric-standing-desk">Vari Electric Standing Desk</a> which I consider the gold standard.</p><p>With the Magnus Evo built, all that was left was to flip it over and plug it in. Fortunately, Secretlab makes that even easier than with other electric standing desks.</p><h2 id="power-where-you-need-it">Power where you need it</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hHDxVCvDmKczykP3kmV25i" name="Secretlab Magnus Evo-4" alt="The Secretlab Magnus Evo standing desk plugged into a wall" src="https://cdn.mos.cms.futurecdn.net/hHDxVCvDmKczykP3kmV25i.jpg" mos="" align="middle" fullscreen="" width="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>After setting up most standing desks, you usually end up with a messy power cable or a surge protector cord hanging down right from the middle of the frame. Secretlab solved this problem for good by integrating a power supply column directly into one of the legs of the Magnus Evo.</p><p>During assembly, you can choose to have this integrated power supply column on either the left or right side of the desk. Since I have a power outlet on the right side, I opted to use the right leg for this.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GKZebey6sx9D8wXgxQTWtk" name="Secretlab Magnus Evo-10" alt="The power connector at the base of the Secretlab Magnus Evo's leg" src="https://cdn.mos.cms.futurecdn.net/GKZebey6sx9D8wXgxQTWtk.jpg" mos="" align="middle" fullscreen="" width="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 the Magnus Pro’s recessed port looks a bit cleaner, the Magnus Evo uses a short, wired power inlet that makes positioning the cable slightly more versatile and helps keep costs down. Just be sure to keep any pets away from this cord; because since it’s hard-wired into the desk's internal electronics, you’d likely have to replace the entire leg if the inlet gets damaged.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="emXB74UX5YKqGpLTqz83J3" name="Secretlab Magnus Evo-9" alt="A surge protector plugged into the power outlet at the top of the Secretlab Magnus Evo's leg" src="https://cdn.mos.cms.futurecdn.net/emXB74UX5YKqGpLTqz83J3.jpg" mos="" align="middle" fullscreen="" width="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>Then, at the top of your preferred desk leg on the inside of the frame, you have a standard 3-prong power port. I plugged one of the <a href="https://www.tomsguide.com/best-picks/best-surge-protector">best surge protectors</a> into it and used one of Secretlab’s optional magnetic cable anchors to remove any slack and keep the cord neatly tucked away.</p><p>What I really like about Secretlab’s approach to powering the Magnus Evo — and everything plugged in at your desk for that matter — is that you don’t have to worry about your power strip’s cable getting caught or unplugged when moving the desk up and down. It’s a convenient little extra that helps justify the Magnus Evo’s higher price compared to other electric standing desks.</p><h2 id="not-without-my-magnets">Not without my magnets</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6YpW6W4iGpmXwY3jCokUu6" name="Secretlab Magnus Evo-6" alt="A person attaching a magnetic cable anchor to the metal back of the Secretlab Magnus Evo" src="https://cdn.mos.cms.futurecdn.net/6YpW6W4iGpmXwY3jCokUu6.jpg" mos="" align="middle" fullscreen="" width="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 Magnus Pro, with its all-metal desktop, was <a href="https://www.tomsguide.com/home/home-office/i-never-thought-id-switch-to-an-all-metal-standing-desk-but-this-has-completely-won-me-over">purpose-built for magnetic accessories</a>, but Secretlab also managed to incorporate this functionality into the Magnus Evo. Instead of being made from soft-touch laminate, the entire rear edge of the desk is made from metal. This means you can use Secretlab’s magnetic cable anchors to hold your gaming PC’s cables in place at the back of the desk. This is also great if you want to have a permanent charging cable at your desk without it falling behind.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Rvmu7rosCSFq5U86QqfiMA" name="Secretlab Magnus Evo-3" alt="The Secretlab Magnus Evo at an angle showing magnetic accessories attached to one of its legs" src="https://cdn.mos.cms.futurecdn.net/Rvmu7rosCSFq5U86QqfiMA.jpg" mos="" align="middle" fullscreen="" width="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>Given that the Magnus Evo also has metal legs and a metal frame, you can use magnetic accessories in both of these places, too. I particularly like Secretlab’s long metal cable sheaths for running an Ethernet cable from one of the <a href="https://www.tomsguide.com/best-picks/best-Wi-fi-7-routers">best Wi-Fi 7 routers</a> up from the floor and into the back of my PC.</p><p>At $55 for the standard cable management bundle or $74 for the extra-long version, these optional accessories aren’t cheap — but more on that later. Since you’re dealing with a metal rear edge, legs, and frame, you aren’t limited to Secretlab’s accessories. Anything with a strong enough magnet will do. For instance, I picked up these<a href="https://www.amazon.com/dp/B0DNS99ZWQ"> smaller magnetic cord holders</a> online for just $15. They come in silver, so you may want to paint them to match the desk, but I used them on the backside of the Magnus Evo where they were completely out of sight.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uxi5WSVRV9BbVVrcf9eSZD" name="Secretlab Magnus Evo-8" alt="The included cable management tray attached on the underside of the Secretlab Magnus Evo" src="https://cdn.mos.cms.futurecdn.net/uxi5WSVRV9BbVVrcf9eSZD.jpg" mos="" align="middle" fullscreen="" width="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 if you don’t opt for Secretlab’s premium accessories, the included <a href="https://www.tomsguide.com/opinion/i-spent-a-year-reviewing-standing-desks-and-this-is-the-one-accessory-i-cant-live-without">cable management tray</a> also makes use of magnets. It bolts onto the back of the desk and uses a hinged design with magnets at the top, allowing you to quickly drop it open and securely snap it shut when plugging in a new device.</p><p>With the Magnus Evo built and plugged into the wall, it was finally time to set it up and start using it.</p><h2 id="sleek-solid-and-smooth">Sleek, solid and smooth</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="SnVwcEAmKdDdMc6Bbi48GG" name="Secretlab Magnus Evo-5" alt="The Secretlab Magnus Evo's desktop seen from above" src="https://cdn.mos.cms.futurecdn.net/SnVwcEAmKdDdMc6Bbi48GG.jpg" mos="" align="middle" fullscreen="" width="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>Despite being less expensive than its predecessor, the Magnus Evo immediately has a premium look to it thanks to its soft-touch matte laminate finish and two tone design. While I wish there were other color options besides black, knowing Secretlab, I can almost guarantee they’ll release a white version later on like they did with the Magnus Pro.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="snQY4wicxwjBDvPYcPLrQk" name="UGREEN DH4300 Plus-11" alt="An overhead shot showing a computer connected to the Ugreen NASync DH4300 Plus in a web browser with flash drives and external hard drives on a desk" src="https://cdn.mos.cms.futurecdn.net/snQY4wicxwjBDvPYcPLrQk.jpg" mos="" align="middle" fullscreen="" width="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>After assembling the Magnus Evo, I first tried it out with a more traditional single monitor setup with a <a href="https://www.tomsguide.com/computing/monitors/i-just-tested-this-budget-32-inch-4k-gaming-monitor-and-its-the-perfect-upgrade-for-your-ps5-and-xbox-series-x">small soundbar</a> underneath my display. Then on the right, I powered everything using the <a href="https://www.tomsguide.com/computing/mini-pcs/framework-desktop-review">Framework Desktop</a>. As I had recently <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">set up my first NAS</a>, I spent a lot of time sitting at the Magnus Evo uploading old pictures and videos to 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="cAnwkfUZ26ECxSzRR7jvzJ" name="Secretlab Magnus Evo-7" alt="The controls integrated into the side of the Secretlab Magnus Evo" src="https://cdn.mos.cms.futurecdn.net/cAnwkfUZ26ECxSzRR7jvzJ.jpg" mos="" align="middle" fullscreen="" width="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>Whether sitting or standing, everything worked really well and felt very stable at either height. Although the Magnus Evo has just three programmable height preset buttons on the front, one thing I really like about its controls is that they’re built into the desk instead of attached underneath it. Likewise, the toggle on the far right lets you lock the desk’s controls but it also turns off the LED lights that show you the desk’s current height. This is great if you have small children like I do or just don’t want to have another LED display shining in your room at night.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="oXKhKNckhMD6XXzAsQmX8D" name="SmallRig Camera Desk Mount-3" alt="An overhead view of a dual-monitor desk setup with the SmallRig Camera Desk Mount holding up a webcam behind the displays" src="https://cdn.mos.cms.futurecdn.net/oXKhKNckhMD6XXzAsQmX8D.jpg" mos="" align="middle" fullscreen="" width="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 moved the Magnus Evo over to the other side of my game room and put together a more complicated <a href="https://www.tomsguide.com/computing/i-ditched-my-ultrawide-display-for-this-dual-monitor-setup-heres-what-happened">dual-monitor setup</a>. I used Secretlab’s dual monitor arm to do so and to hide my PC, I used its under-desk PC mount. Now it’s designed for one of the <a href="https://www.tomsguide.com/us/best-gaming-pc,review-2219.html">best gaming PCs</a> which are larger and bulkier. However, with a bit of jerry-rigging I managed to mount one of the <a href="https://www.tomsguide.com/us/best-mini-pc.html">best mini PCs</a> — the vertically-oriented <a href="https://www.tomsguide.com/computing/desktop-computers/atomman-g7-ti-review">Atomman G7 Ti</a> — there while using Secretlab’s magnetic headphone hanger to hold it in place. Unconventional I know but I really wanted to free up some much needed desk space while still having a dual-monitor setup.</p><p>Thanks to its powerful dual motors, the Magnus Evo is able to adjust from my preferred sitting to standing position in just over 10 seconds both ways. It’s also fairly quiet while doing so without the extra whirring you might hear from a single-motor electric standing desk. When coming down, it stayed between 45-47 dB on my sound meter which lines up with Secretlab’s under 50 db claim. However, when raising up, the Magnus Evo got as loud as 57 dB which is slightly over this. Still, adjusting this desk’s height isn’t going to be distracting for yourself or anyone else in the same room as you.</p><p>Even though I tested out the smaller, 60-inch wide, standard Magnus Evo, I still had plenty of room for my dual-monitor set up. I’ve used this desk setup for both work and play since the end of January and it’s been great. However, not being able to snap one of Secretlab’s MagPad desk mats on its desktop has led to some unforeseen consequences.</p><h3 class="article-body__section" id="section-secretlab-magnus-evo-the-downs"><span>Secretlab Magnus Evo: The downs</span></h3><p>The Secretlab Magnus Evo retains many of the best features of its predecessor at a more affordable price point. However, it’s not without its downsides, namely its more delicate desktop and the feeling of being locked into Secretlab’s premium ecosystem of accessories.</p><h2 id="a-desk-mat-isn-t-optional">A desk mat isn’t optional</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cAY2YE9eJtnsTdCtAHpnKe" name="SmallRig Camera Desk Mount-4" alt="A dual-monitor desk setup with the SmallRig Camera Desk Mount holding up a webcam behind the displays" src="https://cdn.mos.cms.futurecdn.net/cAY2YE9eJtnsTdCtAHpnKe.jpg" mos="" align="middle" fullscreen="" width="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 Guid)</span></figcaption></figure><p>Though I’ve often used a <a href="https://www.tomsguide.com/opinion/this-is-the-most-underrated-accessory-for-your-desk-and-its-super-cheap">desk mat</a> in the past to protect the surface of my desk and to help reduce extra noise from typing on one of the <a href="https://www.tomsguide.com/best-picks/best-mechanical-keyboards">best mechanical keyboards</a>, I chose not to with the Magnus Evo. I did so for two reasons: I didn't want to cover the desk's beautiful finish, and I really liked how its soft-touch laminate felt under my forearms.</p><p>Unfortunately, when I moved the desk across my game room after a few weeks of use, I noticed small micro-scratches underneath where my keyboard had been. They aren't very noticeable from afar, but if you look closely, they stand out like a dead pixel on one of the <a href="https://www.tomsguide.com/best-picks/best-monitors">best monitors</a>. It's still very usable, but it is annoying when you’ve paid over $500 for a premium 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:1999px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="kcMJoJUC5osQEuXcQRYeDM" name="image1.jpg" alt="Secretlab Magnus Pro" src="https://cdn.mos.cms.futurecdn.net/kcMJoJUC5osQEuXcQRYeDM.jpg" mos="" align="middle" fullscreen="" width="1999" 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>Secretlab’s MagPad desk mats are an elegant (if expensive) solution for the Magnus Pro, as they magnetically snap into place and cover the surface from end to end. However, because the center of the Magnus Evo's desktop isn't metal, they aren’t compatible. This means you’ll have to turn to a third-party desk mat if you want to keep the laminate surface looking pristine.</p><p>On a solid wood desk like the <a href="https://www.tomsguide.com/home/home-office/oakywood-standing-desk-pro-review">Oakywood Standing Desk Pro</a>, you could simply buff or sand out surface-level imperfections. That isn't an option here. To its credit, the Magnus Evo’s laminate is very easy to wipe down, but it is far more susceptible to permanent wear than its more expensive, all-metal sibling.</p><h2 id="accessorizing-at-a-premium">Accessorizing at a premium</h2><p>I’ve hinted at it throughout this review, but Secretlab’s ecosystem of first-party accessories isn’t cheap. For instance, the dual-monitor arm I’m using here costs $249, which is more than you’ll pay for most of the <a href="https://www.tomsguide.com/best-picks/best-monitor-arms">best monitor arms</a>. The same holds true for its cable management accessories and under-desk PC mount.</p><p>With monitor arms in particular, it might be worth spending extra on one of Secretlab’s due to the Magnus Evo’s design. Since the cable management tray is right up against the back of the desk and you don’t have the option to position it elsewhere, if you’re clamping a monitor arm right at the center, it needs to be a low-profile one. If it isn’t, you’re going to have a much harder time turning the knob for its clamp. Depending on which third-party monitor arm you choose, this might not even be possible.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xgYeKu2DoEBmTQuxsCfAiG" name="SmallRig Camera Desk Mount-2" alt="A rear view shot of a webcam mounted on the SmallRig Camera Desk Mount behind a dual-monitor setup" src="https://cdn.mos.cms.futurecdn.net/xgYeKu2DoEBmTQuxsCfAiG.jpg" mos="" align="middle" fullscreen="" width="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 I used Secretlab’s dual monitor arm in this desk setup, I did manage to clamp a third-party accessory to the back of the Magnus Evo. Since I wanted my webcam in the center of the desk, I used a <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">camera desk mount from SmallRig</a> to put it between my two monitors. This took quite a bit of back and forth, given there’s not a lot of clearance between the desktop and the cable management tray, but I eventually got it to work.</p><p>Just like with one of the <a href="https://www.tomsguide.com/us/best-apple-iphone,review-6348.html">best iPhones</a>, if you do pick up a Magnus Evo or even a Magnus Pro, prepare to set aside some extra cash for a few of Secretlab’s first-party accessories.</p><h3 class="article-body__section" id="section-secretlab-magnus-evo-verdict"><span>Secretlab Magnus Evo: Verdict</span></h3><p>The Secretlab Magnus Evo is a sleek and impressive electric standing desk. Thanks to its more subdued design, it works just as well for your battlestation as it does for a dedicated work-from-home setup. The Magnus Evo is more affordable than its predecessor, yet Secretlab still managed to retain many of the best features of the Magnus Pro, like its integrated power supply column and support for magnetic accessories.</p><p>While I wish the Magnus Evo’s soft-touch laminate desktop was slightly more resilient, it does feel and look great. Likewise, since the cable management tray is a standalone unit rather than being integrated across the entire frame, you get a bit more freedom when it comes to using third-party accessories, which can be clamped more easily onto the left or right sides of the rear edge.</p><p>If you’re looking for a gaming desk that gives you the freedom to play while sitting or standing, the Magnus Evo is an excellent choice. It may not have the built-in storage of Corsair’s Platform 4 Elevate but it does have a more premium look and feel to it.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/home/home-office/secretlab-magnus-evo-review</link>
                                                                            <description>
                            <![CDATA[ The Secretlab Magnus Evo is a sleek, dual-motor electric standing desk designed for gamers that works just as well for a clean, professional home office setup. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">QFjcpXE6PNBtD74daXEFob</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/oXKhKNckhMD6XXzAsQmX8D-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 27 Apr 2026 10:30:00 +0000</pubDate>                                                                                                                                <updated>Tue, 28 Apr 2026 05:56:58 +0000</updated>
                                                                                                                                            <category><![CDATA[Home Office]]></category>
                                                    <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Home]]></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/oXKhKNckhMD6XXzAsQmX8D-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[An overhead view of a dual-monitor desk setup with the SmallRig Camera Desk Mount holding up a webcam behind the displays]]></media:description>                                                            <media:text><![CDATA[An overhead view of a dual-monitor desk setup with the SmallRig Camera Desk Mount holding up a webcam behind the displays]]></media:text>
                                <media:title type="plain"><![CDATA[An overhead view of a dual-monitor desk setup with the SmallRig Camera Desk Mount holding up a webcam behind the displays]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/oXKhKNckhMD6XXzAsQmX8D-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Secretlab Magnus Evo is a dual-motor, electric standing desk that offers many of the "Pro" features of its predecessor at a more approachable price. Starting at $749 without accessories, it’s still a serious investment, but its sleek, less "gamer-focused" aesthetic allows it to work just as well in a professional home office as it does in a game room.</p><p>The most significant departure from the <a href="https://www.tomsguide.com/home-office/secretlab-magnus-pro-review">Secretlab Magnus Pro</a> — which I consider one of the <a href="https://www.tomsguide.com/best-picks/best-gaming-desks">best gaming desks</a> overall — is the desktop itself. Instead of an all-metal surface, the Evo features a two-tone top with a soft-touch, ultra-matte laminate finish. Additionally, while the Pro integrates a massive full-length cable tray into its frame, the Evo uses a smaller version that attaches to the underside. More importantly, the Evo retains a full-length metal edge at the back along with its metal legs and frame, which makes it compatible with Secretlab’s existing ecosystem of magnetic cable management accessories.</p><p>After using the Magnus Evo daily for the past six months, I’m impressed by how well it holds its own. You do lose the premium 3-stage legs and the ability to quickly transform the look of the entire desk with one of Secretlab’s magnetic MagPad desk mats, but the overall experience remains quite premium. However, there are a few downsides: the optional accessories add up quickly, and while that matte finish feels great, it is noticeably prone to micro-scratches.</p><p>My Secretlab Magnus Evo review will help you decide if this is the <a href="https://www.tomsguide.com/home/home-office/best-standing-desks">best standing desk</a> for your setup, or if you’re better off with a simpler desk and putting that extra cash toward your gaming PC.</p><h3 class="article-body__section" id="section-secretlab-magnus-evo-cheat-sheet"><span>Secretlab Magnus Evo: 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="PdB8uKTWnnz25Cpf86SEJN" name="Secretlab Magnus Evo-2" alt="The Secretlab Magnus Evo standing desk raised up against a wall" src="https://cdn.mos.cms.futurecdn.net/PdB8uKTWnnz25Cpf86SEJN.jpg" mos="" align="middle" fullscreen="" width="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>An electric, sit/stand desk with a focus on cable management and magnetic accessories.</li><li><strong>Who is it for? </strong>It’s targeted at gamers but subdued enough to make it a good fit for anyone working from home that wants a high-tech standing desk.</li><li><strong>What does it cost? </strong>The Secretlab Magnus Evo <a href="https://secretlab.co/products/magnus-evo?sku=3MAGE-B15B" target="_blank" rel="nofollow">costs $749</a> while the larger Secretlab Magnus Evo XL <a href="https://secretlab.co/products/magnus-evo?sku=3MAGE-B15B" target="_blank" rel="nofollow">costs $849</a>.</li><li><strong>What do we like? </strong>The simple and straightforward assembly process, the included cable management tray, the metal strip at the back of the desk for magnetic accessories and the integrated power supply column.</li><li><strong>What don’t we like? </strong>That its soft-touch ultra matte laminate finish is prone to scratches, how you’re limited to low-profile monitor arms and that the optional accessories can get expensive.</li></ul><h3 class="article-body__section" id="section-secretlab-magnus-evo-specs"><span>Secretlab Magnus Evo: Specs</span></h3><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p>Magnus Evo (as tested)</p></th><th  ><p>Magnus Evo XL</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Desktop size</strong></p></td><td  ><p>59.2 x 25.2 inches</p></td><td  ><p>70 x 25.2 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Desktop style</strong></p></td><td  ><p>Soft-touch ultra matte laminate with full metal rear edge</p></td><td  ><p>Soft-touch ultra matte laminate with full metal rear edge</p></td></tr><tr><td class="firstcol " ><p><strong>Leg colors</strong></p></td><td  ><p>Black</p></td><td  ><p>Black</p></td></tr><tr><td class="firstcol " ><p><strong>Min/max height</strong></p></td><td  ><p>28.3-46.1 inches</p></td><td  ><p>28.3-46.1 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Max supported weight</strong></p></td><td  ><p>265 pounds</p></td><td  ><p>265 pounds</p></td></tr><tr><td class="firstcol " ><p><strong>Electric</strong></p></td><td  ><p>Yes, dual-motor </p></td><td  ><p>Yes, dual-motor </p></td></tr><tr><td class="firstcol " ><p><strong>Noise level</strong></p></td><td  ><p>57 dB (moving up), 45-47 dB (moving down)</p></td><td  ><p>N/A</p></td></tr><tr><td class="firstcol " ><p><strong>Memory presets</strong></p></td><td  ><p>3</p></td><td  ><p>3</p></td></tr><tr><td class="firstcol " ><p><strong>Grommets</strong></p></td><td  ><p>No</p></td><td  ><p>No</p></td></tr><tr><td class="firstcol " ><p><strong>Cable management</strong></p></td><td  ><p>Magnetic metal tray included</p></td><td  ><p>Magnetic metal tray included</p></td></tr><tr><td class="firstcol " ><p><strong>Warranty</strong></p></td><td  ><p>Up to 5 years</p></td><td  ><p>Up to 5 years</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-secretlab-magnus-evo-the-ups"><span>Secretlab Magnus Evo: The ups</span></h3><p>As the more affordable follow-up to its Pro predecessor, the Secretlab Magnus Evo manages to hold its own with a powerful yet quiet dual-motor system and strategic metal placement for the company’s full line of magnetic accessories. However, it’s the sleek, two-tone design and a more flexible, straightforward assembly process that really make this desk shine.</p><h2 id="pre-wired-assembly">Pre-wired assembly</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bdkwfPR8YxpxKyFGZGJMhR" name="Secretlab Magnus Evo-15" alt="The box the Secretlab Magnus Evo arrived in" src="https://cdn.mos.cms.futurecdn.net/bdkwfPR8YxpxKyFGZGJMhR.jpg" mos="" align="middle" fullscreen="" width="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>Much to my surprise, the Magnus Evo arrived in one large brown box. Normally, standing desks come in two — with a separate box for the legs and one for the desktop. Everything was extremely well-packaged with plenty of foam to protect all the pieces too. The reason everything fits in one box is due to the fact that Secretlab does a lot of the heavy lifting for 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="3ESMfDhMDhJrWS9CPS3mwU" name="Secretlab Magnus Evo-14" alt="The Secretlab Magnus Evo unboxed with all of its parts on laid out on the floor" src="https://cdn.mos.cms.futurecdn.net/3ESMfDhMDhJrWS9CPS3mwU.jpg" mos="" align="middle" fullscreen="" width="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 everything unpacked, I was left with the center portion of the desktop, a pair of desk extensions, two legs and feet, and all of the hardware needed to put the Magnus Evo 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="Zi2iwUewSgwtj54gCHQvEY" name="Secretlab Magnus Evo-12" alt="The pre-installed and wired control box inside the Secretlab Magnus Evo" src="https://cdn.mos.cms.futurecdn.net/Zi2iwUewSgwtj54gCHQvEY.jpg" mos="" align="middle" fullscreen="" width="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>After bolting the two extensions onto either side of the desktop, the rest of the build process was quite straightforward. This is because the Magnus Evo is largely pre-wired; the electrical control box is already mounted to the underside of the center panel. Since the motors are housed directly inside the leg columns, you don't have to worry about mounting them yourself. Instead, you simply plug the legs into the pre-installed control box and you're good to go.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6tB5UdgvksWvZwJxzPhBob" name="Secretlab Magnus Evo-13" alt="Cables coming out of the center of the Secretlab Magnus Evo's frame" src="https://cdn.mos.cms.futurecdn.net/6tB5UdgvksWvZwJxzPhBob.jpg" mos="" align="middle" fullscreen="" width="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 thing you do have to take into consideration is which side of the desk you want the integrated power supply column on. With the Magnus Pro, you only had one option: the left side of the desk. By giving you the choice between the left or the right leg for the power passthrough, the Magnus Evo is actually a lot more versatile.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xYpyHdWqEo2krkiHJDovMe" name="Secretlab Magnus Evo-11" alt="Attaching the legs to the Secretlab Magnus Evo" src="https://cdn.mos.cms.futurecdn.net/xYpyHdWqEo2krkiHJDovMe.jpg" mos="" align="middle" fullscreen="" width="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 installed the legs and attached their feet at the bottom using the included bolts and the specialized magnetic screwdriver. Of all the standing desks I’ve built, the Magnus Evo has been one of the easiest to assemble. In fact, I’d go as far to say that it’s as easy to put together as the <a href="https://www.tomsguide.com/reviews/vari-electric-standing-desk">Vari Electric Standing Desk</a> which I consider the gold standard.</p><p>With the Magnus Evo built, all that was left was to flip it over and plug it in. Fortunately, Secretlab makes that even easier than with other electric standing desks.</p><h2 id="power-where-you-need-it">Power where you need it</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hHDxVCvDmKczykP3kmV25i" name="Secretlab Magnus Evo-4" alt="The Secretlab Magnus Evo standing desk plugged into a wall" src="https://cdn.mos.cms.futurecdn.net/hHDxVCvDmKczykP3kmV25i.jpg" mos="" align="middle" fullscreen="" width="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>After setting up most standing desks, you usually end up with a messy power cable or a surge protector cord hanging down right from the middle of the frame. Secretlab solved this problem for good by integrating a power supply column directly into one of the legs of the Magnus Evo.</p><p>During assembly, you can choose to have this integrated power supply column on either the left or right side of the desk. Since I have a power outlet on the right side, I opted to use the right leg for this.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GKZebey6sx9D8wXgxQTWtk" name="Secretlab Magnus Evo-10" alt="The power connector at the base of the Secretlab Magnus Evo's leg" src="https://cdn.mos.cms.futurecdn.net/GKZebey6sx9D8wXgxQTWtk.jpg" mos="" align="middle" fullscreen="" width="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 the Magnus Pro’s recessed port looks a bit cleaner, the Magnus Evo uses a short, wired power inlet that makes positioning the cable slightly more versatile and helps keep costs down. Just be sure to keep any pets away from this cord; because since it’s hard-wired into the desk's internal electronics, you’d likely have to replace the entire leg if the inlet gets damaged.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="emXB74UX5YKqGpLTqz83J3" name="Secretlab Magnus Evo-9" alt="A surge protector plugged into the power outlet at the top of the Secretlab Magnus Evo's leg" src="https://cdn.mos.cms.futurecdn.net/emXB74UX5YKqGpLTqz83J3.jpg" mos="" align="middle" fullscreen="" width="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>Then, at the top of your preferred desk leg on the inside of the frame, you have a standard 3-prong power port. I plugged one of the <a href="https://www.tomsguide.com/best-picks/best-surge-protector">best surge protectors</a> into it and used one of Secretlab’s optional magnetic cable anchors to remove any slack and keep the cord neatly tucked away.</p><p>What I really like about Secretlab’s approach to powering the Magnus Evo — and everything plugged in at your desk for that matter — is that you don’t have to worry about your power strip’s cable getting caught or unplugged when moving the desk up and down. It’s a convenient little extra that helps justify the Magnus Evo’s higher price compared to other electric standing desks.</p><h2 id="not-without-my-magnets">Not without my magnets</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6YpW6W4iGpmXwY3jCokUu6" name="Secretlab Magnus Evo-6" alt="A person attaching a magnetic cable anchor to the metal back of the Secretlab Magnus Evo" src="https://cdn.mos.cms.futurecdn.net/6YpW6W4iGpmXwY3jCokUu6.jpg" mos="" align="middle" fullscreen="" width="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 Magnus Pro, with its all-metal desktop, was <a href="https://www.tomsguide.com/home/home-office/i-never-thought-id-switch-to-an-all-metal-standing-desk-but-this-has-completely-won-me-over">purpose-built for magnetic accessories</a>, but Secretlab also managed to incorporate this functionality into the Magnus Evo. Instead of being made from soft-touch laminate, the entire rear edge of the desk is made from metal. This means you can use Secretlab’s magnetic cable anchors to hold your gaming PC’s cables in place at the back of the desk. This is also great if you want to have a permanent charging cable at your desk without it falling behind.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Rvmu7rosCSFq5U86QqfiMA" name="Secretlab Magnus Evo-3" alt="The Secretlab Magnus Evo at an angle showing magnetic accessories attached to one of its legs" src="https://cdn.mos.cms.futurecdn.net/Rvmu7rosCSFq5U86QqfiMA.jpg" mos="" align="middle" fullscreen="" width="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>Given that the Magnus Evo also has metal legs and a metal frame, you can use magnetic accessories in both of these places, too. I particularly like Secretlab’s long metal cable sheaths for running an Ethernet cable from one of the <a href="https://www.tomsguide.com/best-picks/best-Wi-fi-7-routers">best Wi-Fi 7 routers</a> up from the floor and into the back of my PC.</p><p>At $55 for the standard cable management bundle or $74 for the extra-long version, these optional accessories aren’t cheap — but more on that later. Since you’re dealing with a metal rear edge, legs, and frame, you aren’t limited to Secretlab’s accessories. Anything with a strong enough magnet will do. For instance, I picked up these<a href="https://www.amazon.com/dp/B0DNS99ZWQ"> smaller magnetic cord holders</a> online for just $15. They come in silver, so you may want to paint them to match the desk, but I used them on the backside of the Magnus Evo where they were completely out of sight.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uxi5WSVRV9BbVVrcf9eSZD" name="Secretlab Magnus Evo-8" alt="The included cable management tray attached on the underside of the Secretlab Magnus Evo" src="https://cdn.mos.cms.futurecdn.net/uxi5WSVRV9BbVVrcf9eSZD.jpg" mos="" align="middle" fullscreen="" width="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 if you don’t opt for Secretlab’s premium accessories, the included <a href="https://www.tomsguide.com/opinion/i-spent-a-year-reviewing-standing-desks-and-this-is-the-one-accessory-i-cant-live-without">cable management tray</a> also makes use of magnets. It bolts onto the back of the desk and uses a hinged design with magnets at the top, allowing you to quickly drop it open and securely snap it shut when plugging in a new device.</p><p>With the Magnus Evo built and plugged into the wall, it was finally time to set it up and start using it.</p><h2 id="sleek-solid-and-smooth">Sleek, solid and smooth</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="SnVwcEAmKdDdMc6Bbi48GG" name="Secretlab Magnus Evo-5" alt="The Secretlab Magnus Evo's desktop seen from above" src="https://cdn.mos.cms.futurecdn.net/SnVwcEAmKdDdMc6Bbi48GG.jpg" mos="" align="middle" fullscreen="" width="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>Despite being less expensive than its predecessor, the Magnus Evo immediately has a premium look to it thanks to its soft-touch matte laminate finish and two tone design. While I wish there were other color options besides black, knowing Secretlab, I can almost guarantee they’ll release a white version later on like they did with the Magnus Pro.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="snQY4wicxwjBDvPYcPLrQk" name="UGREEN DH4300 Plus-11" alt="An overhead shot showing a computer connected to the Ugreen NASync DH4300 Plus in a web browser with flash drives and external hard drives on a desk" src="https://cdn.mos.cms.futurecdn.net/snQY4wicxwjBDvPYcPLrQk.jpg" mos="" align="middle" fullscreen="" width="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>After assembling the Magnus Evo, I first tried it out with a more traditional single monitor setup with a <a href="https://www.tomsguide.com/computing/monitors/i-just-tested-this-budget-32-inch-4k-gaming-monitor-and-its-the-perfect-upgrade-for-your-ps5-and-xbox-series-x">small soundbar</a> underneath my display. Then on the right, I powered everything using the <a href="https://www.tomsguide.com/computing/mini-pcs/framework-desktop-review">Framework Desktop</a>. As I had recently <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">set up my first NAS</a>, I spent a lot of time sitting at the Magnus Evo uploading old pictures and videos to 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="cAnwkfUZ26ECxSzRR7jvzJ" name="Secretlab Magnus Evo-7" alt="The controls integrated into the side of the Secretlab Magnus Evo" src="https://cdn.mos.cms.futurecdn.net/cAnwkfUZ26ECxSzRR7jvzJ.jpg" mos="" align="middle" fullscreen="" width="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>Whether sitting or standing, everything worked really well and felt very stable at either height. Although the Magnus Evo has just three programmable height preset buttons on the front, one thing I really like about its controls is that they’re built into the desk instead of attached underneath it. Likewise, the toggle on the far right lets you lock the desk’s controls but it also turns off the LED lights that show you the desk’s current height. This is great if you have small children like I do or just don’t want to have another LED display shining in your room at night.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="oXKhKNckhMD6XXzAsQmX8D" name="SmallRig Camera Desk Mount-3" alt="An overhead view of a dual-monitor desk setup with the SmallRig Camera Desk Mount holding up a webcam behind the displays" src="https://cdn.mos.cms.futurecdn.net/oXKhKNckhMD6XXzAsQmX8D.jpg" mos="" align="middle" fullscreen="" width="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 moved the Magnus Evo over to the other side of my game room and put together a more complicated <a href="https://www.tomsguide.com/computing/i-ditched-my-ultrawide-display-for-this-dual-monitor-setup-heres-what-happened">dual-monitor setup</a>. I used Secretlab’s dual monitor arm to do so and to hide my PC, I used its under-desk PC mount. Now it’s designed for one of the <a href="https://www.tomsguide.com/us/best-gaming-pc,review-2219.html">best gaming PCs</a> which are larger and bulkier. However, with a bit of jerry-rigging I managed to mount one of the <a href="https://www.tomsguide.com/us/best-mini-pc.html">best mini PCs</a> — the vertically-oriented <a href="https://www.tomsguide.com/computing/desktop-computers/atomman-g7-ti-review">Atomman G7 Ti</a> — there while using Secretlab’s magnetic headphone hanger to hold it in place. Unconventional I know but I really wanted to free up some much needed desk space while still having a dual-monitor setup.</p><p>Thanks to its powerful dual motors, the Magnus Evo is able to adjust from my preferred sitting to standing position in just over 10 seconds both ways. It’s also fairly quiet while doing so without the extra whirring you might hear from a single-motor electric standing desk. When coming down, it stayed between 45-47 dB on my sound meter which lines up with Secretlab’s under 50 db claim. However, when raising up, the Magnus Evo got as loud as 57 dB which is slightly over this. Still, adjusting this desk’s height isn’t going to be distracting for yourself or anyone else in the same room as you.</p><p>Even though I tested out the smaller, 60-inch wide, standard Magnus Evo, I still had plenty of room for my dual-monitor set up. I’ve used this desk setup for both work and play since the end of January and it’s been great. However, not being able to snap one of Secretlab’s MagPad desk mats on its desktop has led to some unforeseen consequences.</p><h3 class="article-body__section" id="section-secretlab-magnus-evo-the-downs"><span>Secretlab Magnus Evo: The downs</span></h3><p>The Secretlab Magnus Evo retains many of the best features of its predecessor at a more affordable price point. However, it’s not without its downsides, namely its more delicate desktop and the feeling of being locked into Secretlab’s premium ecosystem of accessories.</p><h2 id="a-desk-mat-isn-t-optional">A desk mat isn’t optional</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cAY2YE9eJtnsTdCtAHpnKe" name="SmallRig Camera Desk Mount-4" alt="A dual-monitor desk setup with the SmallRig Camera Desk Mount holding up a webcam behind the displays" src="https://cdn.mos.cms.futurecdn.net/cAY2YE9eJtnsTdCtAHpnKe.jpg" mos="" align="middle" fullscreen="" width="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 Guid)</span></figcaption></figure><p>Though I’ve often used a <a href="https://www.tomsguide.com/opinion/this-is-the-most-underrated-accessory-for-your-desk-and-its-super-cheap">desk mat</a> in the past to protect the surface of my desk and to help reduce extra noise from typing on one of the <a href="https://www.tomsguide.com/best-picks/best-mechanical-keyboards">best mechanical keyboards</a>, I chose not to with the Magnus Evo. I did so for two reasons: I didn't want to cover the desk's beautiful finish, and I really liked how its soft-touch laminate felt under my forearms.</p><p>Unfortunately, when I moved the desk across my game room after a few weeks of use, I noticed small micro-scratches underneath where my keyboard had been. They aren't very noticeable from afar, but if you look closely, they stand out like a dead pixel on one of the <a href="https://www.tomsguide.com/best-picks/best-monitors">best monitors</a>. It's still very usable, but it is annoying when you’ve paid over $500 for a premium 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:1999px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="kcMJoJUC5osQEuXcQRYeDM" name="image1.jpg" alt="Secretlab Magnus Pro" src="https://cdn.mos.cms.futurecdn.net/kcMJoJUC5osQEuXcQRYeDM.jpg" mos="" align="middle" fullscreen="" width="1999" 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>Secretlab’s MagPad desk mats are an elegant (if expensive) solution for the Magnus Pro, as they magnetically snap into place and cover the surface from end to end. However, because the center of the Magnus Evo's desktop isn't metal, they aren’t compatible. This means you’ll have to turn to a third-party desk mat if you want to keep the laminate surface looking pristine.</p><p>On a solid wood desk like the <a href="https://www.tomsguide.com/home/home-office/oakywood-standing-desk-pro-review">Oakywood Standing Desk Pro</a>, you could simply buff or sand out surface-level imperfections. That isn't an option here. To its credit, the Magnus Evo’s laminate is very easy to wipe down, but it is far more susceptible to permanent wear than its more expensive, all-metal sibling.</p><h2 id="accessorizing-at-a-premium">Accessorizing at a premium</h2><p>I’ve hinted at it throughout this review, but Secretlab’s ecosystem of first-party accessories isn’t cheap. For instance, the dual-monitor arm I’m using here costs $249, which is more than you’ll pay for most of the <a href="https://www.tomsguide.com/best-picks/best-monitor-arms">best monitor arms</a>. The same holds true for its cable management accessories and under-desk PC mount.</p><p>With monitor arms in particular, it might be worth spending extra on one of Secretlab’s due to the Magnus Evo’s design. Since the cable management tray is right up against the back of the desk and you don’t have the option to position it elsewhere, if you’re clamping a monitor arm right at the center, it needs to be a low-profile one. If it isn’t, you’re going to have a much harder time turning the knob for its clamp. Depending on which third-party monitor arm you choose, this might not even be possible.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xgYeKu2DoEBmTQuxsCfAiG" name="SmallRig Camera Desk Mount-2" alt="A rear view shot of a webcam mounted on the SmallRig Camera Desk Mount behind a dual-monitor setup" src="https://cdn.mos.cms.futurecdn.net/xgYeKu2DoEBmTQuxsCfAiG.jpg" mos="" align="middle" fullscreen="" width="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 I used Secretlab’s dual monitor arm in this desk setup, I did manage to clamp a third-party accessory to the back of the Magnus Evo. Since I wanted my webcam in the center of the desk, I used a <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">camera desk mount from SmallRig</a> to put it between my two monitors. This took quite a bit of back and forth, given there’s not a lot of clearance between the desktop and the cable management tray, but I eventually got it to work.</p><p>Just like with one of the <a href="https://www.tomsguide.com/us/best-apple-iphone,review-6348.html">best iPhones</a>, if you do pick up a Magnus Evo or even a Magnus Pro, prepare to set aside some extra cash for a few of Secretlab’s first-party accessories.</p><h3 class="article-body__section" id="section-secretlab-magnus-evo-verdict"><span>Secretlab Magnus Evo: Verdict</span></h3><p>The Secretlab Magnus Evo is a sleek and impressive electric standing desk. Thanks to its more subdued design, it works just as well for your battlestation as it does for a dedicated work-from-home setup. The Magnus Evo is more affordable than its predecessor, yet Secretlab still managed to retain many of the best features of the Magnus Pro, like its integrated power supply column and support for magnetic accessories.</p><p>While I wish the Magnus Evo’s soft-touch laminate desktop was slightly more resilient, it does feel and look great. Likewise, since the cable management tray is a standalone unit rather than being integrated across the entire frame, you get a bit more freedom when it comes to using third-party accessories, which can be clamped more easily onto the left or right sides of the rear edge.</p><p>If you’re looking for a gaming desk that gives you the freedom to play while sitting or standing, the Magnus Evo is an excellent choice. It may not have the built-in storage of Corsair’s Platform 4 Elevate but it does have a more premium look and feel to it.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Steam Controller price leaked — and I'd start saving now ]]></title>
                                                                                                <dc:content><![CDATA[ <p>We're still waiting for a lot of info about the Steam Controller, but we may have just learned how much Valve's new peripheral could cost — and based on this potential price leak, if you're planning to pick one up, I'd start saving now.  </p><p>Today (April 25), reports of a potential Steam Controller price leak circulated online, and if<strong> </strong>they're correct, it sounds like Valve's new hardware won't be cheap. If the leak is true, <strong>Valve's new</strong> <strong>Steam Controller could set you back $99 at launch. </strong></p><p>I say "could" because this potential Steam Controller price reveal comes from a relatively unknown source. It was reported in a video<a href="https://www.tomsguide.com/tag/youtube"> </a>review of the gaming peripheral that briefly appeared online (as reported by <a href="https://www.vice.com/en/article/steam-controller-price-leaked-by-early-review-and-its-expensive/" target="_blank">Vice</a>). </p><p>Users on the Steam Controller <a href="https://www.reddit.com/r/SteamController/comments/1sulvfn/youtuber_slipped_embargo/" target="_blank" rel="nofollow">Reddit</a> have preserved a screenshot and <a href="https://streamable.com/lj7ut3" target="_blank">reuploaded the full video online</a>, and some have shared their concerns about the price (though users remain divided on whether the price leak is even real or not). </p><p>If the price they quote is correct, that would mean a Steam Controller will cost the same as a <a href="https://www.nintendo.com/us/store/products/nintendo-switch-2-joy-con-2-l-r-light-blue-light-red-123677/" target="_blank" rel="nofollow">new set of Nintendo Switch 2 Joy-Cons,</a> and it'll be $25 more expensive than the <a href="https://direct.playstation.com/en-us/buy-accessories/dualsense-wireless-controller" target="_blank" rel="nofollow">PlayStation 5 DualSense controller.</a></p><h2 id="steam-controller-launch-seems-imminent">Steam Controller launch seems imminent</h2><p>Whether this Steam Controller leak is true or not, it nevertheless seems like we're due to get more info about Valve's new pad soon. Just yesterday (April 24), we learned that the company had <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steam-controller-launch-imminent-as-valve-uploads-secret-unboxing-heres-what-you-need-to-know">uploaded a "secret" Steam Controller unboxing video online.</a></p><p>That news came from industry insider Brad Lynch. <a href="https://x.com/SadlyItsBradley/status/2046363689721245922" target="_blank">On X</a>,  Lynch shared that he'd found evidence that an unwatchable "Steam Controller Unboxing" video had been uploaded on SteamDB. </p><p>The video is set to private, but it nevertheless serves as an indicator that Valve is poised to reveal more about the Steam Controller soon. </p><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2046363689721245922"><p lang="en" dir="ltr">Valve has “secretly” uploaded a Steam Controller unboxing video (unwatchable right now)I think we will see its launch very soon.. pic.twitter.com/SCjl7p3Rqv<a href="https://twitter.com/cantworkitout/status/2046363689721245922">April 20, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>Given Lynch shared his findings not long after <a href="https://komodostation.com/?lang=en" target="_blank">Komodo Station</a> — the Japanese storefront for Steam hardware — uploaded assets (which <a href="https://web.archive.org/web/20260424055338/https://komodostation.com/product/steam-controller_jpy/" target="_blank">you can still view on the Internet Archive</a>), all signs seem to point to an impending Steam Controller release. </p><p>And seeing as we still don't have a confirmed price point, precise specs <em>or </em>a Steam Controller release date, there's still more we need to learn about the new device. We'll just have to keep an eye on the <a href="https://store.steampowered.com/news/group/45479024" target="_blank" rel="nofollow">Steam Hardware News Hub</a> in the hope that Valve shares more details soon. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WwKvAW"></div>                            </div>                            <script src="https://kwizly.com/embed/WwKvAW.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/gaming/xbox/xbox-game-pass-and-discord-tier-leaks">Xbox Game Pass and Discord tier leaks</a></li><li><a href="https://www.tomsguide.com/gaming/ps5-vs-ps5-pro-which-console-should-you-buy-in-2026">PS5 vs. PS5 Pro: Which console should you buy in 2026?</a></li><li><a href="https://www.tomsguide.com/gaming/saros-review">Saros is everything I wanted from a Returnal sequel</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/steam-controller-price-leaked-online-and-id-start-saving-now</link>
                                                                            <description>
                            <![CDATA[ A YouTuber may have just leaked the price of Valve's new Steam Controller, and if the price is correct, you should start saving for the new peripheral now. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Pq2MuRwL9MDp6DsujpLGx9</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/pCdaysxcM5mpT5CdE2DmhV-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 25 Apr 2026 18:50:04 +0000</pubDate>                                                                                                                                <updated>Sat, 25 Apr 2026 19:08:32 +0000</updated>
                                                                                                                                            <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Martin Shore ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/a5UrfxWQGQmYiGZ9sXbKja.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/pCdaysxcM5mpT5CdE2DmhV-1280-80.jpg">
                                                            <media:credit><![CDATA[Valve]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A still image showing the Steam Controller]]></media:description>                                                            <media:text><![CDATA[A still image showing the Steam Controller]]></media:text>
                                <media:title type="plain"><![CDATA[A still image showing the Steam Controller]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/pCdaysxcM5mpT5CdE2DmhV-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>We're still waiting for a lot of info about the Steam Controller, but we may have just learned how much Valve's new peripheral could cost — and based on this potential price leak, if you're planning to pick one up, I'd start saving now.  </p><p>Today (April 25), reports of a potential Steam Controller price leak circulated online, and if<strong> </strong>they're correct, it sounds like Valve's new hardware won't be cheap. If the leak is true, <strong>Valve's new</strong> <strong>Steam Controller could set you back $99 at launch. </strong></p><p>I say "could" because this potential Steam Controller price reveal comes from a relatively unknown source. It was reported in a video<a href="https://www.tomsguide.com/tag/youtube"> </a>review of the gaming peripheral that briefly appeared online (as reported by <a href="https://www.vice.com/en/article/steam-controller-price-leaked-by-early-review-and-its-expensive/" target="_blank">Vice</a>). </p><p>Users on the Steam Controller <a href="https://www.reddit.com/r/SteamController/comments/1sulvfn/youtuber_slipped_embargo/" target="_blank" rel="nofollow">Reddit</a> have preserved a screenshot and <a href="https://streamable.com/lj7ut3" target="_blank">reuploaded the full video online</a>, and some have shared their concerns about the price (though users remain divided on whether the price leak is even real or not). </p><p>If the price they quote is correct, that would mean a Steam Controller will cost the same as a <a href="https://www.nintendo.com/us/store/products/nintendo-switch-2-joy-con-2-l-r-light-blue-light-red-123677/" target="_blank" rel="nofollow">new set of Nintendo Switch 2 Joy-Cons,</a> and it'll be $25 more expensive than the <a href="https://direct.playstation.com/en-us/buy-accessories/dualsense-wireless-controller" target="_blank" rel="nofollow">PlayStation 5 DualSense controller.</a></p><h2 id="steam-controller-launch-seems-imminent">Steam Controller launch seems imminent</h2><p>Whether this Steam Controller leak is true or not, it nevertheless seems like we're due to get more info about Valve's new pad soon. Just yesterday (April 24), we learned that the company had <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steam-controller-launch-imminent-as-valve-uploads-secret-unboxing-heres-what-you-need-to-know">uploaded a "secret" Steam Controller unboxing video online.</a></p><p>That news came from industry insider Brad Lynch. <a href="https://x.com/SadlyItsBradley/status/2046363689721245922" target="_blank">On X</a>,  Lynch shared that he'd found evidence that an unwatchable "Steam Controller Unboxing" video had been uploaded on SteamDB. </p><p>The video is set to private, but it nevertheless serves as an indicator that Valve is poised to reveal more about the Steam Controller soon. </p><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2046363689721245922"><p lang="en" dir="ltr">Valve has “secretly” uploaded a Steam Controller unboxing video (unwatchable right now)I think we will see its launch very soon.. pic.twitter.com/SCjl7p3Rqv<a href="https://twitter.com/cantworkitout/status/2046363689721245922">April 20, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>Given Lynch shared his findings not long after <a href="https://komodostation.com/?lang=en" target="_blank">Komodo Station</a> — the Japanese storefront for Steam hardware — uploaded assets (which <a href="https://web.archive.org/web/20260424055338/https://komodostation.com/product/steam-controller_jpy/" target="_blank">you can still view on the Internet Archive</a>), all signs seem to point to an impending Steam Controller release. </p><p>And seeing as we still don't have a confirmed price point, precise specs <em>or </em>a Steam Controller release date, there's still more we need to learn about the new device. We'll just have to keep an eye on the <a href="https://store.steampowered.com/news/group/45479024" target="_blank" rel="nofollow">Steam Hardware News Hub</a> in the hope that Valve shares more details soon. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WwKvAW"></div>                            </div>                            <script src="https://kwizly.com/embed/WwKvAW.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/gaming/xbox/xbox-game-pass-and-discord-tier-leaks">Xbox Game Pass and Discord tier leaks</a></li><li><a href="https://www.tomsguide.com/gaming/ps5-vs-ps5-pro-which-console-should-you-buy-in-2026">PS5 vs. PS5 Pro: Which console should you buy in 2026?</a></li><li><a href="https://www.tomsguide.com/gaming/saros-review">Saros is everything I wanted from a Returnal sequel</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Steam Controller launch imminent as Valve uploads 'secret' unboxing — here's what you need to know ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Valve's Steam Machine may be <a href="https://www.tomsguide.com/gaming/valve-hope-to-ship-steam-machines-in-2026-but-memory-shortages-could-cause-delays">taking its sweet time to arrive</a>, but at least the company could be about to show off its new controller. According to a leak posted by industry insider <a href="https://x.com/SadlyItsBradley/status/2046363689721245922" target="_blank">Brad Lynch on X</a> earlier this week, the Steam Controller could arrive any day now.</p><p>Lynch found evidence of a "Steam Controller Unboxing" video that was uploaded to SteamDB. It's set to private and can't be watched, but it serves as a good indication that the updated version of the controller is ready for primetime.</p><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2046363689721245922"><p lang="en" dir="ltr">Valve has “secretly” uploaded a Steam Controller unboxing video (unwatchable right now)I think we will see its launch very soon.. pic.twitter.com/SCjl7p3Rqv<a href="https://twitter.com/cantworkitout/status/2046363689721245922">April 20, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>Separately, Lynch says he's seen shipping documents that suggest Valve has received its first large batch of the new controllers.</p><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2043601850306609268"><p lang="en" dir="ltr">Looks like Valve received their first large quantity imports of “Wireless PC Controller” last week 🫪(At least in the USA)<a href="https://twitter.com/cantworkitout/status/2043601850306609268">April 13, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>The Steam Controller was <a href="https://www.tomsguide.com/news/live/valve-steam-machine-2025">announced alongside the Steam Machine in 2025</a>, but details have been very thin on the ground since then. While we expect it to be packaged with Steam Machine when it (eventually) launches, the controller is also going to be sold separately. </p><p>There's no reason why Valve has to release them at the same time; the company could easily decide to launch the peripheral first.</p><h2 id="assets-appear-on-steam-s-japan-storefront">Assets appear on Steam's Japan storefront</h2><p>Adding fuel to this fire came when Komodo Station — the Japanese storefront for Steam hardware — uploaded all the assets for the controller this week, before hastily pulling them down again. A <a href="https://web.archive.org/web/20260424055338/https://komodostation.com/product/steam-controller_jpy/" target="_blank">trip to the Internet Archive will still let you see them</a>, and since Komodo Station has a track record of following Valve's global sales schedule, the signs are good.</p><p>While we know Valve is also prepping the Steam Machine and <a href="https://www.tomsguide.com/computing/vr-ar/steam-frame-will-take-over-vr-in-2026-3-key-features-i-cant-wait-for">the Steam Frame</a> for launch, neither of those assets appeared on the storefront.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="djtjcDyxp27vCNuxWeTJ8B" name="Steam Machine edit 2" alt="Steam Machine" src="https://cdn.mos.cms.futurecdn.net/djtjcDyxp27vCNuxWeTJ8B.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Steam Machine: still delayed </span><span class="credit" itemprop="copyrightHolder">(Image credit: Valve)</span></figcaption></figure><p>Of course, anyone that's following the Steam situation as it unfolds will know about the crushing impact of the current RAM crisis. Valve has already <a href="https://www.tomsguide.com/gaming/pc-gaming/steam-machine-delayed-as-valve-will-revisit-the-cost-because-of-the-ram-price-crisis">delayed the Steam Machine to "revisit" the cost of the device</a>, but all these signs point to a new controller being the first product out the door.</p><p>There's still so much we don't know about the peripheral: pricing, release date, specs and feature updates — but hopefully it won't be a long wait before we find out.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WwKvAW"></div>                            </div>                            <script src="https://kwizly.com/embed/WwKvAW.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/gaming/im-obsessed-with-tomodachi-life-these-nintendo-switch-accessories-upgrade-any-cozy-gaming-setup">I'm obsessed with Tomodachi Life — these Nintendo Switch accessories upgrade any cozy gaming setup</a></li><li><a href="https://www.tomsguide.com/gaming/saros-review">Saros is everything I wanted from a Returnal sequel — and it fixes its predecessor's biggest problems</a></li><li><a href="https://www.tomsguide.com/gaming/handheld-gaming/panther-lake-handhelds-could-put-amd-on-notice-but-theres-a-big-hurdle-to-overcome">Panther Lake handhelds could put AMD on notice, but there’s a big hurdle to overcome</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/steam-controller-launch-imminent-as-valve-uploads-secret-unboxing-heres-what-you-need-to-know</link>
                                                                            <description>
                            <![CDATA[ Valve has uploaded an unwatchable unboxing video of the new Steam Controller to its platform, suggesting a launch is imminent. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">NyWHzrnyaWhnzkGEugFfKM</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/pCdaysxcM5mpT5CdE2DmhV-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 24 Apr 2026 10:50:47 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                <author><![CDATA[ jeff.parsons@futurenet.com (Jeff Parsons) ]]></author>                    <dc:creator><![CDATA[ Jeff Parsons ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/7z3UTGGrmSokMKxTWHmhjX.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jeff is U.K. Editor-in-Chief for Tom’s Guide looking after the day-to-day output of the site’s British contingent. &lt;/p&gt;&lt;p&gt;Rising early and heading straight for the coffee machine, Jeff loves nothing more than dialling into the zeitgeist of the day’s tech news. A journalist for over a decade, he&#039;s travelled around the world testing and reviewing any gadget he can get his hands on.&lt;/p&gt;&lt;p&gt;Before joining the team at Tom’s Guide, Jeff covered technology and science for two of the U.K.’s biggest national news sites: Metro.co.uk and the Daily Mirror. Memorable moments include getting lost in Vienna in an electric Audi, touring Lockheed Martin’s mile-long jet factory in Fort Worth and filming a Netflix documentary about Elon Musk in West London.&lt;/p&gt;&lt;p&gt;When not plugged into the current news agenda, editing or commissioning a series of articles or debating the merits of Apple vs Android, Jeff can usually be found out for a run trying to shave precious seconds off his PB. Or lifting weights in a vain attempt to offset the ageing process.&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/pCdaysxcM5mpT5CdE2DmhV-1280-80.jpg">
                                                            <media:credit><![CDATA[Valve]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A still image showing the Steam Controller]]></media:description>                                                            <media:text><![CDATA[A still image showing the Steam Controller]]></media:text>
                                <media:title type="plain"><![CDATA[A still image showing the Steam Controller]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/pCdaysxcM5mpT5CdE2DmhV-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Valve's Steam Machine may be <a href="https://www.tomsguide.com/gaming/valve-hope-to-ship-steam-machines-in-2026-but-memory-shortages-could-cause-delays">taking its sweet time to arrive</a>, but at least the company could be about to show off its new controller. According to a leak posted by industry insider <a href="https://x.com/SadlyItsBradley/status/2046363689721245922" target="_blank">Brad Lynch on X</a> earlier this week, the Steam Controller could arrive any day now.</p><p>Lynch found evidence of a "Steam Controller Unboxing" video that was uploaded to SteamDB. It's set to private and can't be watched, but it serves as a good indication that the updated version of the controller is ready for primetime.</p><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2046363689721245922"><p lang="en" dir="ltr">Valve has “secretly” uploaded a Steam Controller unboxing video (unwatchable right now)I think we will see its launch very soon.. pic.twitter.com/SCjl7p3Rqv<a href="https://twitter.com/cantworkitout/status/2046363689721245922">April 20, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>Separately, Lynch says he's seen shipping documents that suggest Valve has received its first large batch of the new controllers.</p><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2043601850306609268"><p lang="en" dir="ltr">Looks like Valve received their first large quantity imports of “Wireless PC Controller” last week 🫪(At least in the USA)<a href="https://twitter.com/cantworkitout/status/2043601850306609268">April 13, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>The Steam Controller was <a href="https://www.tomsguide.com/news/live/valve-steam-machine-2025">announced alongside the Steam Machine in 2025</a>, but details have been very thin on the ground since then. While we expect it to be packaged with Steam Machine when it (eventually) launches, the controller is also going to be sold separately. </p><p>There's no reason why Valve has to release them at the same time; the company could easily decide to launch the peripheral first.</p><h2 id="assets-appear-on-steam-s-japan-storefront">Assets appear on Steam's Japan storefront</h2><p>Adding fuel to this fire came when Komodo Station — the Japanese storefront for Steam hardware — uploaded all the assets for the controller this week, before hastily pulling them down again. A <a href="https://web.archive.org/web/20260424055338/https://komodostation.com/product/steam-controller_jpy/" target="_blank">trip to the Internet Archive will still let you see them</a>, and since Komodo Station has a track record of following Valve's global sales schedule, the signs are good.</p><p>While we know Valve is also prepping the Steam Machine and <a href="https://www.tomsguide.com/computing/vr-ar/steam-frame-will-take-over-vr-in-2026-3-key-features-i-cant-wait-for">the Steam Frame</a> for launch, neither of those assets appeared on the storefront.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="djtjcDyxp27vCNuxWeTJ8B" name="Steam Machine edit 2" alt="Steam Machine" src="https://cdn.mos.cms.futurecdn.net/djtjcDyxp27vCNuxWeTJ8B.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Steam Machine: still delayed </span><span class="credit" itemprop="copyrightHolder">(Image credit: Valve)</span></figcaption></figure><p>Of course, anyone that's following the Steam situation as it unfolds will know about the crushing impact of the current RAM crisis. Valve has already <a href="https://www.tomsguide.com/gaming/pc-gaming/steam-machine-delayed-as-valve-will-revisit-the-cost-because-of-the-ram-price-crisis">delayed the Steam Machine to "revisit" the cost of the device</a>, but all these signs point to a new controller being the first product out the door.</p><p>There's still so much we don't know about the peripheral: pricing, release date, specs and feature updates — but hopefully it won't be a long wait before we find out.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WwKvAW"></div>                            </div>                            <script src="https://kwizly.com/embed/WwKvAW.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/gaming/im-obsessed-with-tomodachi-life-these-nintendo-switch-accessories-upgrade-any-cozy-gaming-setup">I'm obsessed with Tomodachi Life — these Nintendo Switch accessories upgrade any cozy gaming setup</a></li><li><a href="https://www.tomsguide.com/gaming/saros-review">Saros is everything I wanted from a Returnal sequel — and it fixes its predecessor's biggest problems</a></li><li><a href="https://www.tomsguide.com/gaming/handheld-gaming/panther-lake-handhelds-could-put-amd-on-notice-but-theres-a-big-hurdle-to-overcome">Panther Lake handhelds could put AMD on notice, but there’s a big hurdle to overcome</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I upgraded my 7-year-old office chair to a TX3 Solo 360 gaming chair — and I should have done this sooner ]]></title>
                                                                                                <dc:content><![CDATA[ <p>For most of the past seven years, I’ve been sitting on a $50 office chair I bought just a few months after graduating from college. Even as somebody who typically refuses to replace household items until they’ve reached a breaking point, its lifespan had stretched ludicrously far. And trust me, it was <em>really</em> showing its age with a worn-out, torn (fake) leather seat. </p><p>So, when I was given the chance to switch to the ThunderX3 Solo 360, I quickly found out it's a lot more than <em>just </em>a gaming chair. Within just a few days of use, my overriding feeling was that I probably should have made this change several years ago. </p><p>It would perhaps be an exaggeration to say it’s revolutionized my home setup, but my comfort levels have certainly shot up, and my back in particular has never been happier. The <a href="https://www.overclockers.co.uk/tx3-solo-360-gaming-chair-loft-air-dark-grey-gch-thu-05380.html" target="_blank" rel="nofollow">TX3 Solo 360 Gaming Chair is currently on sale for £139 (was £189) at Overclockers</a> (or for U.S. readers, it’s available for <a href="https://www.amazon.com/ThunderX3-Ergonomic-Synchronous-360-degree-Adjustable/dp/B0G1661N8L" target="_blank" rel="nofollow">$249 at Amazon</a>). Here’s why I believe it’s a smart seating investment. </p><div class="product"><a data-dimension112="0c0c93e1-b5c8-464c-81c0-7911e9439145" data-action="Deal Block" data-label="Solo 360 Gaming Chair" data-dimension48="Solo 360 Gaming Chair" data-dimension25="$249" href="https://www.amazon.com/ThunderX3-Ergonomic-Synchronous-360-degree-Adjustable/dp/B0G1661N8L" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1074px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="RePuDAS6inQ6xpvUZQcpaZ" name="tx3-solo-360-gaming-chair" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/RePuDAS6inQ6xpvUZQcpaZ.jpg" mos="" align="middle" fullscreen="" width="1074" height="1074" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The TX3 Solo 360 Gaming Chair is a smart-looking and well-designed piece of furniture that focuses on nailing the fundamentals. It offers a strong lumbar support and comfort even after hours of use. It also has "3D x 360" armsets and a "car seat style" headrest. With six degrees of adjustment, you can find the setup that best suits your needs. It's available in three colorways: Light Grey, Dark Grey and Modern Black.<a class="view-deal button" href="https://www.amazon.com/ThunderX3-Ergonomic-Synchronous-360-degree-Adjustable/dp/B0G1661N8L" target="_blank" rel="nofollow" data-dimension112="0c0c93e1-b5c8-464c-81c0-7911e9439145" data-action="Deal Block" data-label="Solo 360 Gaming Chair" data-dimension48="Solo 360 Gaming Chair" data-dimension25="$249">View Deal</a></p></div><div class="product"><a data-dimension112="f66e98d8-edfa-4ca7-a087-81d6a2fc67dd" data-action="Deal Block" data-label="Solo 360 Gaming Chair" data-dimension48="Solo 360 Gaming Chair" data-dimension25="£139" href="https://www.overclockers.co.uk/tx3-solo-360-gaming-chair-loft-air-light-grey-gch-thu-05381.html" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1074px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="RePuDAS6inQ6xpvUZQcpaZ" name="tx3-solo-360-gaming-chair" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/RePuDAS6inQ6xpvUZQcpaZ.jpg" mos="" align="middle" fullscreen="" width="1074" height="1074" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.overclockers.co.uk/tx3-solo-360-gaming-chair-loft-air-light-grey-gch-thu-05381.html" target="_blank" rel="nofollow" data-dimension112="f66e98d8-edfa-4ca7-a087-81d6a2fc67dd" data-action="Deal Block" data-label="Solo 360 Gaming Chair" data-dimension48="Solo 360 Gaming Chair" data-dimension25="£139">Solo 360 Gaming Chair: was £189 now £139</a></strong><br>And in the U.K., you can get £50 off this chair — serious value for money on one of the most underrated upgrades to any setup!<a class="view-deal button" href="https://www.overclockers.co.uk/tx3-solo-360-gaming-chair-loft-air-light-grey-gch-thu-05381.html" target="_blank" rel="nofollow" data-dimension112="f66e98d8-edfa-4ca7-a087-81d6a2fc67dd" data-action="Deal Block" data-label="Solo 360 Gaming Chair" data-dimension48="Solo 360 Gaming Chair" data-dimension25="£139">View Deal</a></p></div><h2 id="tx3-solo-360-is-a-great-chair-choice-even-for-non-gamers">TX3 Solo 360 is a great chair choice, even for non-gamers</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="WaRm4wNQm3rgFANf8NLECK" name="tx3-solo-360-gaming-chair-before-after" alt="Split image showing the authors old $50 desk chair and the TX3 Solo 360 Gaming Chair" src="https://cdn.mos.cms.futurecdn.net/WaRm4wNQm3rgFANf8NLECK.jpg" mos="" align="middle" fullscreen="" width="4000" height="2250" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future / Tom's Guide)</span></figcaption></figure><p>When you hear the term “gaming chair,” you might first think of a rather garish piece of furniture, but the TX3 Solo 360 comes in subtler shades. Available in light or dark grey, or a simple black, it’s a chair that doesn’t scream “manchild,” and that’s perfect for me. The collection of gaming figures and statues lining my office shelves already makes my inherent nerdiness very clear; I don’t need that message further reinforced by my desk chair. </p><p>While other gaming chairs I’ve tried in the past offer dedicated lumbar-support cushions and neck pillows, the TX3 Solo 360 dispenses with these. The fabric-upholstery seat, in a standard scoop shape, offers all the support my back has needed with firm foam padding that’s comfy, even after multi-hour sessions. There are six degrees of adjustment, and it takes just seconds to “lock” the chair into position once you’ve found the settings right for you.</p><p>One of the most highlighted features of the TX3 Solo 360 is the “3D x 360” armrests. Essentially, the armrests can be rotated a full 360 degrees. This gives you plenty of flexibility in how you wish to position them. Unfortunately, these are also my biggest (and only real noteworthy) pain points with this chair. The arm rests sit extremely high in their default position, and can only be adjusted higher still. They do fit under my desk, fortunately, but I’d have liked the ability to lower them for the times I’d like to rest my arms below my chest. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HyHZQurLdbTQoAYGtg2k98" name="tx3-solo-360-gaming-char" alt="TX3 Solo 360 Gaming Chair with the armrest raised to maximum height" src="https://cdn.mos.cms.futurecdn.net/HyHZQurLdbTQoAYGtg2k98.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Thunder)</span></figcaption></figure><p>Another feature is a fabric pocket on the backrest. Retail listings note it “can be used to store your essential peripherals (or snacks!),” but frankly, I’ve found it functionally useless. It sits extremely tight against the chair, so unless you’re cool with your peripherals and/or snacks being squished, I’m not sure you’ll get much use from it. I guess you could store paperwork in the pocket?</p><p>Factor in the “car seat style headrest,” which, in layman’s terms, means a headrest connected via two metal stems and adjusted by gripping it firmly and pulling up or down, and that’s pretty much the TX3 Solo 360. It’s a chair that strips away a lot of the accoutrements found in higher-priced models on the market, such as a retractable footrest. However, these extras typically fall into the “nice to have” category, and I’ve not found myself wishing for them.</p><p>If you’re looking for an unassuming gaming chair that gets all the basics right, and can neatly fit into almost any office or games room setup, the TX3 Solo 360 is a smart choice. Plus, even after only a few weeks of use, I’m already confident I could spend seven years with this chair without feeling like an upgrade was overdue. It does the important job it sets out to do with ease.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/i-upgraded-my-7-year-old-office-chair-to-a-tx3-solo-360-gaming-chair-and-i-should-have-done-this-sooner</link>
                                                                            <description>
                            <![CDATA[ After finally deciding my ripped-up $50 office chair was due for an upgrade, I switched to the TX3 Solo 360 gaming chair, and I love it. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">3HXZJny4VAnzhNkHuo97cX</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/mZd7LeeLty9VVsDMgxv32o-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 06 Apr 2026 14:00:00 +0000</pubDate>                                                                                                                                <updated>Tue, 07 Apr 2026 16:40:00 +0000</updated>
                                                                                                                                            <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                <author><![CDATA[ rory.mellon@futurenet.com (Rory Mellon) ]]></author>                    <dc:creator><![CDATA[ Rory Mellon ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/5Rv6LtQXMj5JB4Eu8Lt4Sn.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/mZd7LeeLty9VVsDMgxv32o-1280-80.jpg">
                                                            <media:credit><![CDATA[Thunder]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[TX3 Solo 360 Gaming Chair in an office setup]]></media:description>                                                            <media:text><![CDATA[TX3 Solo 360 Gaming Chair in an office setup]]></media:text>
                                <media:title type="plain"><![CDATA[TX3 Solo 360 Gaming Chair in an office setup]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/mZd7LeeLty9VVsDMgxv32o-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>For most of the past seven years, I’ve been sitting on a $50 office chair I bought just a few months after graduating from college. Even as somebody who typically refuses to replace household items until they’ve reached a breaking point, its lifespan had stretched ludicrously far. And trust me, it was <em>really</em> showing its age with a worn-out, torn (fake) leather seat. </p><p>So, when I was given the chance to switch to the ThunderX3 Solo 360, I quickly found out it's a lot more than <em>just </em>a gaming chair. Within just a few days of use, my overriding feeling was that I probably should have made this change several years ago. </p><p>It would perhaps be an exaggeration to say it’s revolutionized my home setup, but my comfort levels have certainly shot up, and my back in particular has never been happier. The <a href="https://www.overclockers.co.uk/tx3-solo-360-gaming-chair-loft-air-dark-grey-gch-thu-05380.html" target="_blank" rel="nofollow">TX3 Solo 360 Gaming Chair is currently on sale for £139 (was £189) at Overclockers</a> (or for U.S. readers, it’s available for <a href="https://www.amazon.com/ThunderX3-Ergonomic-Synchronous-360-degree-Adjustable/dp/B0G1661N8L" target="_blank" rel="nofollow">$249 at Amazon</a>). Here’s why I believe it’s a smart seating investment. </p><div class="product"><a data-dimension112="0c0c93e1-b5c8-464c-81c0-7911e9439145" data-action="Deal Block" data-label="Solo 360 Gaming Chair" data-dimension48="Solo 360 Gaming Chair" data-dimension25="$249" href="https://www.amazon.com/ThunderX3-Ergonomic-Synchronous-360-degree-Adjustable/dp/B0G1661N8L" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1074px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="RePuDAS6inQ6xpvUZQcpaZ" name="tx3-solo-360-gaming-chair" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/RePuDAS6inQ6xpvUZQcpaZ.jpg" mos="" align="middle" fullscreen="" width="1074" height="1074" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The TX3 Solo 360 Gaming Chair is a smart-looking and well-designed piece of furniture that focuses on nailing the fundamentals. It offers a strong lumbar support and comfort even after hours of use. It also has "3D x 360" armsets and a "car seat style" headrest. With six degrees of adjustment, you can find the setup that best suits your needs. It's available in three colorways: Light Grey, Dark Grey and Modern Black.<a class="view-deal button" href="https://www.amazon.com/ThunderX3-Ergonomic-Synchronous-360-degree-Adjustable/dp/B0G1661N8L" target="_blank" rel="nofollow" data-dimension112="0c0c93e1-b5c8-464c-81c0-7911e9439145" data-action="Deal Block" data-label="Solo 360 Gaming Chair" data-dimension48="Solo 360 Gaming Chair" data-dimension25="$249">View Deal</a></p></div><div class="product"><a data-dimension112="f66e98d8-edfa-4ca7-a087-81d6a2fc67dd" data-action="Deal Block" data-label="Solo 360 Gaming Chair" data-dimension48="Solo 360 Gaming Chair" data-dimension25="£139" href="https://www.overclockers.co.uk/tx3-solo-360-gaming-chair-loft-air-light-grey-gch-thu-05381.html" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1074px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="RePuDAS6inQ6xpvUZQcpaZ" name="tx3-solo-360-gaming-chair" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/RePuDAS6inQ6xpvUZQcpaZ.jpg" mos="" align="middle" fullscreen="" width="1074" height="1074" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.overclockers.co.uk/tx3-solo-360-gaming-chair-loft-air-light-grey-gch-thu-05381.html" target="_blank" rel="nofollow" data-dimension112="f66e98d8-edfa-4ca7-a087-81d6a2fc67dd" data-action="Deal Block" data-label="Solo 360 Gaming Chair" data-dimension48="Solo 360 Gaming Chair" data-dimension25="£139">Solo 360 Gaming Chair: was £189 now £139</a></strong><br>And in the U.K., you can get £50 off this chair — serious value for money on one of the most underrated upgrades to any setup!<a class="view-deal button" href="https://www.overclockers.co.uk/tx3-solo-360-gaming-chair-loft-air-light-grey-gch-thu-05381.html" target="_blank" rel="nofollow" data-dimension112="f66e98d8-edfa-4ca7-a087-81d6a2fc67dd" data-action="Deal Block" data-label="Solo 360 Gaming Chair" data-dimension48="Solo 360 Gaming Chair" data-dimension25="£139">View Deal</a></p></div><h2 id="tx3-solo-360-is-a-great-chair-choice-even-for-non-gamers">TX3 Solo 360 is a great chair choice, even for non-gamers</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="WaRm4wNQm3rgFANf8NLECK" name="tx3-solo-360-gaming-chair-before-after" alt="Split image showing the authors old $50 desk chair and the TX3 Solo 360 Gaming Chair" src="https://cdn.mos.cms.futurecdn.net/WaRm4wNQm3rgFANf8NLECK.jpg" mos="" align="middle" fullscreen="" width="4000" height="2250" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future / Tom's Guide)</span></figcaption></figure><p>When you hear the term “gaming chair,” you might first think of a rather garish piece of furniture, but the TX3 Solo 360 comes in subtler shades. Available in light or dark grey, or a simple black, it’s a chair that doesn’t scream “manchild,” and that’s perfect for me. The collection of gaming figures and statues lining my office shelves already makes my inherent nerdiness very clear; I don’t need that message further reinforced by my desk chair. </p><p>While other gaming chairs I’ve tried in the past offer dedicated lumbar-support cushions and neck pillows, the TX3 Solo 360 dispenses with these. The fabric-upholstery seat, in a standard scoop shape, offers all the support my back has needed with firm foam padding that’s comfy, even after multi-hour sessions. There are six degrees of adjustment, and it takes just seconds to “lock” the chair into position once you’ve found the settings right for you.</p><p>One of the most highlighted features of the TX3 Solo 360 is the “3D x 360” armrests. Essentially, the armrests can be rotated a full 360 degrees. This gives you plenty of flexibility in how you wish to position them. Unfortunately, these are also my biggest (and only real noteworthy) pain points with this chair. The arm rests sit extremely high in their default position, and can only be adjusted higher still. They do fit under my desk, fortunately, but I’d have liked the ability to lower them for the times I’d like to rest my arms below my chest. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HyHZQurLdbTQoAYGtg2k98" name="tx3-solo-360-gaming-char" alt="TX3 Solo 360 Gaming Chair with the armrest raised to maximum height" src="https://cdn.mos.cms.futurecdn.net/HyHZQurLdbTQoAYGtg2k98.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Thunder)</span></figcaption></figure><p>Another feature is a fabric pocket on the backrest. Retail listings note it “can be used to store your essential peripherals (or snacks!),” but frankly, I’ve found it functionally useless. It sits extremely tight against the chair, so unless you’re cool with your peripherals and/or snacks being squished, I’m not sure you’ll get much use from it. I guess you could store paperwork in the pocket?</p><p>Factor in the “car seat style headrest,” which, in layman’s terms, means a headrest connected via two metal stems and adjusted by gripping it firmly and pulling up or down, and that’s pretty much the TX3 Solo 360. It’s a chair that strips away a lot of the accoutrements found in higher-priced models on the market, such as a retractable footrest. However, these extras typically fall into the “nice to have” category, and I’ve not found myself wishing for them.</p><p>If you’re looking for an unassuming gaming chair that gets all the basics right, and can neatly fit into almost any office or games room setup, the TX3 Solo 360 is a smart choice. Plus, even after only a few weeks of use, I’m already confident I could spend seven years with this chair without feeling like an upgrade was overdue. It does the important job it sets out to do with ease.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tried Genki’s new Covert Dock 3 and it beats the Switch 2's official dock for one big reason ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Upgrading to the <a href="https://www.tomsguide.com/gaming/nintendo/nintendo-switch-2-console-review">Nintendo Switch 2</a> finally let me play all of the <a href="https://www.tomsguide.com/round-up/best-nintendo-switch-games">best Nintendo Switch games</a> in crisp 4K along with a ton of great new releases like Mario Kart World, <a href="https://www.tomsguide.com/gaming/nintendo/donkey-kong-bananza-review">Donkey Kong Bananza</a> and Kirby Air Riders. However, there was just one problem: I now only had one dock.</p><p>Don’t get me wrong, playing the Switch 2 in handheld mode or <a href="https://www.tomsguide.com/gaming/nintendo/i-played-the-switch-2-with-ar-glasses-heres-what-its-like-to-race-mario-kart-world-on-a-135-inch-screen-in-front-of-your-face">even with a pair of AR glasses</a> is fantastic. However, when possible, I like to play on a larger display, whether that be the TV in my game room or on my 32-inch monitor at my desk.</p><p>Over the original Switch’s lifespan, I ended up with several official docks from Nintendo and quite a few unofficial ones from Genki. Besides its absolutely tiny size, what I love about the <a href="https://www.tomsguide.com/opinion/this-tiny-nintendo-switch-dock-is-a-game-changer-and-its-perfect-for-traveling">Genki Covert Dock Mini</a> is how I can play my Switch on a TV or monitor with just a single USB-C cable. Likewise, as it wasn’t one of the first unofficial Switch docks, I wasn’t worried about bricking my console when using it.</p><p>I’ve been waiting for almost a year now, but Genki finally released the latest version of its Covert Dock for the Switch 2. After using it for a month now, it’s certainly lived up to the hype as just like with the original, I can dock my Switch using a single cable. However, while testing it out, I realized it actually beats the official Nintendo Switch 2 Dock in one big way that makes it perfect for households with multiple Switch consoles and even PC handhelds like the Steam Deck.</p><div class="product"><a data-dimension112="d138120f-3e25-4422-b089-279f625cbbdb" data-action="Deal Block" data-label="Covert Dock 3" data-dimension48="Covert Dock 3" data-dimension25="$69.99" href="https://www.genkithings.com/products/covert-dock-3" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1200px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="58k3f4ei8un9QNkRXnawQG" name="Covert Dock 3" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/58k3f4ei8un9QNkRXnawQG.png" mos="" align="middle" fullscreen="" width="1200" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.genkithings.com/products/covert-dock-3" target="_blank" rel="nofollow" data-dimension112="d138120f-3e25-4422-b089-279f625cbbdb" data-action="Deal Block" data-label="Covert Dock 3" data-dimension48="Covert Dock 3" data-dimension25="$69.99">Covert Dock 3: $69.99 at Genki</a></strong><br>This plug-in dock lets you play your Nintendo Switch 2 on your TV with a single USB-C cable in 4K at 60Hz. There's also a USB-A port for connecting other accessories and in addition to Switch 2, it also works with your original Switch, laptop, tablet, Steam Deck and other handheld consoles.<a class="view-deal button" href="https://www.genkithings.com/products/covert-dock-3" target="_blank" rel="nofollow" data-dimension112="d138120f-3e25-4422-b089-279f625cbbdb" data-action="Deal Block" data-label="Covert Dock 3" data-dimension48="Covert Dock 3" data-dimension25="$69.99">View Deal</a></p></div><h2 id="now-with-more-power-and-personality">Now with more power (and personality)</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Ru4F5McDqdTmCuYrGEam6e" name="Genki Covert Dock 3--7" alt="The Genki Covert Dock 3 on a table with its included braided USB-C to USB-C cable" src="https://cdn.mos.cms.futurecdn.net/Ru4F5McDqdTmCuYrGEam6e.jpg" mos="" align="middle" fullscreen="" width="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>Right off the bat, Genki’s new Covert Dock 3 immediately stands out thanks to its atomic orange accents. It features a similar design to the company’s previous Covert Dock and unlike the Mini, you also get a USB-A port for connecting wired controllers, USB adapters and other accessories.</p><p>In the box, you get the dock itself along with a braided USB-C to USB-C cable. However, this new cable is rated for up to 65W of power output (as is the dock itself) whereas the previous one topped off at 45W. This is one of my favorite USB-C cables overall and I also like to use it when connecting a portable monitor to my laptop or PC 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XsYohn3sRSpTU96d6VwRfg" name="Genki Covert Dock 3--6" alt="The front ports on the Genki Covert Dock 3" src="https://cdn.mos.cms.futurecdn.net/XsYohn3sRSpTU96d6VwRfg.jpg" mos="" align="middle" fullscreen="" width="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 of the Covert Dock 3, you have easy access to all of its ports. The USB-C one at the top is used for connecting your Switch 2, <a href="https://www.tomsguide.com/gaming/handheld-gaming/rog-xbox-ally-x-review">Asus ROG Xbox Ally X</a> or any of the <a href="https://www.tomsguide.com/round-up/best-handheld-gaming-consoles">best handheld gaming consoles</a> for that matter. At the same time, you can also connect your smartphone or your laptop which comes in handy when traveling, especially if you want to watch YouTube or Netflix on the TV in your hotel room from your own devices. </p><p>The <a href="https://www.tomsguide.com/tvs/hdmi-21-what-is-it-and-how-many-ports-do-you-really-need">HDMI 2.1</a> port underneath the USB-C one connects to your TV or monitor and like I mentioned, the USB-A port on the bottom is for connecting extra wired accessories or for 2.4 GHz USB dongles when you don’t want to use Bluetooth.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Rp6rnFoDoUCnYPwVLioCTj" name="Genki Covert Dock 3--5" alt="The folding plug on the back of the Genki Covert Dock 3" src="https://cdn.mos.cms.futurecdn.net/Rp6rnFoDoUCnYPwVLioCTj.jpg" mos="" align="middle" fullscreen="" width="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>Then around back, the Covert Dock 3’s plug folds out to make the 2.4 x 1.7 x 1.3-inch dock even more compact. Another nice touch for international travelers is that Genki also sells a set of <a href="https://www.genkithings.com/products/covert-dock-global-adapters" target="_blank" rel="nofollow">Covert Dock Global adapters</a> that slide on in the back so you don’t have to worry about plugging the device into a separate universal travel adapter. With the Covert Dock 2, Genki included these adapters in the box but now they’re only available as an optional add-on for $10 which isn’t that expensive if you plan on using this dock abroad.</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/b91wyp1oA3s" allowfullscreen></iframe></div></div><h2 id="finally-a-one-cable-switch-2-dock-that-works">Finally, a one-cable Switch 2 dock that works</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8jS9YmNn53VDPBkNeLar5o" name="Genki Covert Dock 3--4" alt="A Switch 2 plugged into the Genki Covert Dock 3 and connected to a TV" src="https://cdn.mos.cms.futurecdn.net/8jS9YmNn53VDPBkNeLar5o.jpg" mos="" align="middle" fullscreen="" width="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 the Covert Dock 3 set up, I plugged it into the outlet under my TV, connected it to an Ultra High Speed HDMI cable and ran the included USB-C to USB-C cable up to my entertainment center. One other nice thing about that <a href="https://www.tomsguide.com/home/i-used-this-free-trick-to-finally-make-my-braided-cables-lay-flat">braided cable</a> is that the end you plug into the dock is straight while the one you plug into your Switch 2 or other devices is angled to prevent any unnecessary strain on your device’s USB-C port.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4ujgfZ8PUWVqniym6LVSSN" name="Genki Covert Dock 3--2" alt="A person holding a controller playing Super Mario Galaxy using the Genki Covert Dock 3" src="https://cdn.mos.cms.futurecdn.net/4ujgfZ8PUWVqniym6LVSSN.jpg" mos="" align="middle" fullscreen="" width="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 turned on my TV, booted up my Switch 2 and much to my surprise, everything worked on the first try. To test it out, I played a bit of the recently released <a href="https://www.tomsguide.com/gaming/nintendo/ive-been-a-mario-fan-for-30-years-heres-every-mario-game-you-can-play-on-the-nintendo-switch-and-switch-2-to-celebrate-mario-day-2026">Super Mario Galaxy</a> as well as the new <a href="https://www.tomsguide.com/gaming/nintendo/the-nintendo-switch-2-edition-of-super-mario-bros-wonder-isnt-just-a-visual-masterpiece-its-the-directors-cut-i-didnt-know-i-needed">Nintendo Switch 2 Edition of Super Mario Bros. Wonder</a>. When I checked my TV’s settings, my Switch 2 games were running in 4K at a smooth 60Hz with HDR enabled.</p><p>Now I’ve been meaning to upgrade to one of the <a href="https://www.tomsguide.com/us/best-tvs,review-2224.html">best TVs</a> with a higher refresh rate for a while now. Once I do though, on more powerful devices like a high-specced gaming laptop, the <a href="https://www.tomsguide.com/gaming/handheld-gaming/lenovos-legion-go-2-is-my-most-anticipated-gaming-handheld-of-2025-but-this-one-thing-has-me-worried">Lenovo Legion Go 2</a> or the ROG Xbox Ally X, you can actually push the Genki Covert Dock 3 all the way up to 4K at 120Hz. It also officially supports VRR or Variable Refresh Rate so you can enable AMD’s FreeSync or Nvidia’s G-Sync for incredibly smooth, tear-free gameplay.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="47uXGBa5YNsHKtJ3dmHAu5" name="Genki Covert Dock 3--1" alt="A Nintendo Switch plugged into the Genki Covert Dock 3 and connected to a TV next to a Nintendo Switch 2" src="https://cdn.mos.cms.futurecdn.net/47uXGBa5YNsHKtJ3dmHAu5.jpg" mos="" align="middle" fullscreen="" width="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 the early adopter at home, I upgraded to the Switch 2 on launch day but my wife is still playing <a href="https://www.tomsguide.com/gaming/nintendo/ive-played-animal-crossing-new-horizons-for-700-hours-and-the-3-0-update-left-me-wanting-more-in-the-best-kind-of-way">Animal Crossing: New Horizons</a> on her original Switch. Previously, I had the official Switch 2 dock set up for myself and a Genki Covert Dock Mini set up alongside it for when she wanted to play her Switch on the big screen. Now though, I only need one dock for both Switch consoles because when I plugged my wife’s Switch into the Covert Dock 3, it worked perfectly.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W09PYO"></div>                            </div>                            <script src="https://kwizly.com/embed/W09PYO.js" async></script><h2 id="a-truly-covert-switch-2-dock">A truly covert Switch 2 dock</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NjzpwacEx8kGf3YoPgCr3D" name="Genki Covert Dock 3--3" alt="A Nintendo Switch 2 plugged into a Genki Covert Dock 3 connected to a TV hidden from sight by the Haworth Elements Table" src="https://cdn.mos.cms.futurecdn.net/NjzpwacEx8kGf3YoPgCr3D.jpg" mos="" align="middle" fullscreen="" width="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 I first <a href="https://www.tomsguide.com/gaming/nintendo/i-was-struggling-to-set-up-my-switch-2-until-i-tried-using-mouse-mode-heres-why">set up my Switch 2</a> after picking one up at a midnight launch, I’ve been eagerly awaiting Genki’s next third-party dock. I did have to wait nine months to get my hands on it but it’s delivered and even exceeded my expectations thanks to the fact that it still works with the original Switch.</p><p>Unlike Nintendo’s official Switch 2 Dock which launched at $90 and recently went up in price to $124, the Genki Covert Dock 3 now looks like a steal at $69 without those optional global adapters. If you want to play on an iPad or even your laptop’s screen and be able to stream your game sessions, Genki also recently released its new ShadowCast 3 Pro capture card too.</p><p>One of my favorite things about the Switch and now the Switch 2 is being able to bring the console from room to room or even house to house and still be able to play on a larger display. I considered picking up a second official dock at launch just to do this but since I knew Genki definitely had a new dock in the works, I decided to wait and I’m glad I did.</p><p>While I haven’t travelled with it yet, I’m definitely packing my new Covert Dock 3 when we head out on our family trip this summer. From <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">Computex in Taiwan</a> to <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">CES in Las Vegas</a>, Genki’s previous docks have been a mainstay in my tech travel bag for years now. Here’s hoping Genki follows up this release with a new smaller and hopefully, slightly cheaper Covert Dock Mini 2 with Switch 2 support later on. </p><p>For now though, I plan to use the official Switch 2 Dock at my desk where I’m the only one playing and keep the Covert Dock 3 plugged in underneath my TV so both myself and my wife or anyone that stops by with a Steam Deck can play on the big screen with it too.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/gaming/nintendo/i-played-all-3-new-resident-evil-games-on-switch-2-heres-the-one-you-should-buy">I played all 3 new Resident Evil games on Switch 2 — here’s the one you should buy</a></li><li><a href="https://www.tomsguide.com/gaming/nintendo/i-played-over-a-dozen-games-on-the-switch-2-and-i-have-a-surprise-favorite-so-far">Just got a Switch 2? Here’s the 5 games you need to play first</a></li><li><a href="https://www.tomsguide.com/gaming/nintendo/i-tried-playing-mario-kart-world-with-this-racing-wheel-for-the-original-switch-and-it-works-like-a-charm-on-switch-2">I tried playing Mario Kart World with a racing wheel on Switch 2 and it's perfect for cruising in Free Roam mode</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/i-tried-genkis-covert-dock-3-with-the-nintendo-switch-2-and-it-beats-the-official-dock-for-one-key-reason</link>
                                                                            <description>
                            <![CDATA[ Nintendo’s official Switch 2 dock just got a massive price hike, but Genki’s new Covert Dock 3 is a cheaper, pocket-sized way to play on your TV with a single cable. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">UCSJFCdCL59psRRLHyFJrh</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/8V2pnFcAEMVd8CSPPcEPqb-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 05 Apr 2026 08:45:00 +0000</pubDate>                                                                                                                                <updated>Wed, 20 May 2026 22:16:03 +0000</updated>
                                                                                                                                            <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Nintendo]]></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/8V2pnFcAEMVd8CSPPcEPqb-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Genki Covert Dock 3 on a table]]></media:description>                                                            <media:text><![CDATA[The Genki Covert Dock 3 on a table]]></media:text>
                                <media:title type="plain"><![CDATA[The Genki Covert Dock 3 on a table]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/8V2pnFcAEMVd8CSPPcEPqb-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Upgrading to the <a href="https://www.tomsguide.com/gaming/nintendo/nintendo-switch-2-console-review">Nintendo Switch 2</a> finally let me play all of the <a href="https://www.tomsguide.com/round-up/best-nintendo-switch-games">best Nintendo Switch games</a> in crisp 4K along with a ton of great new releases like Mario Kart World, <a href="https://www.tomsguide.com/gaming/nintendo/donkey-kong-bananza-review">Donkey Kong Bananza</a> and Kirby Air Riders. However, there was just one problem: I now only had one dock.</p><p>Don’t get me wrong, playing the Switch 2 in handheld mode or <a href="https://www.tomsguide.com/gaming/nintendo/i-played-the-switch-2-with-ar-glasses-heres-what-its-like-to-race-mario-kart-world-on-a-135-inch-screen-in-front-of-your-face">even with a pair of AR glasses</a> is fantastic. However, when possible, I like to play on a larger display, whether that be the TV in my game room or on my 32-inch monitor at my desk.</p><p>Over the original Switch’s lifespan, I ended up with several official docks from Nintendo and quite a few unofficial ones from Genki. Besides its absolutely tiny size, what I love about the <a href="https://www.tomsguide.com/opinion/this-tiny-nintendo-switch-dock-is-a-game-changer-and-its-perfect-for-traveling">Genki Covert Dock Mini</a> is how I can play my Switch on a TV or monitor with just a single USB-C cable. Likewise, as it wasn’t one of the first unofficial Switch docks, I wasn’t worried about bricking my console when using it.</p><p>I’ve been waiting for almost a year now, but Genki finally released the latest version of its Covert Dock for the Switch 2. After using it for a month now, it’s certainly lived up to the hype as just like with the original, I can dock my Switch using a single cable. However, while testing it out, I realized it actually beats the official Nintendo Switch 2 Dock in one big way that makes it perfect for households with multiple Switch consoles and even PC handhelds like the Steam Deck.</p><div class="product"><a data-dimension112="d138120f-3e25-4422-b089-279f625cbbdb" data-action="Deal Block" data-label="Covert Dock 3" data-dimension48="Covert Dock 3" data-dimension25="$69.99" href="https://www.genkithings.com/products/covert-dock-3" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1200px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="58k3f4ei8un9QNkRXnawQG" name="Covert Dock 3" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/58k3f4ei8un9QNkRXnawQG.png" mos="" align="middle" fullscreen="" width="1200" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.genkithings.com/products/covert-dock-3" target="_blank" rel="nofollow" data-dimension112="d138120f-3e25-4422-b089-279f625cbbdb" data-action="Deal Block" data-label="Covert Dock 3" data-dimension48="Covert Dock 3" data-dimension25="$69.99">Covert Dock 3: $69.99 at Genki</a></strong><br>This plug-in dock lets you play your Nintendo Switch 2 on your TV with a single USB-C cable in 4K at 60Hz. There's also a USB-A port for connecting other accessories and in addition to Switch 2, it also works with your original Switch, laptop, tablet, Steam Deck and other handheld consoles.<a class="view-deal button" href="https://www.genkithings.com/products/covert-dock-3" target="_blank" rel="nofollow" data-dimension112="d138120f-3e25-4422-b089-279f625cbbdb" data-action="Deal Block" data-label="Covert Dock 3" data-dimension48="Covert Dock 3" data-dimension25="$69.99">View Deal</a></p></div><h2 id="now-with-more-power-and-personality">Now with more power (and personality)</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Ru4F5McDqdTmCuYrGEam6e" name="Genki Covert Dock 3--7" alt="The Genki Covert Dock 3 on a table with its included braided USB-C to USB-C cable" src="https://cdn.mos.cms.futurecdn.net/Ru4F5McDqdTmCuYrGEam6e.jpg" mos="" align="middle" fullscreen="" width="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>Right off the bat, Genki’s new Covert Dock 3 immediately stands out thanks to its atomic orange accents. It features a similar design to the company’s previous Covert Dock and unlike the Mini, you also get a USB-A port for connecting wired controllers, USB adapters and other accessories.</p><p>In the box, you get the dock itself along with a braided USB-C to USB-C cable. However, this new cable is rated for up to 65W of power output (as is the dock itself) whereas the previous one topped off at 45W. This is one of my favorite USB-C cables overall and I also like to use it when connecting a portable monitor to my laptop or PC 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XsYohn3sRSpTU96d6VwRfg" name="Genki Covert Dock 3--6" alt="The front ports on the Genki Covert Dock 3" src="https://cdn.mos.cms.futurecdn.net/XsYohn3sRSpTU96d6VwRfg.jpg" mos="" align="middle" fullscreen="" width="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 of the Covert Dock 3, you have easy access to all of its ports. The USB-C one at the top is used for connecting your Switch 2, <a href="https://www.tomsguide.com/gaming/handheld-gaming/rog-xbox-ally-x-review">Asus ROG Xbox Ally X</a> or any of the <a href="https://www.tomsguide.com/round-up/best-handheld-gaming-consoles">best handheld gaming consoles</a> for that matter. At the same time, you can also connect your smartphone or your laptop which comes in handy when traveling, especially if you want to watch YouTube or Netflix on the TV in your hotel room from your own devices. </p><p>The <a href="https://www.tomsguide.com/tvs/hdmi-21-what-is-it-and-how-many-ports-do-you-really-need">HDMI 2.1</a> port underneath the USB-C one connects to your TV or monitor and like I mentioned, the USB-A port on the bottom is for connecting extra wired accessories or for 2.4 GHz USB dongles when you don’t want to use Bluetooth.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Rp6rnFoDoUCnYPwVLioCTj" name="Genki Covert Dock 3--5" alt="The folding plug on the back of the Genki Covert Dock 3" src="https://cdn.mos.cms.futurecdn.net/Rp6rnFoDoUCnYPwVLioCTj.jpg" mos="" align="middle" fullscreen="" width="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>Then around back, the Covert Dock 3’s plug folds out to make the 2.4 x 1.7 x 1.3-inch dock even more compact. Another nice touch for international travelers is that Genki also sells a set of <a href="https://www.genkithings.com/products/covert-dock-global-adapters" target="_blank" rel="nofollow">Covert Dock Global adapters</a> that slide on in the back so you don’t have to worry about plugging the device into a separate universal travel adapter. With the Covert Dock 2, Genki included these adapters in the box but now they’re only available as an optional add-on for $10 which isn’t that expensive if you plan on using this dock abroad.</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/b91wyp1oA3s" allowfullscreen></iframe></div></div><h2 id="finally-a-one-cable-switch-2-dock-that-works">Finally, a one-cable Switch 2 dock that works</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8jS9YmNn53VDPBkNeLar5o" name="Genki Covert Dock 3--4" alt="A Switch 2 plugged into the Genki Covert Dock 3 and connected to a TV" src="https://cdn.mos.cms.futurecdn.net/8jS9YmNn53VDPBkNeLar5o.jpg" mos="" align="middle" fullscreen="" width="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 the Covert Dock 3 set up, I plugged it into the outlet under my TV, connected it to an Ultra High Speed HDMI cable and ran the included USB-C to USB-C cable up to my entertainment center. One other nice thing about that <a href="https://www.tomsguide.com/home/i-used-this-free-trick-to-finally-make-my-braided-cables-lay-flat">braided cable</a> is that the end you plug into the dock is straight while the one you plug into your Switch 2 or other devices is angled to prevent any unnecessary strain on your device’s USB-C port.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4ujgfZ8PUWVqniym6LVSSN" name="Genki Covert Dock 3--2" alt="A person holding a controller playing Super Mario Galaxy using the Genki Covert Dock 3" src="https://cdn.mos.cms.futurecdn.net/4ujgfZ8PUWVqniym6LVSSN.jpg" mos="" align="middle" fullscreen="" width="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 turned on my TV, booted up my Switch 2 and much to my surprise, everything worked on the first try. To test it out, I played a bit of the recently released <a href="https://www.tomsguide.com/gaming/nintendo/ive-been-a-mario-fan-for-30-years-heres-every-mario-game-you-can-play-on-the-nintendo-switch-and-switch-2-to-celebrate-mario-day-2026">Super Mario Galaxy</a> as well as the new <a href="https://www.tomsguide.com/gaming/nintendo/the-nintendo-switch-2-edition-of-super-mario-bros-wonder-isnt-just-a-visual-masterpiece-its-the-directors-cut-i-didnt-know-i-needed">Nintendo Switch 2 Edition of Super Mario Bros. Wonder</a>. When I checked my TV’s settings, my Switch 2 games were running in 4K at a smooth 60Hz with HDR enabled.</p><p>Now I’ve been meaning to upgrade to one of the <a href="https://www.tomsguide.com/us/best-tvs,review-2224.html">best TVs</a> with a higher refresh rate for a while now. Once I do though, on more powerful devices like a high-specced gaming laptop, the <a href="https://www.tomsguide.com/gaming/handheld-gaming/lenovos-legion-go-2-is-my-most-anticipated-gaming-handheld-of-2025-but-this-one-thing-has-me-worried">Lenovo Legion Go 2</a> or the ROG Xbox Ally X, you can actually push the Genki Covert Dock 3 all the way up to 4K at 120Hz. It also officially supports VRR or Variable Refresh Rate so you can enable AMD’s FreeSync or Nvidia’s G-Sync for incredibly smooth, tear-free gameplay.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="47uXGBa5YNsHKtJ3dmHAu5" name="Genki Covert Dock 3--1" alt="A Nintendo Switch plugged into the Genki Covert Dock 3 and connected to a TV next to a Nintendo Switch 2" src="https://cdn.mos.cms.futurecdn.net/47uXGBa5YNsHKtJ3dmHAu5.jpg" mos="" align="middle" fullscreen="" width="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 the early adopter at home, I upgraded to the Switch 2 on launch day but my wife is still playing <a href="https://www.tomsguide.com/gaming/nintendo/ive-played-animal-crossing-new-horizons-for-700-hours-and-the-3-0-update-left-me-wanting-more-in-the-best-kind-of-way">Animal Crossing: New Horizons</a> on her original Switch. Previously, I had the official Switch 2 dock set up for myself and a Genki Covert Dock Mini set up alongside it for when she wanted to play her Switch on the big screen. Now though, I only need one dock for both Switch consoles because when I plugged my wife’s Switch into the Covert Dock 3, it worked perfectly.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W09PYO"></div>                            </div>                            <script src="https://kwizly.com/embed/W09PYO.js" async></script><h2 id="a-truly-covert-switch-2-dock">A truly covert Switch 2 dock</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NjzpwacEx8kGf3YoPgCr3D" name="Genki Covert Dock 3--3" alt="A Nintendo Switch 2 plugged into a Genki Covert Dock 3 connected to a TV hidden from sight by the Haworth Elements Table" src="https://cdn.mos.cms.futurecdn.net/NjzpwacEx8kGf3YoPgCr3D.jpg" mos="" align="middle" fullscreen="" width="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 I first <a href="https://www.tomsguide.com/gaming/nintendo/i-was-struggling-to-set-up-my-switch-2-until-i-tried-using-mouse-mode-heres-why">set up my Switch 2</a> after picking one up at a midnight launch, I’ve been eagerly awaiting Genki’s next third-party dock. I did have to wait nine months to get my hands on it but it’s delivered and even exceeded my expectations thanks to the fact that it still works with the original Switch.</p><p>Unlike Nintendo’s official Switch 2 Dock which launched at $90 and recently went up in price to $124, the Genki Covert Dock 3 now looks like a steal at $69 without those optional global adapters. If you want to play on an iPad or even your laptop’s screen and be able to stream your game sessions, Genki also recently released its new ShadowCast 3 Pro capture card too.</p><p>One of my favorite things about the Switch and now the Switch 2 is being able to bring the console from room to room or even house to house and still be able to play on a larger display. I considered picking up a second official dock at launch just to do this but since I knew Genki definitely had a new dock in the works, I decided to wait and I’m glad I did.</p><p>While I haven’t travelled with it yet, I’m definitely packing my new Covert Dock 3 when we head out on our family trip this summer. From <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">Computex in Taiwan</a> to <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">CES in Las Vegas</a>, Genki’s previous docks have been a mainstay in my tech travel bag for years now. Here’s hoping Genki follows up this release with a new smaller and hopefully, slightly cheaper Covert Dock Mini 2 with Switch 2 support later on. </p><p>For now though, I plan to use the official Switch 2 Dock at my desk where I’m the only one playing and keep the Covert Dock 3 plugged in underneath my TV so both myself and my wife or anyone that stops by with a Steam Deck can play on the big screen with it too.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/gaming/nintendo/i-played-all-3-new-resident-evil-games-on-switch-2-heres-the-one-you-should-buy">I played all 3 new Resident Evil games on Switch 2 — here’s the one you should buy</a></li><li><a href="https://www.tomsguide.com/gaming/nintendo/i-played-over-a-dozen-games-on-the-switch-2-and-i-have-a-surprise-favorite-so-far">Just got a Switch 2? Here’s the 5 games you need to play first</a></li><li><a href="https://www.tomsguide.com/gaming/nintendo/i-tried-playing-mario-kart-world-with-this-racing-wheel-for-the-original-switch-and-it-works-like-a-charm-on-switch-2">I tried playing Mario Kart World with a racing wheel on Switch 2 and it's perfect for cruising in Free Roam mode</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I ditched my over-ear headphones for the world’s first gaming open earbuds — here’s how it went ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I'm no stranger to weird or niche products. Weird: the other day, <a href="https://www.tomsguide.com/computing/keyboards/i-dunked-this-usd100-keyboard-dropped-soda-on-it-and-subjected-it-to-high-pressure-water-and-it-still-works">I dunked a $100 keyboard underwater and dropped soda on it</a> because the brand claimed it was waterproof. Niche: <a href="https://www.tomsguide.com/cameras-photography/mirrorless-cameras/i-spent-two-weeks-shooting-exclusively-in-black-and-white-with-the-leica-q3-monochrom-and-it-revealed-so-many-hidden-details">I spent two weeks shooting exclusively in black-and-white on a monochrome camera</a>. Yeah, I've seen my fair share of the good, the bad, the ugly, and the strange.</p><p>But none have been as niche in appeal as the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/asus-rog-cetra-open-wireless-gaming-earbuds-review">Asus ROG Cetra Open Wireless</a>, a pair of open earbuds designed specifically for gaming. Now, if you're familiar with open earbuds, you'll know that they're designed for people who want to remain aware of their surroundings while listening to music — so they're aimed at those who work out or run. Why do gamers who 99% of the time play indoors require open earbuds, then?</p><div class="product"><a data-dimension112="5ad4ac37-bc92-466d-a52a-4458cb7a2c27" data-action="Deal Block" data-label="Cetra Open Wireless" data-dimension48="Cetra Open Wireless" data-dimension25="$229" href="https://www.amazon.com/ASUS-ROG-Cetra-Wireless-Earbuds/dp/B0GMYLH4BG/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1425px;"><p class="vanilla-image-block" style="padding-top:105.26%;"><img id="L7ct3Th8Ugnswo8MYZ9EdT" name="Asus-Rog-COW-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/L7ct3Th8Ugnswo8MYZ9EdT.jpg" mos="" align="middle" fullscreen="" width="1425" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Asus ROG Cetra Open Wireless are competent open earbuds, designed for gamers who want to remain aware of their surroundings. They’re great for stealth-focused and dialogue-heavy titles, and feature good mic performance. Long battery life, a user-friendly companion app, and comfortable earhooks are lovely additions. But the niche appeal, underwhelming bass and overwhelming treble make it hard to stomach the price.<a class="view-deal button" href="https://www.amazon.com/ASUS-ROG-Cetra-Wireless-Earbuds/dp/B0GMYLH4BG/" target="_blank" rel="nofollow" data-dimension112="5ad4ac37-bc92-466d-a52a-4458cb7a2c27" data-action="Deal Block" data-label="Cetra Open Wireless" data-dimension48="Cetra Open Wireless" data-dimension25="$229">View Deal</a></p></div><p>Unless you're playing Pokémon Go (if that's still a thing), I can't see many use cases for open earbuds designed for gaming. Sure, they're comfortable and don't exert pressure on your ear canals, but are poor bass and treble worth the trade-off? Having ditched my usual over-ear headphones for Cetra Open Wireless for a week, I'm conflicted and mostly unconvinced. Here's why.</p><h2 id="comfortable-for-hours">Comfortable for hours</h2><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="TFrnGfxFehe5YYATqwPV3A" name="EmptyName 3.JPG" alt="Asus ROG Cetra Open Wireless gaming earbuds" src="https://cdn.mos.cms.futurecdn.net/TFrnGfxFehe5YYATqwPV3A.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>One of the biggest selling points of open earbuds is that they're extremely comfortable and they don't fall off your ears. This is also true in the case of the Asus ROG Cetra Open Wireless. Each earbud weighs 0.38oz and features an ear hook each that wraps over the top of your ear. Instead of sitting inside your ears like in-ear buds do, the speakers that house the drivers rest just outside your ear opening. You don't feel pressure in your ear canal this way, which helps prevent build-up of bacteria and sweat, and also ensures you're comfortable for hours.</p><p>I would certainly know, as I wore the Cetra Open Wireless for eight hours straight and didn't feel any discomfort at all. Another advantage of using open ears is that you can still hear everything happening around you. I never once missed the doorbell ringing and I could also have a conversation with my partner without having to remove the Cetra Open Wireless.</p><p>But while open ears are great for when you're outdoors, I'm not entirely sure they're a must-have for gamers who spend most of their time indoors. If you game and work out (not at the same time, of course), then it makes sense — you don't need to have two separate pairs. But if you want earbuds for gaming only, why wouldn't you just buy an over-ear headset, which is better in every regard when it comes to sound quality?</p><h2 id="underwhelming-bass-overwhelming-treble">Underwhelming bass, overwhelming treble</h2><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="Hj2LaKRW7AzAZVpnXv5o4A" name="EmptyName.JPG" alt="Asus ROG Cetra Open Wireless gaming earbuds" src="https://cdn.mos.cms.futurecdn.net/Hj2LaKRW7AzAZVpnXv5o4A.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 Asus ROG Cetra Open Wireless sound fantastic for all genres of games on paper. They're fitted with 14mm carbon-coated diaphragm drivers that cover a frequency response range of 20Hz to 20KHz — so the entirety of the human hearing spectrum. Their user-friendly companion app lets you make extensive adjustments to the equalizer too.</p><p>So what's wrong with them, in real-world use? Well, the bass is underwhelming and the treble is overwhelming, for starters, and those are two of the most important aspects of a soundstage that shouldn't be compromised on if you want a truly immersive gaming experience. What I mean by this is that loud explosions in combat sequences in, say, <a href="https://www.tomsguide.com/reviews/control">Control</a> and <a href="https://www.tomsguide.com/reviews/cyberpunk-2077-phantom-liberty">Cyberpunk 2077</a>, lack the <em>oomph</em> that makes it feel like you're engulfed in them.</p><p>The treble being overzealous, on the other hand, means that high pitched sounds cut through the soundscape. In my testing, the shrill sounds of bullets ricocheting against steel beams and walls cut through the rest of the soundstage, making it feel a little unpleasant. This, combined with the lackluster low frequencies, meant that the soundscape felt a bit too thin to me. My immersion couldn't be broken because I never felt immersed in the first place.</p><p>For the complete sound quality breakdown, read my full <a href="https://www.tomsguide.com/gaming/gaming-peripherals/asus-rog-cetra-open-wireless-gaming-earbuds-review">Asus ROG Cetra Open Wireless review</a>.</p><h2 id="worth-the-premium">Worth the premium?</h2><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="MTzn6XHwd2FEhAuxbwuxz9" name="EmptyName 4.JPG" alt="Asus ROG Cetra Open Wireless gaming earbuds" src="https://cdn.mos.cms.futurecdn.net/MTzn6XHwd2FEhAuxbwuxz9.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>So, with poor bass, subpar treble, and a niche appeal, are the Asus ROG Cetra Open Wireless worth the money? I'm not entirely convinced. They retail for a whopping <a href="https://www.amazon.com/ASUS-ROG-Cetra-Wireless-Earbuds/dp/B0GMYLH4BG/" target="_blank" rel="nofollow">$229 at Amazon</a>, and when you can get some of the best headsets for the same money or even less, why would you buy them? If you want open earbuds specifically, then sure, as they're your only realistic option.</p><p>But if you aren't fussed about open earbuds — I personally hadn't even considered them for gaming until I tested the Cetra Open Wireless — there are so many options out there. Both the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/alienware-pro-wireless-gaming-headset-review">Alienware Pro Wireless Gaming Headset</a> and the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/asus-rog-delta-ii-gaming-headset-review">Asus ROG Delta II</a> cost the same as the Cetra Open Wireless and are better in nearly every regard that counts. Then you've got the in-ear <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-gamebuds-review">SteelSeries Arctis GameBuds</a> that are $30 cheaper and, again, deliver simply phenomenal sound quality.</p><p>After having ditched my <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-blackshark-v3-pro-review">Razer BlackShark V3 Pro</a> for the Cetra Open Wireless, I am convinced of one thing if nothing else: I'll be sticking with my Razer over-ears.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XjPKYW"></div>                            </div>                            <script src="https://kwizly.com/embed/XjPKYW.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/gaming/gaming-peripherals/asus-rog-cetra-open-wireless-gaming-earbuds-review">I just tested the world’s first open-ear wireless buds for gaming — here’s my verdict on the Asus ROG Cetra Open Wireless</a></li><li><a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-tested-reddits-favorite-high-end-gaming-headsets-and-theres-a-clear-winner-but-its-not-the-one-i-expected">I tested Reddit’s favorite gaming headsets and there’s a clear winner (but not the one I expected)</a></li><li><a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">Best gaming headsets in 2026 — our expert picks</a></li></ul><div data-widget-type="review" data-model-name="Asus ROG Cetra Open"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/i-ditched-my-over-ear-headphones-for-the-worlds-first-gaming-open-earbuds-heres-how-it-went</link>
                                                                            <description>
                            <![CDATA[ Are open earbuds good for gaming? Asus certainly thinks so, with the launch of its Cetra Open Wireless buds. They're good, but I'm not convinced by them. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">x2YqrMbmrSeGkuCT4RFRHH</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/DTuwGBMLhLRTd4Hy2ozCFA-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 04 Apr 2026 06:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/DTuwGBMLhLRTd4Hy2ozCFA-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Asus ROG Cetra Open Wireless gaming earbuds]]></media:description>                                                            <media:text><![CDATA[Asus ROG Cetra Open Wireless gaming earbuds]]></media:text>
                                <media:title type="plain"><![CDATA[Asus ROG Cetra Open Wireless gaming earbuds]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/DTuwGBMLhLRTd4Hy2ozCFA-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I'm no stranger to weird or niche products. Weird: the other day, <a href="https://www.tomsguide.com/computing/keyboards/i-dunked-this-usd100-keyboard-dropped-soda-on-it-and-subjected-it-to-high-pressure-water-and-it-still-works">I dunked a $100 keyboard underwater and dropped soda on it</a> because the brand claimed it was waterproof. Niche: <a href="https://www.tomsguide.com/cameras-photography/mirrorless-cameras/i-spent-two-weeks-shooting-exclusively-in-black-and-white-with-the-leica-q3-monochrom-and-it-revealed-so-many-hidden-details">I spent two weeks shooting exclusively in black-and-white on a monochrome camera</a>. Yeah, I've seen my fair share of the good, the bad, the ugly, and the strange.</p><p>But none have been as niche in appeal as the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/asus-rog-cetra-open-wireless-gaming-earbuds-review">Asus ROG Cetra Open Wireless</a>, a pair of open earbuds designed specifically for gaming. Now, if you're familiar with open earbuds, you'll know that they're designed for people who want to remain aware of their surroundings while listening to music — so they're aimed at those who work out or run. Why do gamers who 99% of the time play indoors require open earbuds, then?</p><div class="product"><a data-dimension112="5ad4ac37-bc92-466d-a52a-4458cb7a2c27" data-action="Deal Block" data-label="Cetra Open Wireless" data-dimension48="Cetra Open Wireless" data-dimension25="$229" href="https://www.amazon.com/ASUS-ROG-Cetra-Wireless-Earbuds/dp/B0GMYLH4BG/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1425px;"><p class="vanilla-image-block" style="padding-top:105.26%;"><img id="L7ct3Th8Ugnswo8MYZ9EdT" name="Asus-Rog-COW-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/L7ct3Th8Ugnswo8MYZ9EdT.jpg" mos="" align="middle" fullscreen="" width="1425" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Asus ROG Cetra Open Wireless are competent open earbuds, designed for gamers who want to remain aware of their surroundings. They’re great for stealth-focused and dialogue-heavy titles, and feature good mic performance. Long battery life, a user-friendly companion app, and comfortable earhooks are lovely additions. But the niche appeal, underwhelming bass and overwhelming treble make it hard to stomach the price.<a class="view-deal button" href="https://www.amazon.com/ASUS-ROG-Cetra-Wireless-Earbuds/dp/B0GMYLH4BG/" target="_blank" rel="nofollow" data-dimension112="5ad4ac37-bc92-466d-a52a-4458cb7a2c27" data-action="Deal Block" data-label="Cetra Open Wireless" data-dimension48="Cetra Open Wireless" data-dimension25="$229">View Deal</a></p></div><p>Unless you're playing Pokémon Go (if that's still a thing), I can't see many use cases for open earbuds designed for gaming. Sure, they're comfortable and don't exert pressure on your ear canals, but are poor bass and treble worth the trade-off? Having ditched my usual over-ear headphones for Cetra Open Wireless for a week, I'm conflicted and mostly unconvinced. Here's why.</p><h2 id="comfortable-for-hours">Comfortable for hours</h2><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="TFrnGfxFehe5YYATqwPV3A" name="EmptyName 3.JPG" alt="Asus ROG Cetra Open Wireless gaming earbuds" src="https://cdn.mos.cms.futurecdn.net/TFrnGfxFehe5YYATqwPV3A.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>One of the biggest selling points of open earbuds is that they're extremely comfortable and they don't fall off your ears. This is also true in the case of the Asus ROG Cetra Open Wireless. Each earbud weighs 0.38oz and features an ear hook each that wraps over the top of your ear. Instead of sitting inside your ears like in-ear buds do, the speakers that house the drivers rest just outside your ear opening. You don't feel pressure in your ear canal this way, which helps prevent build-up of bacteria and sweat, and also ensures you're comfortable for hours.</p><p>I would certainly know, as I wore the Cetra Open Wireless for eight hours straight and didn't feel any discomfort at all. Another advantage of using open ears is that you can still hear everything happening around you. I never once missed the doorbell ringing and I could also have a conversation with my partner without having to remove the Cetra Open Wireless.</p><p>But while open ears are great for when you're outdoors, I'm not entirely sure they're a must-have for gamers who spend most of their time indoors. If you game and work out (not at the same time, of course), then it makes sense — you don't need to have two separate pairs. But if you want earbuds for gaming only, why wouldn't you just buy an over-ear headset, which is better in every regard when it comes to sound quality?</p><h2 id="underwhelming-bass-overwhelming-treble">Underwhelming bass, overwhelming treble</h2><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="Hj2LaKRW7AzAZVpnXv5o4A" name="EmptyName.JPG" alt="Asus ROG Cetra Open Wireless gaming earbuds" src="https://cdn.mos.cms.futurecdn.net/Hj2LaKRW7AzAZVpnXv5o4A.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 Asus ROG Cetra Open Wireless sound fantastic for all genres of games on paper. They're fitted with 14mm carbon-coated diaphragm drivers that cover a frequency response range of 20Hz to 20KHz — so the entirety of the human hearing spectrum. Their user-friendly companion app lets you make extensive adjustments to the equalizer too.</p><p>So what's wrong with them, in real-world use? Well, the bass is underwhelming and the treble is overwhelming, for starters, and those are two of the most important aspects of a soundstage that shouldn't be compromised on if you want a truly immersive gaming experience. What I mean by this is that loud explosions in combat sequences in, say, <a href="https://www.tomsguide.com/reviews/control">Control</a> and <a href="https://www.tomsguide.com/reviews/cyberpunk-2077-phantom-liberty">Cyberpunk 2077</a>, lack the <em>oomph</em> that makes it feel like you're engulfed in them.</p><p>The treble being overzealous, on the other hand, means that high pitched sounds cut through the soundscape. In my testing, the shrill sounds of bullets ricocheting against steel beams and walls cut through the rest of the soundstage, making it feel a little unpleasant. This, combined with the lackluster low frequencies, meant that the soundscape felt a bit too thin to me. My immersion couldn't be broken because I never felt immersed in the first place.</p><p>For the complete sound quality breakdown, read my full <a href="https://www.tomsguide.com/gaming/gaming-peripherals/asus-rog-cetra-open-wireless-gaming-earbuds-review">Asus ROG Cetra Open Wireless review</a>.</p><h2 id="worth-the-premium">Worth the premium?</h2><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="MTzn6XHwd2FEhAuxbwuxz9" name="EmptyName 4.JPG" alt="Asus ROG Cetra Open Wireless gaming earbuds" src="https://cdn.mos.cms.futurecdn.net/MTzn6XHwd2FEhAuxbwuxz9.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>So, with poor bass, subpar treble, and a niche appeal, are the Asus ROG Cetra Open Wireless worth the money? I'm not entirely convinced. They retail for a whopping <a href="https://www.amazon.com/ASUS-ROG-Cetra-Wireless-Earbuds/dp/B0GMYLH4BG/" target="_blank" rel="nofollow">$229 at Amazon</a>, and when you can get some of the best headsets for the same money or even less, why would you buy them? If you want open earbuds specifically, then sure, as they're your only realistic option.</p><p>But if you aren't fussed about open earbuds — I personally hadn't even considered them for gaming until I tested the Cetra Open Wireless — there are so many options out there. Both the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/alienware-pro-wireless-gaming-headset-review">Alienware Pro Wireless Gaming Headset</a> and the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/asus-rog-delta-ii-gaming-headset-review">Asus ROG Delta II</a> cost the same as the Cetra Open Wireless and are better in nearly every regard that counts. Then you've got the in-ear <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-gamebuds-review">SteelSeries Arctis GameBuds</a> that are $30 cheaper and, again, deliver simply phenomenal sound quality.</p><p>After having ditched my <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-blackshark-v3-pro-review">Razer BlackShark V3 Pro</a> for the Cetra Open Wireless, I am convinced of one thing if nothing else: I'll be sticking with my Razer over-ears.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XjPKYW"></div>                            </div>                            <script src="https://kwizly.com/embed/XjPKYW.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/gaming/gaming-peripherals/asus-rog-cetra-open-wireless-gaming-earbuds-review">I just tested the world’s first open-ear wireless buds for gaming — here’s my verdict on the Asus ROG Cetra Open Wireless</a></li><li><a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-tested-reddits-favorite-high-end-gaming-headsets-and-theres-a-clear-winner-but-its-not-the-one-i-expected">I tested Reddit’s favorite gaming headsets and there’s a clear winner (but not the one I expected)</a></li><li><a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">Best gaming headsets in 2026 — our expert picks</a></li></ul><div data-widget-type="review" data-model-name="Asus ROG Cetra Open"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I just tested the world’s first open-ear wireless buds for gaming — here’s my verdict on the Asus ROG Cetra Open Wireless ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">best gaming headsets</a> can make or break your immersion, and they should be comfortable enough that you can play all day long. Well, the Asus ROG Cetra Open Wireless do one of those things. At the time of writing, they’re the world’s first and only open earbuds designed for gaming, and thanks to their ear hook design, you can wear them all day long without breaking a sweat.</p><p>For stealth-based and dialogue-heavy games, the Cetra Open Wireless are almost perfect, as you can hear footsteps and spoken words loudly and clearly. They also pack good mic performance and long battery life. But are they worth nearly $230? I’m not entirely convinced, especially because they have a niche appeal and both the bass and treble performance proves poor.</p><p>To find out if these are right for you, read my full Asus ROG Cetra Open Wireless review.</p><h2 class="article-body__section" id="section-asus-rog-cetra-open-wireless-review-specs"><span>Asus ROG Cetra Open Wireless review: Specs</span></h2><div ><table><thead><tr><th class="firstcol " ><p><strong>Specs</strong></p></th><th  ><p><strong>Asus ROG Cetra Open Wireless</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/ASUS-ROG-Cetra-Wireless-Earbuds/dp/B0GMYLH4BG/" target="_blank" rel="nofollow">$229</a></p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Black</p></td></tr><tr><td class="firstcol " ><p><strong>Platforms</strong></p></td><td  ><p>PC, macOS, PlayStation 5, PlayStation 4, Nintendo Switch 2, Nintendo Switch, iOS, Android, Steam Deck</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Bluetooth, 2.4GHz dongle</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>Rechargeable</p></td></tr><tr><td class="firstcol " ><p><strong>Battery life (rated)</strong></p></td><td  ><p>16 hours, 48 hours (charging case)</p></td></tr><tr><td class="firstcol " ><p><strong>Frequency response</strong></p></td><td  ><p>20-20,000Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Drivers</strong></p></td><td  ><p>14mm carbon-coated diaphragm</p></td></tr><tr><td class="firstcol " ><p><strong>Multipoint connectivity</strong></p></td><td  ><p>Yes</p></td></tr><tr><td class="firstcol " ><p><strong>Paired devices max</strong></p></td><td  ><p>2</p></td></tr><tr><td class="firstcol " ><p><strong>Microphone</strong></p></td><td  ><p>Omnidirectional, built-in</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>0.38oz (each bud)</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-asus-rog-cetra-open-wireless-review-cheat-sheet"><span>Asus ROG Cetra Open Wireless review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>A pair of open-ear wireless earbuds designed specifically for gaming</li><li><strong>Who is it for? </strong>Anyone who wants to remain aware of their surroundings while playing</li><li><strong>How much does it cost?</strong> These are expensive buds, retailing for <a href="https://www.amazon.com/ASUS-ROG-Cetra-Wireless-Earbuds/dp/B0GMYLH4BG/" target="_blank" rel="nofollow">$229</a></li><li><strong>What do we like?</strong> The comfortable design, performance in stealth-based games, good mic, long battery life, and user-friendly software</li><li><strong>What don’t we like? </strong>The underwhelming bass, overzealous treble, niche appeal, and premium price</li></ul><h2 class="article-body__section" id="section-asus-rog-cetra-open-wireless-review-the-ups"><span>Asus ROG Cetra Open Wireless review: The ups</span></h2><p>The Asus ROG Cetra Open Wireless are extremely comfortable and great for dialogue-heavy and stealth-based games. They boast long battery life too, and customization is easy via the user-friendly app.</p><h2 id="all-day-comfort">All-day comfort</h2><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="iGjffXQSdYTYMuveg5NzBL" name="EmptyName 8.JPG" alt="Black Asus ROG Cetra Open Wireless open earbuds for gaming" src="https://cdn.mos.cms.futurecdn.net/iGjffXQSdYTYMuveg5NzBL.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you’re familiar with open earbuds, you’ll know that they’re preferred by runners and people who work out as, a) they help them remain aware of their surroundings, and b) they don’t fall off and are very comfortable. The Asus ROG Cetra Open Wireless are open earbuds designed for gaming, and boy are they comfy.</p><p>Each bud features an ear hook that wraps over the top of your ear, and the actual speaker housing the drivers rests just outside your ear opening. This means that, unlike in-ear earbuds, you don’t feel any pressure in your ear canal, enabling you to wear them all day long. I wore the Cetra Open Wireless for an eight-hour gaming session and never once felt like removing them.</p><p>This is also thanks to the earbuds’ light weight, as each weighs just 0.38oz. Though that’s a little heavier than, say, the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-gamebuds-review">SteelSeries Arctis GameBuds</a> (0.18oz, $199), the weight distribution is fantastic and my ears never felt like they were being weighed down. Oh, and the Cetra Open Wireless are lighter than the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/sony-playstation-pulse-explore-review">PlayStation Pulse Explore</a> (0.48oz, $199) too.</p><h2 id="multi-platform-compatibility">Multi-platform compatibility</h2><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="ipoLdruGutgPxVb5MaARLK" name="EmptyName 1.JPG" alt="Black Asus ROG Cetra Open Wireless open earbuds for gaming" src="https://cdn.mos.cms.futurecdn.net/ipoLdruGutgPxVb5MaARLK.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you want a pair of gaming earbuds that’s compatible with nearly every console and smart device you own, the Asus ROG Cetra Open Wireless buds are for you. Thanks to Bluetooth and a 2.4GHz dongle, they’re compatible with <a href="https://www.tomsguide.com/reviews/ps5"><u>PS5</u></a>, <a href="https://www.tomsguide.com/gaming/nintendo/nintendo-switch-2-console-review">Nintendo Switch 2</a> and <a href="https://www.tomsguide.com/reviews/nintendo-switch">Switch</a>, <a href="https://www.tomsguide.com/reviews/steam-deck-review-the-nintendo-switch-for-adults">Steam Deck</a>, <a href="https://www.tomsguide.com/computing/macos/apple-macos-tahoe-review">macOS</a>, PC, <a href="https://www.tomsguide.com/phones/iphones/ios-26-review-new-features-liquid-glass">iOS</a> and Android.</p><p>The Cetra Open Wireless also feature simultaneous multipoint connectivity. With the 2.4GHz dongle plugged into my <a href="https://www.tomsguide.com/gaming/playstation/ps5-slim">PS5 Slim</a>, I paired the earbuds with my <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-10-pro-xl-review">Google Pixel 10 Pro XL</a> at the same time, and I was able to listen to music on my phone <em>while </em>playing games (hence the ‘simultaneous part, as standard multipoint would only allow you to do one at a time). Multipoint connectivity is something I desperately missed on the SteelSeries Arctis GameBuds, while simultaneous multipoint is something we loved on the premium <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-elite-review">SteelSeries Arctis Nova Elite</a> ($599), so I’m really pleased the Cetra Open Wireless feature both.</p><h2 id="great-for-footsteps-and-dialogue">Great for footsteps and dialogue</h2><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="b4LAftoHGekGb49tHxzrFK" name="EmptyName 3.JPG" alt="Black Asus ROG Cetra Open Wireless open earbuds for gaming" src="https://cdn.mos.cms.futurecdn.net/b4LAftoHGekGb49tHxzrFK.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 Asus ROG Cetra Open Wireless are excellent earbuds if you play a lot of dialogue-heavy games or stealth-based games that require you to listen out for footsteps. They utilize 14mm carbon-coated diaphragm drivers to cover a frequency response range of 20Hz-20KHz — so the entire spectrum of human hearing. With the 2.4GHz dongle plugged into my PS5 Slim, I played a range of games, including <a href="https://www.tomsguide.com/reviews/control">Control</a>, <a href="https://www.tomsguide.com/reviews/cyberpunk-2077-phantom-liberty">Cyberpunk 2077</a>, and <a href="https://www.tomsguide.com/opinion/baldurs-gate-3-is-a-love-letter-to-dungeons-and-dragons-and-its-all-i-want-to-play-right-now">Baldur’s Gate 3</a>.</p><p>Baldur’s Gate 3 is chock-full of dialogue: in-depth conversations with your party as well as idle chatter from NPCs. Through the Cetra Open Wireless, I could hear every single word loud and clear, as the soundstage’s mids packed plenty of detail and depth. Words never bled into one another, and I could also make out the emotion in certain character’s voices — as their voices quivered when they were upset or overwhelmed, for instance.</p><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="B7DcwrYNZJK4bTmtHx6CLK" name="EmptyName 4.JPG" alt="Black Asus ROG Cetra Open Wireless open earbuds for gaming" src="https://cdn.mos.cms.futurecdn.net/B7DcwrYNZJK4bTmtHx6CLK.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>It was a similar case in Control, where I could feel Jesse Faden’s apprehension and anxieties in her voice as she traversed the shifting floors of the Oldest House. When NPCs in Control spoke devoid of any emotion to convey a sort of emptiness, I could feel that too, and even when there were multiple voices speaking at once, they never overlapped one another to the point that I couldn’t understand them.</p><p>For stealth-based gameplay, the Cetra Open Wireless are fantastic, as I found while playing Cyberpunk 2077. When I was infiltrating heavily guarded enemy bases, I could hear footsteps loudly and clearly. This helped me pinpoint exactly where NPCs were positioned so I could strategize accordingly and take them down without being noticed. I also appreciated being able to hear NPCs speaking with each other even when the techno, synthwave soundtrack was playing loudly, and it never once compromised my character.</p><p>One of the biggest advantages of using open earbuds is that you can still hear those around you, so I never once missed the doorbell, and I could still have conversations with my partner without having to remove the Cetra Open Wireless.</p><h2 id="decent-mic-performance-2">Decent mic performance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DWuk9JdQS7ZgWBrQEgVGGK" name="EmptyName 5.JPG" alt="Black Asus ROG Cetra Open Wireless open earbuds for gaming" src="https://cdn.mos.cms.futurecdn.net/DWuk9JdQS7ZgWBrQEgVGGK.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you play online and need your friends or rivals to hear you loudly and clearly, you’ll be pleased to know that the Asus ROG Cetra Open Wireless boast good mic performance. The omnidirectional mics feature AI-powered noise canceling which means that only your voice is isolated and all background noise is cut out.</p><audio src="https://cdn.mos.cms.futurecdn.net/XUarnRv8GM8P789B8AjjQB/New%20Recording%208.mp3"  controls="controls" preload="none"></audio><p><br>I tested the Cetra Open Wireless’ mic performance out in two ways. I first recorded myself speaking with nothing else playing in the background. As you can hear in the clip above, my voice sounds clear and textured.</p><audio src="https://cdn.mos.cms.futurecdn.net/kajLXewGRqQz8yumMy9jQB/New%20Recording%209.mp3"  controls="controls" preload="none"></audio><p><br>I then recorded myself speaking with an episode of Schitt’s Creek playing in the background at 90% volume. In the clip above, the Cetra Open Wireless’ AI noise canceling mics do a good job of isolating my voice. While you can hear a little bit of the sitcom creeping in, it doesn’t overpower my voice.</p><h2 id="user-friendly-app">User-friendly app</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/So5n6Raex5AvsoWq7rKwCm.jpg" alt="Asus Gear Link app screenshots" /><figcaption><small role="credit">Asus / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/jbYEanQchdj7ckw3CdgnCm.jpg" alt="Asus Gear Link app screenshots" /><figcaption><small role="credit">Asus / Tom's Guide</small></figcaption></figure></figure><p>To customize the Asus ROG Cetra Open Wireless, you’ll need to download the Gear Link app on your Android or iOS smartphone. The app sports a clear interface and offers plenty of customization options. You can remap the touch gestures and commands, customize the equalizer or choose an EQ preset, make extensive adjustments to the colors and effects of the RGB lighting, and of course, update the firmware.</p><p>Gear Link is a delight to use, and reminds me of other apps I’ve used for earbuds designed for music. And truth be told, I’m just glad I don’t have to deal with Asus’ Armoury Crate bloatware, which is a pain to use but often required for tweaking the brand’s other gear.</p><h2 id="long-battery-life-2">Long battery life</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ExoB7JvcPoTUkEJK2mmnLK" name="EmptyName 2.JPG" alt="Black Asus ROG Cetra Open Wireless open earbuds for gaming" src="https://cdn.mos.cms.futurecdn.net/ExoB7JvcPoTUkEJK2mmnLK.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>Last but not least, the Asus ROG Cetra Open Wireless boast strong battery life. Asus says that the earbuds can last up to 16 hours before having to go back in their case, and the case provides an additional 32 hours of battery life — so 48 hours in total. Having used the earbuds for nearly 24 hours, I can confirm that they do indeed last for 16 hours. That’s amazing.</p><p>The Cetra Open Wireless’ rivals pale in comparison when it comes to battery life. The SteelSeries Arctis GameBuds are rated for 10 hours (30 hours with charging case) while the PlayStation Pulse Explore last a measly 5 hours (10 hours with charging case). Over-ear headphones, like the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/asus-rog-delta-ii-gaming-headset-review">Asus ROG Delta II </a>(110 hours, $229) and the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/alienware-pro-wireless-gaming-headset-review">Alienware Pro Wireless</a> (70 hours, $229), naturally last longer as there’s more room for bigger battery packs, so the Cetra Open Wireless do well in that regard.</p><h2 class="article-body__section" id="section-asus-rog-cetra-open-wireless-review-the-downs"><span>Asus ROG Cetra Open Wireless review: The downs</span></h2><p>Alas, the Asus ROG Cetra Open Wireless aren’t perfect, as they’re designed for a niche audience, the bass is underwhelming while the treble is overwhelming, and they cost a premium.</p><h2 id="niche-appeal">Niche appeal</h2><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="bop3QGHf9bRjUJGVKmLTWK" name="EmptyName 7.JPG" alt="Black Asus ROG Cetra Open Wireless open earbuds for gaming" src="https://cdn.mos.cms.futurecdn.net/bop3QGHf9bRjUJGVKmLTWK.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 Asus ROG Cetra Open Wireless earbuds clearly have a very niche market. They’re the world’s first open earbuds designed specifically for gaming. Most gamers, including myself, use either over-ear headphones or in-ear buds for gaming, like the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-blackshark-v3-pro-review">Razer</a> <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-blackshark-v3-pro-review">BlackShark V3 Pro</a> ($249) or the SteelSeries Arctis GameBuds. Who, exactly, are the Cetra Open Wireless for? The trade-offs are losing out on active or even passive noise cancellation and powerful bass (more on that shortly) — all the things that make your favorite games immersive and more enjoyable.</p><p>Open earbuds are usually meant for runners or gym goers who want to be aware of their surroundings or maintain some level of situational awareness so as not to get run over by a bike. You’re not going to be gaming when you’re walking, right? Unless you’re dabbling in some Pokémon Go, if that’s still relevant. I suppose if you’re a gamer and a runner, the Cetra Open Wireless negate the need for having two separate pairs of open-ears.</p><p>But at this price, it’s hard to recommend them outright purely for playing games indoors, especially when other headsets and earbuds offer better value for money.</p><h2 id="underwhelming-bass-and-overzealous-treble">Underwhelming bass and overzealous treble</h2><p>While in-game dialogues and footsteps in the mid-range sound great through the Asus ROG Cetra Open Wireless, I’m not convinced by every other aspect of the soundstage. The earbuds deliver underwhelming bass and overzealous treble. I don’t know about you, but I love feeling a thump in my chest and ears whenever a loud explosion takes place in a video game, as it helps with my immersion, and in horror games too. Strip that away and you’ve got a soundstage that feels lackluster and hollow — that’s what the Cetra Open Wireless sound like to me.</p><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="wJjdkgqYN7uzHnAJPfCLVK" name="EmptyName 6.JPG" alt="Black Asus ROG Cetra Open Wireless open earbuds for gaming" src="https://cdn.mos.cms.futurecdn.net/wJjdkgqYN7uzHnAJPfCLVK.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>Regardless of the game I played, I found the bass lacking while the treble felt way too emphasized. For instance, Control is a horror game that relies on low frequencies to ensure The Hiss sound terrifying, but the earbuds just didn’t pack the <em>oomph</em> needed to convey the terror. The creaking sounds of the Oldest House felt more clinical and less haunting, which for a horror game, isn’t good news.</p><p>Similarly, the soundstage felt devoid of any weight to it in <a href="https://www.tomsguide.com/gaming/clair-obscur-expedition-33-review">Clair Obscur: Expedition 33</a> too. A game in which every battle is soundtracked by powerful orchestral melodies suddenly felt thin and nowhere near as impactful. While the Cetra Open Wireless ensure that the mids are crisp, complex tracks sound tinny or muddy, and more fatiguing than epic. Also, the sound effects for counter-attacks and finishers are layered with heavy sub-bass distortion which I simply couldn’t appreciate through the Cetra Open Wireless.</p><p>Lastly, the treble. On the Cetra Open Wireless, the high-pitched sounds of bullets ricocheting off steel pillars in Cyberpunk 2077 felt too pronounced and like they were piercing through the soundstage. Combined with explosions not being very loud or bassy, it didn’t make for a very enjoyable experience.</p><h2 id="costs-a-premium">Costs a premium</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:872px;"><p class="vanilla-image-block" style="padding-top:56.31%;"><img id="b4LAftoHGekGb49tHxzrFK" name="EmptyName 3.JPG" alt="Black Asus ROG Cetra Open Wireless open earbuds for gaming" src="https://cdn.mos.cms.futurecdn.net/v2/t:94,l:927,cw:872,ch:491,q:80/b4LAftoHGekGb49tHxzrFK.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>Another drawback of the Asus ROG Cetra Open Wireless is the price tag. These open earbuds cost a whopping <a href="https://www.amazon.com/ASUS-ROG-Cetra-Wireless-Earbuds/dp/B0GMYLH4BG/" target="_blank" rel="nofollow">$229 at Amazon</a>, and is the price justified? I’m not entirely convinced. When you can get either equally as good or even better earbuds and headphones for the same price or less, the Cetra Open Wireless feel like an easy way to burn your hard-earned money.</p><p>Of course, if you want open earbuds specifically for gaming, this is realistically the only pair you can buy. But even so, they don’t provide the best sound quality, and in my opinion, it’s worth considering other over-ear headsets and in-ear buds. The Asus ROG Delta II ($229) and the Alienware Pro Wireless ($229) are my top picks for over-ears in this price range, while the SteelSeries Arctis GameBuds ($199) are excellent in-ears.</p><h2 class="article-body__section" id="section-asus-rog-cetra-open-wireless-review-verdict"><span>Asus ROG Cetra Open Wireless review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4pWCxMbWJKroAKUcVdUPHK" name="EmptyName.JPG" alt="Black Asus ROG Cetra Open Wireless open earbuds for gaming" src="https://cdn.mos.cms.futurecdn.net/4pWCxMbWJKroAKUcVdUPHK.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you spend a lot of time playing first-person shooters and other stealth-based games, and need a pair of comfortable earbuds, then the Asus ROG Cetra Open Wireless are sure to please you. They’re extremely comfy, and they make footsteps sound detailed and textured. Good mic performance, long battery life, and easy customization make them a winner.</p><p>But is all of that worth $229? The Cetra Open Wireless will appeal to a niche audience, as there aren’t any other open gaming earbuds out there, at the time of writing. That’s not even the biggest drawback, though. Unfortunately, bass through these earbuds lacks the <em>oomph </em>you’d expect, and the treble cuts through the rest of the soundscape.</p><p>You can get better value for your money elsewhere, as long as you’re open to considering over-ear headsets or in-ear earbuds. Personally, I’ll be sticking with my headphones.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/asus-rog-cetra-open-wireless-gaming-earbuds-review</link>
                                                                            <description>
                            <![CDATA[ The Asus ROG Cetra Open Wireless are extremely comfortable open earbuds for dialogue-heavy and stealth-based games, but they have noteworthy flaws. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">apYKKAJm7ArSPksdK6JXKa</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/4pWCxMbWJKroAKUcVdUPHK-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 02 Apr 2026 07:59:20 +0000</pubDate>                                                                                                                                <updated>Tue, 09 Jun 2026 10:32:26 +0000</updated>
                                                                                                                                            <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres.&lt;/p&gt;&lt;p&gt;A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/4pWCxMbWJKroAKUcVdUPHK-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Black Asus ROG Cetra Open Wireless open earbuds for gaming]]></media:description>                                                            <media:text><![CDATA[Black Asus ROG Cetra Open Wireless open earbuds for gaming]]></media:text>
                                <media:title type="plain"><![CDATA[Black Asus ROG Cetra Open Wireless open earbuds for gaming]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/4pWCxMbWJKroAKUcVdUPHK-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">best gaming headsets</a> can make or break your immersion, and they should be comfortable enough that you can play all day long. Well, the Asus ROG Cetra Open Wireless do one of those things. At the time of writing, they’re the world’s first and only open earbuds designed for gaming, and thanks to their ear hook design, you can wear them all day long without breaking a sweat.</p><p>For stealth-based and dialogue-heavy games, the Cetra Open Wireless are almost perfect, as you can hear footsteps and spoken words loudly and clearly. They also pack good mic performance and long battery life. But are they worth nearly $230? I’m not entirely convinced, especially because they have a niche appeal and both the bass and treble performance proves poor.</p><p>To find out if these are right for you, read my full Asus ROG Cetra Open Wireless review.</p><h2 class="article-body__section" id="section-asus-rog-cetra-open-wireless-review-specs"><span>Asus ROG Cetra Open Wireless review: Specs</span></h2><div ><table><thead><tr><th class="firstcol " ><p><strong>Specs</strong></p></th><th  ><p><strong>Asus ROG Cetra Open Wireless</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/ASUS-ROG-Cetra-Wireless-Earbuds/dp/B0GMYLH4BG/" target="_blank" rel="nofollow">$229</a></p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Black</p></td></tr><tr><td class="firstcol " ><p><strong>Platforms</strong></p></td><td  ><p>PC, macOS, PlayStation 5, PlayStation 4, Nintendo Switch 2, Nintendo Switch, iOS, Android, Steam Deck</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Bluetooth, 2.4GHz dongle</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>Rechargeable</p></td></tr><tr><td class="firstcol " ><p><strong>Battery life (rated)</strong></p></td><td  ><p>16 hours, 48 hours (charging case)</p></td></tr><tr><td class="firstcol " ><p><strong>Frequency response</strong></p></td><td  ><p>20-20,000Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Drivers</strong></p></td><td  ><p>14mm carbon-coated diaphragm</p></td></tr><tr><td class="firstcol " ><p><strong>Multipoint connectivity</strong></p></td><td  ><p>Yes</p></td></tr><tr><td class="firstcol " ><p><strong>Paired devices max</strong></p></td><td  ><p>2</p></td></tr><tr><td class="firstcol " ><p><strong>Microphone</strong></p></td><td  ><p>Omnidirectional, built-in</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>0.38oz (each bud)</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-asus-rog-cetra-open-wireless-review-cheat-sheet"><span>Asus ROG Cetra Open Wireless review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>A pair of open-ear wireless earbuds designed specifically for gaming</li><li><strong>Who is it for? </strong>Anyone who wants to remain aware of their surroundings while playing</li><li><strong>How much does it cost?</strong> These are expensive buds, retailing for <a href="https://www.amazon.com/ASUS-ROG-Cetra-Wireless-Earbuds/dp/B0GMYLH4BG/" target="_blank" rel="nofollow">$229</a></li><li><strong>What do we like?</strong> The comfortable design, performance in stealth-based games, good mic, long battery life, and user-friendly software</li><li><strong>What don’t we like? </strong>The underwhelming bass, overzealous treble, niche appeal, and premium price</li></ul><h2 class="article-body__section" id="section-asus-rog-cetra-open-wireless-review-the-ups"><span>Asus ROG Cetra Open Wireless review: The ups</span></h2><p>The Asus ROG Cetra Open Wireless are extremely comfortable and great for dialogue-heavy and stealth-based games. They boast long battery life too, and customization is easy via the user-friendly app.</p><h2 id="all-day-comfort">All-day comfort</h2><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="iGjffXQSdYTYMuveg5NzBL" name="EmptyName 8.JPG" alt="Black Asus ROG Cetra Open Wireless open earbuds for gaming" src="https://cdn.mos.cms.futurecdn.net/iGjffXQSdYTYMuveg5NzBL.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you’re familiar with open earbuds, you’ll know that they’re preferred by runners and people who work out as, a) they help them remain aware of their surroundings, and b) they don’t fall off and are very comfortable. The Asus ROG Cetra Open Wireless are open earbuds designed for gaming, and boy are they comfy.</p><p>Each bud features an ear hook that wraps over the top of your ear, and the actual speaker housing the drivers rests just outside your ear opening. This means that, unlike in-ear earbuds, you don’t feel any pressure in your ear canal, enabling you to wear them all day long. I wore the Cetra Open Wireless for an eight-hour gaming session and never once felt like removing them.</p><p>This is also thanks to the earbuds’ light weight, as each weighs just 0.38oz. Though that’s a little heavier than, say, the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-gamebuds-review">SteelSeries Arctis GameBuds</a> (0.18oz, $199), the weight distribution is fantastic and my ears never felt like they were being weighed down. Oh, and the Cetra Open Wireless are lighter than the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/sony-playstation-pulse-explore-review">PlayStation Pulse Explore</a> (0.48oz, $199) too.</p><h2 id="multi-platform-compatibility">Multi-platform compatibility</h2><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="ipoLdruGutgPxVb5MaARLK" name="EmptyName 1.JPG" alt="Black Asus ROG Cetra Open Wireless open earbuds for gaming" src="https://cdn.mos.cms.futurecdn.net/ipoLdruGutgPxVb5MaARLK.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you want a pair of gaming earbuds that’s compatible with nearly every console and smart device you own, the Asus ROG Cetra Open Wireless buds are for you. Thanks to Bluetooth and a 2.4GHz dongle, they’re compatible with <a href="https://www.tomsguide.com/reviews/ps5"><u>PS5</u></a>, <a href="https://www.tomsguide.com/gaming/nintendo/nintendo-switch-2-console-review">Nintendo Switch 2</a> and <a href="https://www.tomsguide.com/reviews/nintendo-switch">Switch</a>, <a href="https://www.tomsguide.com/reviews/steam-deck-review-the-nintendo-switch-for-adults">Steam Deck</a>, <a href="https://www.tomsguide.com/computing/macos/apple-macos-tahoe-review">macOS</a>, PC, <a href="https://www.tomsguide.com/phones/iphones/ios-26-review-new-features-liquid-glass">iOS</a> and Android.</p><p>The Cetra Open Wireless also feature simultaneous multipoint connectivity. With the 2.4GHz dongle plugged into my <a href="https://www.tomsguide.com/gaming/playstation/ps5-slim">PS5 Slim</a>, I paired the earbuds with my <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-10-pro-xl-review">Google Pixel 10 Pro XL</a> at the same time, and I was able to listen to music on my phone <em>while </em>playing games (hence the ‘simultaneous part, as standard multipoint would only allow you to do one at a time). Multipoint connectivity is something I desperately missed on the SteelSeries Arctis GameBuds, while simultaneous multipoint is something we loved on the premium <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-elite-review">SteelSeries Arctis Nova Elite</a> ($599), so I’m really pleased the Cetra Open Wireless feature both.</p><h2 id="great-for-footsteps-and-dialogue">Great for footsteps and dialogue</h2><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="b4LAftoHGekGb49tHxzrFK" name="EmptyName 3.JPG" alt="Black Asus ROG Cetra Open Wireless open earbuds for gaming" src="https://cdn.mos.cms.futurecdn.net/b4LAftoHGekGb49tHxzrFK.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 Asus ROG Cetra Open Wireless are excellent earbuds if you play a lot of dialogue-heavy games or stealth-based games that require you to listen out for footsteps. They utilize 14mm carbon-coated diaphragm drivers to cover a frequency response range of 20Hz-20KHz — so the entire spectrum of human hearing. With the 2.4GHz dongle plugged into my PS5 Slim, I played a range of games, including <a href="https://www.tomsguide.com/reviews/control">Control</a>, <a href="https://www.tomsguide.com/reviews/cyberpunk-2077-phantom-liberty">Cyberpunk 2077</a>, and <a href="https://www.tomsguide.com/opinion/baldurs-gate-3-is-a-love-letter-to-dungeons-and-dragons-and-its-all-i-want-to-play-right-now">Baldur’s Gate 3</a>.</p><p>Baldur’s Gate 3 is chock-full of dialogue: in-depth conversations with your party as well as idle chatter from NPCs. Through the Cetra Open Wireless, I could hear every single word loud and clear, as the soundstage’s mids packed plenty of detail and depth. Words never bled into one another, and I could also make out the emotion in certain character’s voices — as their voices quivered when they were upset or overwhelmed, for instance.</p><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="B7DcwrYNZJK4bTmtHx6CLK" name="EmptyName 4.JPG" alt="Black Asus ROG Cetra Open Wireless open earbuds for gaming" src="https://cdn.mos.cms.futurecdn.net/B7DcwrYNZJK4bTmtHx6CLK.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>It was a similar case in Control, where I could feel Jesse Faden’s apprehension and anxieties in her voice as she traversed the shifting floors of the Oldest House. When NPCs in Control spoke devoid of any emotion to convey a sort of emptiness, I could feel that too, and even when there were multiple voices speaking at once, they never overlapped one another to the point that I couldn’t understand them.</p><p>For stealth-based gameplay, the Cetra Open Wireless are fantastic, as I found while playing Cyberpunk 2077. When I was infiltrating heavily guarded enemy bases, I could hear footsteps loudly and clearly. This helped me pinpoint exactly where NPCs were positioned so I could strategize accordingly and take them down without being noticed. I also appreciated being able to hear NPCs speaking with each other even when the techno, synthwave soundtrack was playing loudly, and it never once compromised my character.</p><p>One of the biggest advantages of using open earbuds is that you can still hear those around you, so I never once missed the doorbell, and I could still have conversations with my partner without having to remove the Cetra Open Wireless.</p><h2 id="decent-mic-performance-2">Decent mic performance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DWuk9JdQS7ZgWBrQEgVGGK" name="EmptyName 5.JPG" alt="Black Asus ROG Cetra Open Wireless open earbuds for gaming" src="https://cdn.mos.cms.futurecdn.net/DWuk9JdQS7ZgWBrQEgVGGK.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you play online and need your friends or rivals to hear you loudly and clearly, you’ll be pleased to know that the Asus ROG Cetra Open Wireless boast good mic performance. The omnidirectional mics feature AI-powered noise canceling which means that only your voice is isolated and all background noise is cut out.</p><audio src="https://cdn.mos.cms.futurecdn.net/XUarnRv8GM8P789B8AjjQB/New%20Recording%208.mp3"  controls="controls" preload="none"></audio><p><br>I tested the Cetra Open Wireless’ mic performance out in two ways. I first recorded myself speaking with nothing else playing in the background. As you can hear in the clip above, my voice sounds clear and textured.</p><audio src="https://cdn.mos.cms.futurecdn.net/kajLXewGRqQz8yumMy9jQB/New%20Recording%209.mp3"  controls="controls" preload="none"></audio><p><br>I then recorded myself speaking with an episode of Schitt’s Creek playing in the background at 90% volume. In the clip above, the Cetra Open Wireless’ AI noise canceling mics do a good job of isolating my voice. While you can hear a little bit of the sitcom creeping in, it doesn’t overpower my voice.</p><h2 id="user-friendly-app">User-friendly app</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/So5n6Raex5AvsoWq7rKwCm.jpg" alt="Asus Gear Link app screenshots" /><figcaption><small role="credit">Asus / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/jbYEanQchdj7ckw3CdgnCm.jpg" alt="Asus Gear Link app screenshots" /><figcaption><small role="credit">Asus / Tom's Guide</small></figcaption></figure></figure><p>To customize the Asus ROG Cetra Open Wireless, you’ll need to download the Gear Link app on your Android or iOS smartphone. The app sports a clear interface and offers plenty of customization options. You can remap the touch gestures and commands, customize the equalizer or choose an EQ preset, make extensive adjustments to the colors and effects of the RGB lighting, and of course, update the firmware.</p><p>Gear Link is a delight to use, and reminds me of other apps I’ve used for earbuds designed for music. And truth be told, I’m just glad I don’t have to deal with Asus’ Armoury Crate bloatware, which is a pain to use but often required for tweaking the brand’s other gear.</p><h2 id="long-battery-life-2">Long battery life</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ExoB7JvcPoTUkEJK2mmnLK" name="EmptyName 2.JPG" alt="Black Asus ROG Cetra Open Wireless open earbuds for gaming" src="https://cdn.mos.cms.futurecdn.net/ExoB7JvcPoTUkEJK2mmnLK.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>Last but not least, the Asus ROG Cetra Open Wireless boast strong battery life. Asus says that the earbuds can last up to 16 hours before having to go back in their case, and the case provides an additional 32 hours of battery life — so 48 hours in total. Having used the earbuds for nearly 24 hours, I can confirm that they do indeed last for 16 hours. That’s amazing.</p><p>The Cetra Open Wireless’ rivals pale in comparison when it comes to battery life. The SteelSeries Arctis GameBuds are rated for 10 hours (30 hours with charging case) while the PlayStation Pulse Explore last a measly 5 hours (10 hours with charging case). Over-ear headphones, like the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/asus-rog-delta-ii-gaming-headset-review">Asus ROG Delta II </a>(110 hours, $229) and the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/alienware-pro-wireless-gaming-headset-review">Alienware Pro Wireless</a> (70 hours, $229), naturally last longer as there’s more room for bigger battery packs, so the Cetra Open Wireless do well in that regard.</p><h2 class="article-body__section" id="section-asus-rog-cetra-open-wireless-review-the-downs"><span>Asus ROG Cetra Open Wireless review: The downs</span></h2><p>Alas, the Asus ROG Cetra Open Wireless aren’t perfect, as they’re designed for a niche audience, the bass is underwhelming while the treble is overwhelming, and they cost a premium.</p><h2 id="niche-appeal">Niche appeal</h2><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="bop3QGHf9bRjUJGVKmLTWK" name="EmptyName 7.JPG" alt="Black Asus ROG Cetra Open Wireless open earbuds for gaming" src="https://cdn.mos.cms.futurecdn.net/bop3QGHf9bRjUJGVKmLTWK.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 Asus ROG Cetra Open Wireless earbuds clearly have a very niche market. They’re the world’s first open earbuds designed specifically for gaming. Most gamers, including myself, use either over-ear headphones or in-ear buds for gaming, like the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-blackshark-v3-pro-review">Razer</a> <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-blackshark-v3-pro-review">BlackShark V3 Pro</a> ($249) or the SteelSeries Arctis GameBuds. Who, exactly, are the Cetra Open Wireless for? The trade-offs are losing out on active or even passive noise cancellation and powerful bass (more on that shortly) — all the things that make your favorite games immersive and more enjoyable.</p><p>Open earbuds are usually meant for runners or gym goers who want to be aware of their surroundings or maintain some level of situational awareness so as not to get run over by a bike. You’re not going to be gaming when you’re walking, right? Unless you’re dabbling in some Pokémon Go, if that’s still relevant. I suppose if you’re a gamer and a runner, the Cetra Open Wireless negate the need for having two separate pairs of open-ears.</p><p>But at this price, it’s hard to recommend them outright purely for playing games indoors, especially when other headsets and earbuds offer better value for money.</p><h2 id="underwhelming-bass-and-overzealous-treble">Underwhelming bass and overzealous treble</h2><p>While in-game dialogues and footsteps in the mid-range sound great through the Asus ROG Cetra Open Wireless, I’m not convinced by every other aspect of the soundstage. The earbuds deliver underwhelming bass and overzealous treble. I don’t know about you, but I love feeling a thump in my chest and ears whenever a loud explosion takes place in a video game, as it helps with my immersion, and in horror games too. Strip that away and you’ve got a soundstage that feels lackluster and hollow — that’s what the Cetra Open Wireless sound like to me.</p><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="wJjdkgqYN7uzHnAJPfCLVK" name="EmptyName 6.JPG" alt="Black Asus ROG Cetra Open Wireless open earbuds for gaming" src="https://cdn.mos.cms.futurecdn.net/wJjdkgqYN7uzHnAJPfCLVK.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>Regardless of the game I played, I found the bass lacking while the treble felt way too emphasized. For instance, Control is a horror game that relies on low frequencies to ensure The Hiss sound terrifying, but the earbuds just didn’t pack the <em>oomph</em> needed to convey the terror. The creaking sounds of the Oldest House felt more clinical and less haunting, which for a horror game, isn’t good news.</p><p>Similarly, the soundstage felt devoid of any weight to it in <a href="https://www.tomsguide.com/gaming/clair-obscur-expedition-33-review">Clair Obscur: Expedition 33</a> too. A game in which every battle is soundtracked by powerful orchestral melodies suddenly felt thin and nowhere near as impactful. While the Cetra Open Wireless ensure that the mids are crisp, complex tracks sound tinny or muddy, and more fatiguing than epic. Also, the sound effects for counter-attacks and finishers are layered with heavy sub-bass distortion which I simply couldn’t appreciate through the Cetra Open Wireless.</p><p>Lastly, the treble. On the Cetra Open Wireless, the high-pitched sounds of bullets ricocheting off steel pillars in Cyberpunk 2077 felt too pronounced and like they were piercing through the soundstage. Combined with explosions not being very loud or bassy, it didn’t make for a very enjoyable experience.</p><h2 id="costs-a-premium">Costs a premium</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:872px;"><p class="vanilla-image-block" style="padding-top:56.31%;"><img id="b4LAftoHGekGb49tHxzrFK" name="EmptyName 3.JPG" alt="Black Asus ROG Cetra Open Wireless open earbuds for gaming" src="https://cdn.mos.cms.futurecdn.net/v2/t:94,l:927,cw:872,ch:491,q:80/b4LAftoHGekGb49tHxzrFK.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>Another drawback of the Asus ROG Cetra Open Wireless is the price tag. These open earbuds cost a whopping <a href="https://www.amazon.com/ASUS-ROG-Cetra-Wireless-Earbuds/dp/B0GMYLH4BG/" target="_blank" rel="nofollow">$229 at Amazon</a>, and is the price justified? I’m not entirely convinced. When you can get either equally as good or even better earbuds and headphones for the same price or less, the Cetra Open Wireless feel like an easy way to burn your hard-earned money.</p><p>Of course, if you want open earbuds specifically for gaming, this is realistically the only pair you can buy. But even so, they don’t provide the best sound quality, and in my opinion, it’s worth considering other over-ear headsets and in-ear buds. The Asus ROG Delta II ($229) and the Alienware Pro Wireless ($229) are my top picks for over-ears in this price range, while the SteelSeries Arctis GameBuds ($199) are excellent in-ears.</p><h2 class="article-body__section" id="section-asus-rog-cetra-open-wireless-review-verdict"><span>Asus ROG Cetra Open Wireless review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4pWCxMbWJKroAKUcVdUPHK" name="EmptyName.JPG" alt="Black Asus ROG Cetra Open Wireless open earbuds for gaming" src="https://cdn.mos.cms.futurecdn.net/4pWCxMbWJKroAKUcVdUPHK.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you spend a lot of time playing first-person shooters and other stealth-based games, and need a pair of comfortable earbuds, then the Asus ROG Cetra Open Wireless are sure to please you. They’re extremely comfy, and they make footsteps sound detailed and textured. Good mic performance, long battery life, and easy customization make them a winner.</p><p>But is all of that worth $229? The Cetra Open Wireless will appeal to a niche audience, as there aren’t any other open gaming earbuds out there, at the time of writing. That’s not even the biggest drawback, though. Unfortunately, bass through these earbuds lacks the <em>oomph </em>you’d expect, and the treble cuts through the rest of the soundscape.</p><p>You can get better value for your money elsewhere, as long as you’re open to considering over-ear headsets or in-ear earbuds. Personally, I’ll be sticking with my headphones.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I've always wanted a PlayStation Portal but with a bigger screen so I tried this mobile controller — and it turned my iPad into a gaming powerhouse ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I love my <a href="https://www.tomsguide.com/reviews/ps5">PlayStation 5</a>. It's one of the best things I've bought with my own money, and I've spent an ungodly amount of hours playing the likes of <a href="https://www.tomsguide.com/opinion/baldurs-gate-3-is-a-love-letter-to-dungeons-and-dragons-and-its-all-i-want-to-play-right-now">Baldur's Gate 3</a>, <a href="https://www.tomsguide.com/gaming/clair-obscur-expedition-33-review">Clair Obscur: Expedition 33</a>, <a href="https://www.tomsguide.com/reviews/alan-wake-2">Alan Wake 2</a>, and FIFA (sorry, <em>EA Sports FC</em>) on my <a href="https://www.tomsguide.com/gaming/playstation/ps5-slim">PS5 Slim</a>. While I take my <a href="https://www.tomsguide.com/gaming/nintendo/nintendo-switch-2-console-review">Nintendo Switch 2</a> with me when I'm traveling, it just doesn't have the same, diverse game catalog that I like.</p><p>So, for a while now, I've been considering getting the <a href="https://www.tomsguide.com/reviews/playstation-portal">PlayStation Portal</a> — it was even sitting in my cart for a few days during the 2025 Black Friday sales. But truth be told, I'm not entirely convinced by the Portal because I've <a href="https://www.tomsguide.com/gaming/i-just-overpaid-for-a-playstation-portal-and-its-the-dumbest-purchase-ive-ever-made">heard mixed reviews</a>. Do I also want to pay nearly $200 for a remote player? Kinda but also no. Then it hit me: what if I just used the PS Remote Play app on my iPad and got a controller designed specifically for the iPad. Enter the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-kishi-v3-pro-xl-ipad-controller-review">Razer Kishi V3 Pro XL</a>.</p><div class="product"><a data-dimension112="9df13ce6-9db8-432b-a965-2e5f664cf302" data-action="Deal Block" data-label="Kishi V3 Pro XL" data-dimension48="Kishi V3 Pro XL" data-dimension25="$169" href="https://www.amazon.com/Kishi-Gaming-Controller-Android-Tablets-Smartphone/dp/B0DVKWZ5SX/" 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="5qsVDnM6BT8Q3RoUK6CCmR" name="Razer-Kishi-V3PX-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/5qsVDnM6BT8Q3RoUK6CCmR.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Full-sized triggers and thumbsticks, chunky grips, and four extra buttons make the Razer Kishi V3 Pro XL a formidable iPad controller. It’s perfect for on-the-go gaming thanks to its ergonomic design and good weight distribution. It’s compatible with many tablets, and features passthrough charging too. Its TMR thumbsticks are highly customizable and responsive, making it great for FPS, racing and RPG titles.<a class="view-deal button" href="https://www.amazon.com/Kishi-Gaming-Controller-Android-Tablets-Smartphone/dp/B0DVKWZ5SX/" target="_blank" rel="nofollow" data-dimension112="9df13ce6-9db8-432b-a965-2e5f664cf302" data-action="Deal Block" data-label="Kishi V3 Pro XL" data-dimension48="Kishi V3 Pro XL" data-dimension25="$169">View Deal</a></p></div><p>The Kishi V3 Pro XL is a beast — and I'm not just talking about its stature. It's fitted with powerful, highly responsive TMR thumbsticks, mouse-like clicky triggers and face buttons, and it features four additional remappable buttons too. Ergonomically designed and comfortable to hold all day long, it's an utter delight. Is it perfect? Nope. Do I still love it? Heck yes, and here's why.</p><h2 id="ergonomics-galore">Ergonomics galore!</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="7j6ZV7fL9ThKnKQs4h2Hwn" name="EmptyName 6.JPG" alt="A Razer Kishi V3 Pro XL iPad gaming controller" src="https://cdn.mos.cms.futurecdn.net/7j6ZV7fL9ThKnKQs4h2Hwn.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There's no point in spending any amount of money on a controller if it isn't designed ergonomically and hinders you from being able to play all day. Thankfully, the Razer Kishi V3 Pro XL is an extremely comfortable gamepad, one that I've used for a six-hour long stint without feeling like my hands were cramping. That's thanks to the the controller's chunky grips, full-size thumbsticks and triggers, and offset sticks which, in my opinion, feel more ergonomic.</p><p>In terms of size, the Kishi V3 Pro XL's plate where the tablet sits measures measures 12.91 x 4.36 x 2.54 inches when the controller is outstretched. This means that it's big enough to accommodate even a 13-inch <a href="https://www.tomsguide.com/computing/ipads/ipad-pro-m5-review">iPad Pro</a>! It's a joy to handle too, and doesn't feel unwieldy even when a tablet is slotted in. Without one, it weighs 10.97oz. I used the controller with my <a href="https://www.tomsguide.com/reviews/ipad-air-2022-review-a-new-standard-for-tablets">iPad Air </a>10.9-inch which bumped the weight up 1.73lbs. Even so, I didn't find it uncomfortable to hold for long periods of time.</p><p>I can't tell you how much fun it is to game handheld on a screen that big. The PlayStation Portal's 8-inch screen is also good, no doubt about that, but I really like the iPad Air's bigger screen. It makes for quite an immersive gaming experience. Plug in your favorite <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">gaming headset </a>into the 3.5mm port on the right grip and you've got a winning combo.</p><h2 id="so-smooth-so-powerful">So smooth, so powerful</h2><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="3mpN7NSjqF54zDwfiteDvn" name="EmptyName 1.JPG" alt="A Razer Kishi V3 Pro XL iPad gaming controller" src="https://cdn.mos.cms.futurecdn.net/3mpN7NSjqF54zDwfiteDvn.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There's a lot to love about the Razer Kishi V3 Pro XL's gaming performance. First of all, its thumbsticks are fitted with <a href="https://www.tomsguide.com/gaming/gaming-peripherals/so-long-hall-effect-im-only-using-controllers-with-tmr-sensors-from-now-on">Tunnel Magneto Resistance (TMR) sensors</a>, which are more responsive and longer-lasting than Hall Effect ones. They use weak electromagnetic waves which means that smaller adjustments and minute movements are picked up by the sensors, and the boost to accuracy in racing and FPS titles is certainly noticeable.</p><p>Then there's the Kishi V3 Pro XL's triggers, face buttons, two extra shoulder buttons and two back buttons, which are mouse-like to press. They feel like the ones you'll find on the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-wolverine-v3-pro-review">Razer Wolverine V3 Pro</a>. In fact, the Kishi V3 Pro XL feels like someone sliced the Wolverine V3 Pro down the middle and slotted a tablet in between the two grips. The performance is incredible, and I've had so much fun playing games like <a href="https://www.tomsguide.com/reviews/cyberpunk-2077-phantom-liberty">Cyberpunk 2077</a>, Expedition 33, and Need for Speed Heat on this controller.</p><p>You can read all about the performance in my <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-kishi-v3-pro-xl-ipad-controller-review">full review</a>, of course, but in a few words, the Kishi V3 Pro XL gave me a competitive advantage in FPS and racing titles as I could tailor my movements down to a T, and all of my commands were promptly registered thanks to the 4,000Hz polling rate. I have no complaints in the performance department.</p><h2 id="there-s-one-problem-though">There's one problem though...</h2><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="bDNLrbchtfPckhm4L7n45o" name="EmptyName.JPG" alt="A Razer Kishi V3 Pro XL iPad gaming controller" src="https://cdn.mos.cms.futurecdn.net/bDNLrbchtfPckhm4L7n45o.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>By now, I'm sure you know that I love the Razer Kishi V3 Pro XL. It's a fantastic iPad controller. But I'd be lying if I said it was perfect — after all, I gave it 4-stars in my <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-kishi-v3-pro-xl-ipad-controller-review">Razer Kishi V3 Pro XL review</a>. Unfortunately, the Kishi V3 Pro XL costs a premium, retailing for <a href="https://www.amazon.com/Kishi-Gaming-Controller-Android-Tablets-Smartphone/dp/B0DVKWZ5SX/" target="_blank" rel="nofollow">$199</a> / <a href="https://www.amazon.co.uk/Razer-Kishi-Pro-Plug-Play/dp/B0F2JD1HS2/" target="_blank" rel="nofollow">£164 at Amazon</a>, which makes it the same price as a new PlayStation Portal. Of course, if you already own an iPad and want to game on it, the Kishi V3 Pro XL might be worth the investment.</p><p>But the lack of haptics and rumble makes it hard for me to recommend it to anyone who wants a <em>truly</em> immersive gaming experience. Having played games using the PS Remote Play app as well as the ones downloaded on my iPad, I instantly noticed the lack of rumble which came as a surprise to me, as Razer specifies "next-gen feedback" on the controller's product page. Here's the kicker: In very fine print, Razer notes that rumble doesn't work on iOS and iPadOS devices.</p><p>Now, this could be a limitation of iOS and iPadOS devices as, apparently, rumble should work fine with Android tablets. Or it could be a limitation of the PS Remote Play app. But does that stop me from feeling disappointed? Nope. Even so, not many controllers feature haptics, so can the Kishi V3 Pro XL really be chastised for it? I don't know. Is it a dealbreaker for me? Well, I'll happily use the Kishi V3 Pro XL until I eventually do get a PlayStation Portal, so we'll leave it at that.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XrzJMX"></div>                            </div>                            <script src="https://kwizly.com/embed/XrzJMX.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/gaming/gaming-peripherals/razer-kishi-v3-pro-xl-ipad-controller-review">I’d given up on iPad gaming until I tried the Razer Kishi V3 Pro XL — now I don’t want to leave the house without it</a></li><li><a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-already-spend-way-too-much-time-playing-my-ps5-and-this-mobile-controller-just-made-things-a-whole-lot-worse">I already spend way too much time playing my PS5 — and this mobile controller just made things a whole lot worse</a></li><li><a href="https://www.tomsguide.com/opinion/i-thought-playstation-portal-was-pointless-heres-why-i-was-wrong">I thought PlayStation Portal was pointless — here’s why I was wrong</a></li></ul><div data-widget-type="review" data-model-name="Razer Kishi V3 Pro XL"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/ive-always-wanted-a-playstation-portal-but-with-a-bigger-screen-so-i-tried-this-mobile-controller-and-it-turned-my-ipad-into-a-gaming-powerhouse</link>
                                                                            <description>
                            <![CDATA[ Has my search for an iPad controller finally come to an end? I tested the Razer Kishi V3 Pro XL which is excellent, and I don't want to travel without it now. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">zp62HNqm4uJFBYBwAVaooJ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/eS5hwa9vvvcwGU2wLe3bon-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 29 Mar 2026 11:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/eS5hwa9vvvcwGU2wLe3bon-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A Razer Kishi V3 Pro XL iPad gaming controller]]></media:description>                                                            <media:text><![CDATA[A Razer Kishi V3 Pro XL iPad gaming controller]]></media:text>
                                <media:title type="plain"><![CDATA[A Razer Kishi V3 Pro XL iPad gaming controller]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/eS5hwa9vvvcwGU2wLe3bon-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I love my <a href="https://www.tomsguide.com/reviews/ps5">PlayStation 5</a>. It's one of the best things I've bought with my own money, and I've spent an ungodly amount of hours playing the likes of <a href="https://www.tomsguide.com/opinion/baldurs-gate-3-is-a-love-letter-to-dungeons-and-dragons-and-its-all-i-want-to-play-right-now">Baldur's Gate 3</a>, <a href="https://www.tomsguide.com/gaming/clair-obscur-expedition-33-review">Clair Obscur: Expedition 33</a>, <a href="https://www.tomsguide.com/reviews/alan-wake-2">Alan Wake 2</a>, and FIFA (sorry, <em>EA Sports FC</em>) on my <a href="https://www.tomsguide.com/gaming/playstation/ps5-slim">PS5 Slim</a>. While I take my <a href="https://www.tomsguide.com/gaming/nintendo/nintendo-switch-2-console-review">Nintendo Switch 2</a> with me when I'm traveling, it just doesn't have the same, diverse game catalog that I like.</p><p>So, for a while now, I've been considering getting the <a href="https://www.tomsguide.com/reviews/playstation-portal">PlayStation Portal</a> — it was even sitting in my cart for a few days during the 2025 Black Friday sales. But truth be told, I'm not entirely convinced by the Portal because I've <a href="https://www.tomsguide.com/gaming/i-just-overpaid-for-a-playstation-portal-and-its-the-dumbest-purchase-ive-ever-made">heard mixed reviews</a>. Do I also want to pay nearly $200 for a remote player? Kinda but also no. Then it hit me: what if I just used the PS Remote Play app on my iPad and got a controller designed specifically for the iPad. Enter the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-kishi-v3-pro-xl-ipad-controller-review">Razer Kishi V3 Pro XL</a>.</p><div class="product"><a data-dimension112="9df13ce6-9db8-432b-a965-2e5f664cf302" data-action="Deal Block" data-label="Kishi V3 Pro XL" data-dimension48="Kishi V3 Pro XL" data-dimension25="$169" href="https://www.amazon.com/Kishi-Gaming-Controller-Android-Tablets-Smartphone/dp/B0DVKWZ5SX/" 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="5qsVDnM6BT8Q3RoUK6CCmR" name="Razer-Kishi-V3PX-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/5qsVDnM6BT8Q3RoUK6CCmR.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Full-sized triggers and thumbsticks, chunky grips, and four extra buttons make the Razer Kishi V3 Pro XL a formidable iPad controller. It’s perfect for on-the-go gaming thanks to its ergonomic design and good weight distribution. It’s compatible with many tablets, and features passthrough charging too. Its TMR thumbsticks are highly customizable and responsive, making it great for FPS, racing and RPG titles.<a class="view-deal button" href="https://www.amazon.com/Kishi-Gaming-Controller-Android-Tablets-Smartphone/dp/B0DVKWZ5SX/" target="_blank" rel="nofollow" data-dimension112="9df13ce6-9db8-432b-a965-2e5f664cf302" data-action="Deal Block" data-label="Kishi V3 Pro XL" data-dimension48="Kishi V3 Pro XL" data-dimension25="$169">View Deal</a></p></div><p>The Kishi V3 Pro XL is a beast — and I'm not just talking about its stature. It's fitted with powerful, highly responsive TMR thumbsticks, mouse-like clicky triggers and face buttons, and it features four additional remappable buttons too. Ergonomically designed and comfortable to hold all day long, it's an utter delight. Is it perfect? Nope. Do I still love it? Heck yes, and here's why.</p><h2 id="ergonomics-galore">Ergonomics galore!</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="7j6ZV7fL9ThKnKQs4h2Hwn" name="EmptyName 6.JPG" alt="A Razer Kishi V3 Pro XL iPad gaming controller" src="https://cdn.mos.cms.futurecdn.net/7j6ZV7fL9ThKnKQs4h2Hwn.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There's no point in spending any amount of money on a controller if it isn't designed ergonomically and hinders you from being able to play all day. Thankfully, the Razer Kishi V3 Pro XL is an extremely comfortable gamepad, one that I've used for a six-hour long stint without feeling like my hands were cramping. That's thanks to the the controller's chunky grips, full-size thumbsticks and triggers, and offset sticks which, in my opinion, feel more ergonomic.</p><p>In terms of size, the Kishi V3 Pro XL's plate where the tablet sits measures measures 12.91 x 4.36 x 2.54 inches when the controller is outstretched. This means that it's big enough to accommodate even a 13-inch <a href="https://www.tomsguide.com/computing/ipads/ipad-pro-m5-review">iPad Pro</a>! It's a joy to handle too, and doesn't feel unwieldy even when a tablet is slotted in. Without one, it weighs 10.97oz. I used the controller with my <a href="https://www.tomsguide.com/reviews/ipad-air-2022-review-a-new-standard-for-tablets">iPad Air </a>10.9-inch which bumped the weight up 1.73lbs. Even so, I didn't find it uncomfortable to hold for long periods of time.</p><p>I can't tell you how much fun it is to game handheld on a screen that big. The PlayStation Portal's 8-inch screen is also good, no doubt about that, but I really like the iPad Air's bigger screen. It makes for quite an immersive gaming experience. Plug in your favorite <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">gaming headset </a>into the 3.5mm port on the right grip and you've got a winning combo.</p><h2 id="so-smooth-so-powerful">So smooth, so powerful</h2><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="3mpN7NSjqF54zDwfiteDvn" name="EmptyName 1.JPG" alt="A Razer Kishi V3 Pro XL iPad gaming controller" src="https://cdn.mos.cms.futurecdn.net/3mpN7NSjqF54zDwfiteDvn.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There's a lot to love about the Razer Kishi V3 Pro XL's gaming performance. First of all, its thumbsticks are fitted with <a href="https://www.tomsguide.com/gaming/gaming-peripherals/so-long-hall-effect-im-only-using-controllers-with-tmr-sensors-from-now-on">Tunnel Magneto Resistance (TMR) sensors</a>, which are more responsive and longer-lasting than Hall Effect ones. They use weak electromagnetic waves which means that smaller adjustments and minute movements are picked up by the sensors, and the boost to accuracy in racing and FPS titles is certainly noticeable.</p><p>Then there's the Kishi V3 Pro XL's triggers, face buttons, two extra shoulder buttons and two back buttons, which are mouse-like to press. They feel like the ones you'll find on the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-wolverine-v3-pro-review">Razer Wolverine V3 Pro</a>. In fact, the Kishi V3 Pro XL feels like someone sliced the Wolverine V3 Pro down the middle and slotted a tablet in between the two grips. The performance is incredible, and I've had so much fun playing games like <a href="https://www.tomsguide.com/reviews/cyberpunk-2077-phantom-liberty">Cyberpunk 2077</a>, Expedition 33, and Need for Speed Heat on this controller.</p><p>You can read all about the performance in my <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-kishi-v3-pro-xl-ipad-controller-review">full review</a>, of course, but in a few words, the Kishi V3 Pro XL gave me a competitive advantage in FPS and racing titles as I could tailor my movements down to a T, and all of my commands were promptly registered thanks to the 4,000Hz polling rate. I have no complaints in the performance department.</p><h2 id="there-s-one-problem-though">There's one problem though...</h2><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="bDNLrbchtfPckhm4L7n45o" name="EmptyName.JPG" alt="A Razer Kishi V3 Pro XL iPad gaming controller" src="https://cdn.mos.cms.futurecdn.net/bDNLrbchtfPckhm4L7n45o.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>By now, I'm sure you know that I love the Razer Kishi V3 Pro XL. It's a fantastic iPad controller. But I'd be lying if I said it was perfect — after all, I gave it 4-stars in my <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-kishi-v3-pro-xl-ipad-controller-review">Razer Kishi V3 Pro XL review</a>. Unfortunately, the Kishi V3 Pro XL costs a premium, retailing for <a href="https://www.amazon.com/Kishi-Gaming-Controller-Android-Tablets-Smartphone/dp/B0DVKWZ5SX/" target="_blank" rel="nofollow">$199</a> / <a href="https://www.amazon.co.uk/Razer-Kishi-Pro-Plug-Play/dp/B0F2JD1HS2/" target="_blank" rel="nofollow">£164 at Amazon</a>, which makes it the same price as a new PlayStation Portal. Of course, if you already own an iPad and want to game on it, the Kishi V3 Pro XL might be worth the investment.</p><p>But the lack of haptics and rumble makes it hard for me to recommend it to anyone who wants a <em>truly</em> immersive gaming experience. Having played games using the PS Remote Play app as well as the ones downloaded on my iPad, I instantly noticed the lack of rumble which came as a surprise to me, as Razer specifies "next-gen feedback" on the controller's product page. Here's the kicker: In very fine print, Razer notes that rumble doesn't work on iOS and iPadOS devices.</p><p>Now, this could be a limitation of iOS and iPadOS devices as, apparently, rumble should work fine with Android tablets. Or it could be a limitation of the PS Remote Play app. But does that stop me from feeling disappointed? Nope. Even so, not many controllers feature haptics, so can the Kishi V3 Pro XL really be chastised for it? I don't know. Is it a dealbreaker for me? Well, I'll happily use the Kishi V3 Pro XL until I eventually do get a PlayStation Portal, so we'll leave it at that.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XrzJMX"></div>                            </div>                            <script src="https://kwizly.com/embed/XrzJMX.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/gaming/gaming-peripherals/razer-kishi-v3-pro-xl-ipad-controller-review">I’d given up on iPad gaming until I tried the Razer Kishi V3 Pro XL — now I don’t want to leave the house without it</a></li><li><a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-already-spend-way-too-much-time-playing-my-ps5-and-this-mobile-controller-just-made-things-a-whole-lot-worse">I already spend way too much time playing my PS5 — and this mobile controller just made things a whole lot worse</a></li><li><a href="https://www.tomsguide.com/opinion/i-thought-playstation-portal-was-pointless-heres-why-i-was-wrong">I thought PlayStation Portal was pointless — here’s why I was wrong</a></li></ul><div data-widget-type="review" data-model-name="Razer Kishi V3 Pro XL"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I’d given up on iPad gaming until I tried the Razer Kishi V3 Pro XL — now I don’t want to leave the house without it ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I’ve owned an iPad since 2022, and I’ll be honest, I haven’t gotten much use out of it — until recently. I just tested the Razer Kishi V3 Pro XL that has turned my iPad into a gaming powerhouse and, honestly, has breathed new life into it. The Kishi V3 Pro XL is a powerful mobile gaming controller with fantastic TMR thumbsticks, four extra buttons, and clicky triggers, all packed into an ergonomic body.</p><p>Featuring full-sized triggers and thumbsticks as well as passthrough charging, this is the only controller you need if you’re a fan of on-the-go gaming. But is it perfect? Sadly not quite. The lack of rumble and haptics on Apple devices will make its premium price tag very difficult to stomach for iOS/iPadOS users.</p><p>To find out if this is the <a href="https://www.tomsguide.com/best-picks/best-mobile-game-controllers">best mobile game controller</a> for you, read my full Razer Kishi V3 Pro XL review.</p><h2 class="article-body__section" id="section-razer-kishi-v3-pro-xl-review-specs"><span>Razer Kishi V3 Pro XL review: Specs</span></h2><div ><table><thead><tr><th class="firstcol " ><p><strong>Specs</strong></p></th><th  ><p><strong>Razer Kishi V3 Pro XL</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/Kishi-Gaming-Controller-Android-Tablets-Smartphone/dp/B0DVKWZ5SX/" target="_blank" rel="nofollow">$199</a> / <a href="https://www.amazon.co.uk/Razer-Kishi-Pro-Plug-Play/dp/B0F2JD1HS2/" target="_blank" rel="nofollow">£164</a></p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>USB-C</p></td></tr><tr><td class="firstcol " ><p><strong>Compatibility</strong></p></td><td  ><p>iPad Pro (11 and 13 inches), iPad Air (11 and 13 inches), iPad (10.9 inches), Android tablets (USB-C)</p></td></tr><tr><td class="firstcol " ><p><strong>Layout</strong></p></td><td  ><p>ABXY</p></td></tr><tr><td class="firstcol " ><p><strong>Triggers</strong></p></td><td  ><p>Analog</p></td></tr><tr><td class="firstcol " ><p><strong>Thumbsticks</strong></p></td><td  ><p>TMR</p></td></tr><tr><td class="firstcol " ><p><strong>Back buttons</strong></p></td><td  ><p>Yes, two</p></td></tr><tr><td class="firstcol " ><p><strong>Shoulder buttons</strong></p></td><td  ><p>Yes, two</p></td></tr><tr><td class="firstcol " ><p><strong>Rumble</strong></p></td><td  ><p>Yes, Razer Sensa HD Haptics</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>12.91 x 4.36 x 2.54 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>10.97oz</p></td></tr><tr><td class="firstcol " ><p><strong>Color</strong></p></td><td  ><p>Black</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>Built-in, passthrough</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-razer-kishi-v3-pro-xl-review-cheat-sheet"><span>Razer Kishi V3 Pro XL review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>A gaming controller for iPads and USB-C tablets</li><li><strong>Who is it for? </strong>Anyone who enjoys gaming on the go and wants a comfortable controller</li><li><strong>How much does it cost? </strong>The Razer Kishi V3 Pro XL is available for <a href="https://www.amazon.com/Kishi-Gaming-Controller-Android-Tablets-Smartphone/dp/B0DVKWZ5SX/" target="_blank" rel="nofollow">$199</a> / <a href="https://www.amazon.co.uk/Razer-Kishi-Pro-Plug-Play/dp/B0F2JD1HS2/" target="_blank" rel="nofollow">£164</a></li><li><strong>What do we like? </strong>The ergonomic design, TMR thumbsticks, passthrough charging, and compatibility with many tablets</li><li><strong>What don’t we like? </strong>No rumble or haptics on iOS/iPadOS and the premium price tag</li></ul><h2 class="article-body__section" id="section-razer-kishi-v3-pro-xl-review-the-ups"><span>Razer Kishi V3 Pro XL review: The ups</span></h2><p>From its ergonomic design and passthrough charging, to its powerful TMR thumbsticks and clicky triggers, the Razer Kishi V3 Pro XL is an absolute must-have accessory for iPad owners.</p><h2 id="extremely-comfortable-and-ergonomic">Extremely comfortable and ergonomic</h2><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="TS4ktBvZZjQXNF26espjKF" name="Razer_Kishi_V3_Pro_XL" alt="A Razer Kishi V3 Pro XL iPad gaming controller" src="https://cdn.mos.cms.futurecdn.net/TS4ktBvZZjQXNF26espjKF.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I’ve tested and used my fair share of mobile and tablet gaming controllers. Some have been good; some have been bad; and a few have been peerless in the comfort department. The Razer Kishi V3 Pro XL falls into the third category as it’s one of the comfiest controllers I’ve used — despite its big footprint.</p><p>The Kishi V3 Pro XL’s plate where the tablet sits measures 12.91 x 4.36 x 2.54 inches when the controller is outstretched, enabling it to accommodate a 13-inch <a href="https://www.tomsguide.com/computing/ipads/ipad-pro-m5-review">iPad Pro</a>. Even so, it doesn’t feel unwieldy to handle. It weighs 10.97oz without a tablet inserted, and with my <a href="https://www.tomsguide.com/reviews/ipad-air-2022-review-a-new-standard-for-tablets">iPad Air </a>10.9-inch slotted in, the controller weighs 1.73lbs, and I haven’t found it too heavy to hold. Having used the controller for a six-hour straight gaming stint, my hands didn’t feel fatigued or like they were cramping from the controller’s 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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uSKPWDfM53JcnQwdZ8yFSF" name="Razer_Kishi_V3_Pro_XL" alt="A Razer Kishi V3 Pro XL iPad gaming controller" src="https://cdn.mos.cms.futurecdn.net/uSKPWDfM53JcnQwdZ8yFSF.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>This is also partly due to the ergonomic, chunky grips which feel similar to the ones you’ll find on the likes of the <a href="https://www.tomsguide.com/reviews/xbox-elite-wireless-controller-series-2">Xbox Elite Wireless 2</a> ($179). In fact, the Kishi V3 Pro XL feels like what you’d get if you sliced a <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-wolverine-v3-pro-review">Razer Wolverine V3 Pro</a> ($199) down the middle and slotted a tablet in between the two grips. That itself speaks volumes about the Kishi V3 Pro XL as the Wolverine V3 Pro is undoubtedly the <a href="https://www.tomsguide.com/best-picks/best-pc-game-controllers">best premium PC game controller</a> on the market.</p><p>I love the full-sized thumbsticks and triggers too which, again, feel like the ones on the Wolverine V3 Pro. I’m a big fan of offset thumbsticks as they feel more ergonomic to me (and something I always miss on my PlayStation DualSense). All in all, the Kishi V3 Pro XL is an excellent, ergonomic controller designed for all-day play.</p><h2 id="compatible-with-many-tablets">Compatible with many tablets</h2><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="UpSxYsqUGCpSyuon69XsyF" name="Razer_Kishi_V3_Pro_XL" alt="A Razer Kishi V3 Pro XL iPad gaming controller" src="https://cdn.mos.cms.futurecdn.net/UpSxYsqUGCpSyuon69XsyF.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you already own an iPad or an Android tablet, the Razer Kishi V3 Pro XL is the right choice for you. It’s compatible with the <a href="https://www.tomsguide.com/computing/ipads/ipad-pro-m5-review">iPad Pro</a> (11 and 13 inches), the <a href="https://www.tomsguide.com/computing/ipads/apple-ipad-air-m4-review-small-tweaks-to-the-gold-standard">iPad Air</a> (11 and 13 inches), the standard <a href="https://www.tomsguide.com/computing/ipads/ipad-11-2025-review">iPad</a> (10.9 inches), and USB-C Android tablets. You can connect it to your PC too, thanks to the included cable, and use it as a regular gamepad.</p><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="7UAFptaKLz9uAykeSRbcRF" name="Razer_Kishi_V3_Pro_XL" alt="A Razer Kishi V3 Pro XL iPad gaming controller" src="https://cdn.mos.cms.futurecdn.net/7UAFptaKLz9uAykeSRbcRF.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>Included in the box are two sets of rubber bumpers for adjusting the controller to your device size, alongside two swappable thumbstick caps (one tall concave and one short convex). I found the rubber bumpers super easy to replace, and I’d recommend trying out the different sizes to ensure that your tablet fits snugly. </p><h2 id="powerful-tmr-sticks">Powerful TMR sticks</h2><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="mszQMeigfTjp8k8kTqecLF" name="Razer_Kishi_V3_Pro_XL" alt="A Razer Kishi V3 Pro XL iPad gaming controller" src="https://cdn.mos.cms.futurecdn.net/mszQMeigfTjp8k8kTqecLF.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 Razer Kishi V3 Pro XL boasts outstanding gaming performance, thanks to its TMR thumbsticks, mouse-like analog triggers, high polling rate, and more. I tested the controller with my iPad 10.9-inch, as I mentioned earlier, and played my favorite <a href="https://www.tomsguide.com/reviews/ps5">PS5</a> games via the PS Remote Play app. First, its polling rate can be set to either 1,000Hz or 4,000Hz, adjustable via the Razer Nexus companion app. Having tested both, I didn’t experience any latency issues or input lag.</p><p>Next, the TMR thumbsticks. <a href="https://www.tomsguide.com/gaming/gaming-peripherals/so-long-hall-effect-im-only-using-controllers-with-tmr-sensors-from-now-on">Tunnel Magneto Resistance (TMR) sensors</a> are superior to Hall Effect ones (which are also great in their own right), as they use weak electromagnetic waves rather than strong ones. This means that smaller adjustments and minute movements are picked up by the sensors, and the boost to accuracy in racing and FPS titles is certainly noticeable.</p><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="jLycYC6C2meQZmdLGF4y6G" name="Razer_Kishi_V3_Pro_XL" alt="A Razer Kishi V3 Pro XL iPad gaming controller" src="https://cdn.mos.cms.futurecdn.net/jLycYC6C2meQZmdLGF4y6G.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I tested this out by playing Need for Speed Heat, and I instantly noticed the performance difference between playing the game on my DualSense versus the Kishi V3 Pro XL. Thanks to the latter’s TMR sticks, I was able to not only maintain a straight line while driving, I could also go right up to the rear bumper of the car ahead of me and overtake right before making contact. This gave me a bit of a competitive advantage. I found the thumbsticks very comfortable too (I used the short convex caps), and thanks to how responsive they were, I was able to easily navigate down the winding mountain roads and turn tight corners.</p><p>I also appreciated being able to make minute adjustments in FPS titles, such as <a href="https://www.tomsguide.com/reviews/cyberpunk-2077-phantom-liberty">Cyberpunk 2077</a>. With my sniper rifle pointed at a group of NPCs in the distance, I could move the right stick ever so slightly to choose the correct target, even though several of them were standing close together. It made me feel like I was in a James Bond movie, to be honest.</p><h2 id="mouse-like-triggers-and-face-buttons">Mouse-like triggers and face buttons</h2><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="jPZ9k7GEx9KpVrfs87FLKF" name="Razer_Kishi_V3_Pro_XL" alt="A Razer Kishi V3 Pro XL iPad gaming controller" src="https://cdn.mos.cms.futurecdn.net/jPZ9k7GEx9KpVrfs87FLKF.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>Another thing I absolutely adore on the Razer Kishi V3 Pro XL is how the triggers and face buttons feel. The controller features analog triggers so while they aren’t as customizable as Hall Effect ones on the likes of the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/gamesir-g8-plus-review">GameSir G8 Plus</a> ($99), I’d be lying if I said they didn’t feel darn good to play with.</p><p>The triggers, along with the face buttons, two extra shoulder buttons and back buttons, feel mouse-like to press, similar to the ones on the Razer Wolverine V3 Pro. They’re extremely responsive and straight out of the box, they didn’t feel stiff at all. I jumped right into <a href="https://www.tomsguide.com/gaming/clair-obscur-expedition-33-review">Clair Obscur: Expedition 33</a> to try them out. Each button and trigger press was instantaneously registered, and I appreciated the tactile feedback I got as well. I also found it handy that I didn’t need to press the buttons or triggers too hard for my commands to register. I was able to execute perfectly timed parries and dodges in Expedition 33, which helped me win crucial boss battles.</p><p>Drifting and braking in Need for Speed Heat was a walk in the park thanks to the triggers as well. They’re full-size which means that there’s plenty of room for your fingers to sit atop the longer R2 and L2 triggers. Again, I didn’t find it fatiguing to hold down L2 in drift challenges. I also appreciate the addition of four extra clicky buttons (two on top, two around the back). I remapped the M1 button on the back as the nitro (N2O) button so all I had to do was use my right middle finger to toggle it when I needed a speed boost, which freed up my thumb to remain on the right thumbstick.</p><h2 id="user-friendly-companion-app">User-friendly companion app</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/pZb9hdVohkgYQgy2DomHsa.jpg" alt="Razer Nexus app screenshots" /><figcaption><small role="credit">Razer / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/A423DrsTsiyrP2TtEpTeta.jpg" alt="Razer Nexus app screenshots" /><figcaption><small role="credit">Razer / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/aUPj3vYUDQUPcHFB2gzwsa.jpg" alt="Razer Nexus app screenshots" /><figcaption><small role="credit">Razer / Tom's Guide</small></figcaption></figure></figure><p>As I alluded to before, the Razer Kishi V3 Pro XL is accompanied by the <a href="https://www.razer.com/gb-en/mobile/razer-nexus/" target="_blank" rel="nofollow">Razer Nexus</a> app which is free to download on iOS, iPadOS and Android. Razer Nexus sports a clean user interface and is your one-stop shop for all the games installed on your device, and for launching apps like PS Remote Play, Steam Link, and even emulators. It’s easy to navigate and there are no intrusive pop-ups that deter from the experience.</p><p>Razer Nexus is also your hub for customizing the Kishi V3 Pro XL. Within the app — which can be quickly accessed by hitting the Nexus button located under the right thumbstick — you can customize the four extra buttons, remap the others, adjust the TMR sticks’ deadzone, swap between analog and digital triggers, and adjust the controller’s polling rate. Simple enough to do, and thanks to native compatibility, you can even adjust a few of these settings from the iPad’s Settings menu too.</p><h2 id="passthrough-charging">Passthrough charging</h2><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="XZWKqA7YkxysAzJpmiUVmE" name="Razer_Kishi_V3_Pro_XL" alt="A Razer Kishi V3 Pro XL iPad gaming controller" src="https://cdn.mos.cms.futurecdn.net/XZWKqA7YkxysAzJpmiUVmE.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>Last but certainly not least, the Razer Kishi V3 Pro XL features passthrough charging. It’s important to note that the controller doesn’t feature a built-in battery and is instead powered by your tablet, so passthrough charging is a must. This basically means that you can charge your iPad or Android tablet while it’s slotted into the Kishi V3 Pro XL. The USB-C port is located on the right grip.</p><p>Passthrough charging has quickly become a non-negotiable for me, and I hate it when a controller doesn’t feature it — the GameSir G8 Plus and the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/the-scuf-nomad-mobile-controller-crushes-the-backbone-one-heres-why">Scuf Nomad</a> ($99), for instance. It’s also something we’ve seen on the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/backbone-pro-phone-controller-review">Backbone Pro</a> ($169) and the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/gamesir-x5-lite-review">GameSir X5 Lite</a> ($34) and, in all honesty, if Razer didn’t include passthrough charging at <em>this </em>price (more on that shortly) I would’ve been flabbergasted.</p><h2 class="article-body__section" id="section-razer-kishi-v3-pro-xl-review-the-downs"><span>Razer Kishi V3 Pro XL review: The downs</span></h2><p>Alas, the Razer Kishi V3 Pro XL isn’t perfect. There’s no rumble or haptics on Apple devices, and the price tag is a little difficult to stomach.</p><h2 id="no-rumble-or-haptics-on-apple-devices">No rumble or haptics on Apple devices</h2><p>One of the most disappointing things about the Razer Kishi V3 Pro XL, and perhaps a dealbreaker for some, is the fact that its rumble and haptics don’t work on iOS and iPadOS devices. You’d best believe it when I say that I let out the biggest sigh possible when I plugged in my iPad and there was no rumble in the games I played. Razer does state this on the <a href="https://www.razer.com/gb-en/mobile-controllers/razer-kishi-v3-pro-xl" target="_blank" rel="nofollow">official product page</a>, but in small print that might get missed by most people as it’s accompanied by bold letters stating “Next-Gen Tactile Feedback” and “RAZER SENSA HD HAPTICS” in all caps.</p><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="QyhpnA2ockidh5epEn6CnE" name="Razer_Kishi_V3_Pro_XL" alt="A Razer Kishi V3 Pro XL iPad gaming controller" src="https://cdn.mos.cms.futurecdn.net/QyhpnA2ockidh5epEn6CnE.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>This is a limitation confined to iOS and iPadOS (as the rumble works with Android tablets), but Apple added rumble support on iPadOS 15, so Razer isn’t off the hook here.</p><p>Even if it were an issue stemming from iPadOS or the PS Remote Play app, it would’ve been nice to have the incompatibility warning a little more prominent. I’ve seen many people complain about the lack of haptics on iPadOS on<a href="https://www.reddit.com/r/RazerKishi/" target="_blank" rel="nofollow"> r/razerkishi</a> and <a href="https://www.reddit.com/r/razer/" target="_blank" rel="nofollow">r/razer</a> subreddits, and many have stated that they’ve ended up returning their Kishi V3 Pro XLs for this reason. I won’t lie, it’s certainly disappointing especially given that the controller is advertised as one designed for iPads.</p><p>But I’d also like to note that rumble and haptics aren’t found on that many mobile controllers. These are missing from the GameSir G8 Plus and the Backbone Pro, for instance, and are a limitation of iOS and iPadOS. I really can’t think of any other iPad controller that does feature haptics. This is a major pre-purchase consideration for you to chew over, and the only drawback of using the Kishi V3 Pro XL and other controllers with an iPhone or iPad. In the meantime, I’ve reached out to a Razer representative to get a clearer picture and understanding.</p><h2 id="costs-a-premium-2">Costs a premium</h2><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="hf4gfMukUEwjmCcsHr8URF" name="Razer_Kishi_V3_Pro_XL" alt="A Razer Kishi V3 Pro XL iPad gaming controller" src="https://cdn.mos.cms.futurecdn.net/hf4gfMukUEwjmCcsHr8URF.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>While the Razer Kishi V3 Pro XL is an excellent iPad controller, there’s no sugarcoating the fact that it’s quite expensive. It retails for <a href="https://www.amazon.com/Kishi-Gaming-Controller-Android-Tablets-Smartphone/dp/B0DVKWZ5SX/" target="_blank" rel="nofollow">$199</a> / <a href="https://www.amazon.co.uk/Razer-Kishi-Pro-Plug-Play/dp/B0F2JD1HS2/" target="_blank" rel="nofollow">£164 at Amazon</a>, making it the most expensive mobile controller I’ve tested so far (at the time of writing). This makes the Kishi V3 Pro XL as expensive as the <a href="https://www.tomsguide.com/reviews/playstation-portal">PlayStation Portal</a> ($199). The standard, smaller Kishi V3 Pro model designed for smartphones is a little cheaper at $149, but is the $50 price difference justified, especially when rivals like the GameSir G8 Plus ($99) are available for far less?</p><p>But the Kishi V3 Pro XL doesn’t have many other competitors. Most other controllers compatible with the iPad take the shape and form of your regular gamepad, like the PlayStation DualSense (which works just fine with the iPad). The biggest difference is, of course, the fact that you need to prop your iPad up on a table to use a standard gamepad, which you don’t need to do with the Kishi V3 Pro XL. It is, then, perhaps justified that the controller costs so much, but the fact that rumble and haptics don’t work as intended leaves a sour taste in my mouth.</p><h2 class="article-body__section" id="section-razer-kishi-v3-pro-xl-review-verdict"><span>Razer Kishi V3 Pro XL review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="QX9RYmpW49JrwQhBYRFy9G" name="Razer_Kishi_V3_Pro_XL" alt="A Razer Kishi V3 Pro XL iPad gaming controller" src="https://cdn.mos.cms.futurecdn.net/QX9RYmpW49JrwQhBYRFy9G.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>Razer knows how to make a good gaming peripheral, and the Kishi V3 Pro XL is one of the best iPad accessories you can buy today, especially if you’re a gamer. The controller is ergonomically designed with full-size thumbsticks and triggers, making it perfect for all-day gaming. Passthrough charging also means that you don’t have to worry about your tablet running out of charge mid-gaming.</p><p>I love the TMR thumbsticks and mouse-like analog triggers and extra buttons. They’re all highly responsive in FPS, racing and RPG titles, and they can be customized via the user-friendly app too. But is all of this worth nearly $200, especially when there’s no haptics or rumble on Apple devices? Kinda. The Kishi V3 Pro XL has carved out a niche for itself, and if it’s an ergonomic iPad mobile game controller you need, it’s really the only one to get.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/razer-kishi-v3-pro-xl-ipad-controller-review</link>
                                                                            <description>
                            <![CDATA[ The Razer Kishi V3 Pro XL is an excellent iPad controller, featuring responsive TMR sticks, full-sized triggers, and passthrough charging. But it has flaws. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">DkPZ7tzsTcfVYU26aCP5Cb</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/QX9RYmpW49JrwQhBYRFy9G-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 27 Mar 2026 13:18:08 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[iPads]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/QX9RYmpW49JrwQhBYRFy9G-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A Razer Kishi V3 Pro XL iPad gaming controller]]></media:description>                                                            <media:text><![CDATA[A Razer Kishi V3 Pro XL iPad gaming controller]]></media:text>
                                <media:title type="plain"><![CDATA[A Razer Kishi V3 Pro XL iPad gaming controller]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/QX9RYmpW49JrwQhBYRFy9G-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I’ve owned an iPad since 2022, and I’ll be honest, I haven’t gotten much use out of it — until recently. I just tested the Razer Kishi V3 Pro XL that has turned my iPad into a gaming powerhouse and, honestly, has breathed new life into it. The Kishi V3 Pro XL is a powerful mobile gaming controller with fantastic TMR thumbsticks, four extra buttons, and clicky triggers, all packed into an ergonomic body.</p><p>Featuring full-sized triggers and thumbsticks as well as passthrough charging, this is the only controller you need if you’re a fan of on-the-go gaming. But is it perfect? Sadly not quite. The lack of rumble and haptics on Apple devices will make its premium price tag very difficult to stomach for iOS/iPadOS users.</p><p>To find out if this is the <a href="https://www.tomsguide.com/best-picks/best-mobile-game-controllers">best mobile game controller</a> for you, read my full Razer Kishi V3 Pro XL review.</p><h2 class="article-body__section" id="section-razer-kishi-v3-pro-xl-review-specs"><span>Razer Kishi V3 Pro XL review: Specs</span></h2><div ><table><thead><tr><th class="firstcol " ><p><strong>Specs</strong></p></th><th  ><p><strong>Razer Kishi V3 Pro XL</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/Kishi-Gaming-Controller-Android-Tablets-Smartphone/dp/B0DVKWZ5SX/" target="_blank" rel="nofollow">$199</a> / <a href="https://www.amazon.co.uk/Razer-Kishi-Pro-Plug-Play/dp/B0F2JD1HS2/" target="_blank" rel="nofollow">£164</a></p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>USB-C</p></td></tr><tr><td class="firstcol " ><p><strong>Compatibility</strong></p></td><td  ><p>iPad Pro (11 and 13 inches), iPad Air (11 and 13 inches), iPad (10.9 inches), Android tablets (USB-C)</p></td></tr><tr><td class="firstcol " ><p><strong>Layout</strong></p></td><td  ><p>ABXY</p></td></tr><tr><td class="firstcol " ><p><strong>Triggers</strong></p></td><td  ><p>Analog</p></td></tr><tr><td class="firstcol " ><p><strong>Thumbsticks</strong></p></td><td  ><p>TMR</p></td></tr><tr><td class="firstcol " ><p><strong>Back buttons</strong></p></td><td  ><p>Yes, two</p></td></tr><tr><td class="firstcol " ><p><strong>Shoulder buttons</strong></p></td><td  ><p>Yes, two</p></td></tr><tr><td class="firstcol " ><p><strong>Rumble</strong></p></td><td  ><p>Yes, Razer Sensa HD Haptics</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>12.91 x 4.36 x 2.54 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>10.97oz</p></td></tr><tr><td class="firstcol " ><p><strong>Color</strong></p></td><td  ><p>Black</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>Built-in, passthrough</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-razer-kishi-v3-pro-xl-review-cheat-sheet"><span>Razer Kishi V3 Pro XL review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>A gaming controller for iPads and USB-C tablets</li><li><strong>Who is it for? </strong>Anyone who enjoys gaming on the go and wants a comfortable controller</li><li><strong>How much does it cost? </strong>The Razer Kishi V3 Pro XL is available for <a href="https://www.amazon.com/Kishi-Gaming-Controller-Android-Tablets-Smartphone/dp/B0DVKWZ5SX/" target="_blank" rel="nofollow">$199</a> / <a href="https://www.amazon.co.uk/Razer-Kishi-Pro-Plug-Play/dp/B0F2JD1HS2/" target="_blank" rel="nofollow">£164</a></li><li><strong>What do we like? </strong>The ergonomic design, TMR thumbsticks, passthrough charging, and compatibility with many tablets</li><li><strong>What don’t we like? </strong>No rumble or haptics on iOS/iPadOS and the premium price tag</li></ul><h2 class="article-body__section" id="section-razer-kishi-v3-pro-xl-review-the-ups"><span>Razer Kishi V3 Pro XL review: The ups</span></h2><p>From its ergonomic design and passthrough charging, to its powerful TMR thumbsticks and clicky triggers, the Razer Kishi V3 Pro XL is an absolute must-have accessory for iPad owners.</p><h2 id="extremely-comfortable-and-ergonomic">Extremely comfortable and ergonomic</h2><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="TS4ktBvZZjQXNF26espjKF" name="Razer_Kishi_V3_Pro_XL" alt="A Razer Kishi V3 Pro XL iPad gaming controller" src="https://cdn.mos.cms.futurecdn.net/TS4ktBvZZjQXNF26espjKF.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I’ve tested and used my fair share of mobile and tablet gaming controllers. Some have been good; some have been bad; and a few have been peerless in the comfort department. The Razer Kishi V3 Pro XL falls into the third category as it’s one of the comfiest controllers I’ve used — despite its big footprint.</p><p>The Kishi V3 Pro XL’s plate where the tablet sits measures 12.91 x 4.36 x 2.54 inches when the controller is outstretched, enabling it to accommodate a 13-inch <a href="https://www.tomsguide.com/computing/ipads/ipad-pro-m5-review">iPad Pro</a>. Even so, it doesn’t feel unwieldy to handle. It weighs 10.97oz without a tablet inserted, and with my <a href="https://www.tomsguide.com/reviews/ipad-air-2022-review-a-new-standard-for-tablets">iPad Air </a>10.9-inch slotted in, the controller weighs 1.73lbs, and I haven’t found it too heavy to hold. Having used the controller for a six-hour straight gaming stint, my hands didn’t feel fatigued or like they were cramping from the controller’s 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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uSKPWDfM53JcnQwdZ8yFSF" name="Razer_Kishi_V3_Pro_XL" alt="A Razer Kishi V3 Pro XL iPad gaming controller" src="https://cdn.mos.cms.futurecdn.net/uSKPWDfM53JcnQwdZ8yFSF.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>This is also partly due to the ergonomic, chunky grips which feel similar to the ones you’ll find on the likes of the <a href="https://www.tomsguide.com/reviews/xbox-elite-wireless-controller-series-2">Xbox Elite Wireless 2</a> ($179). In fact, the Kishi V3 Pro XL feels like what you’d get if you sliced a <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-wolverine-v3-pro-review">Razer Wolverine V3 Pro</a> ($199) down the middle and slotted a tablet in between the two grips. That itself speaks volumes about the Kishi V3 Pro XL as the Wolverine V3 Pro is undoubtedly the <a href="https://www.tomsguide.com/best-picks/best-pc-game-controllers">best premium PC game controller</a> on the market.</p><p>I love the full-sized thumbsticks and triggers too which, again, feel like the ones on the Wolverine V3 Pro. I’m a big fan of offset thumbsticks as they feel more ergonomic to me (and something I always miss on my PlayStation DualSense). All in all, the Kishi V3 Pro XL is an excellent, ergonomic controller designed for all-day play.</p><h2 id="compatible-with-many-tablets">Compatible with many tablets</h2><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="UpSxYsqUGCpSyuon69XsyF" name="Razer_Kishi_V3_Pro_XL" alt="A Razer Kishi V3 Pro XL iPad gaming controller" src="https://cdn.mos.cms.futurecdn.net/UpSxYsqUGCpSyuon69XsyF.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you already own an iPad or an Android tablet, the Razer Kishi V3 Pro XL is the right choice for you. It’s compatible with the <a href="https://www.tomsguide.com/computing/ipads/ipad-pro-m5-review">iPad Pro</a> (11 and 13 inches), the <a href="https://www.tomsguide.com/computing/ipads/apple-ipad-air-m4-review-small-tweaks-to-the-gold-standard">iPad Air</a> (11 and 13 inches), the standard <a href="https://www.tomsguide.com/computing/ipads/ipad-11-2025-review">iPad</a> (10.9 inches), and USB-C Android tablets. You can connect it to your PC too, thanks to the included cable, and use it as a regular gamepad.</p><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="7UAFptaKLz9uAykeSRbcRF" name="Razer_Kishi_V3_Pro_XL" alt="A Razer Kishi V3 Pro XL iPad gaming controller" src="https://cdn.mos.cms.futurecdn.net/7UAFptaKLz9uAykeSRbcRF.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>Included in the box are two sets of rubber bumpers for adjusting the controller to your device size, alongside two swappable thumbstick caps (one tall concave and one short convex). I found the rubber bumpers super easy to replace, and I’d recommend trying out the different sizes to ensure that your tablet fits snugly. </p><h2 id="powerful-tmr-sticks">Powerful TMR sticks</h2><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="mszQMeigfTjp8k8kTqecLF" name="Razer_Kishi_V3_Pro_XL" alt="A Razer Kishi V3 Pro XL iPad gaming controller" src="https://cdn.mos.cms.futurecdn.net/mszQMeigfTjp8k8kTqecLF.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 Razer Kishi V3 Pro XL boasts outstanding gaming performance, thanks to its TMR thumbsticks, mouse-like analog triggers, high polling rate, and more. I tested the controller with my iPad 10.9-inch, as I mentioned earlier, and played my favorite <a href="https://www.tomsguide.com/reviews/ps5">PS5</a> games via the PS Remote Play app. First, its polling rate can be set to either 1,000Hz or 4,000Hz, adjustable via the Razer Nexus companion app. Having tested both, I didn’t experience any latency issues or input lag.</p><p>Next, the TMR thumbsticks. <a href="https://www.tomsguide.com/gaming/gaming-peripherals/so-long-hall-effect-im-only-using-controllers-with-tmr-sensors-from-now-on">Tunnel Magneto Resistance (TMR) sensors</a> are superior to Hall Effect ones (which are also great in their own right), as they use weak electromagnetic waves rather than strong ones. This means that smaller adjustments and minute movements are picked up by the sensors, and the boost to accuracy in racing and FPS titles is certainly noticeable.</p><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="jLycYC6C2meQZmdLGF4y6G" name="Razer_Kishi_V3_Pro_XL" alt="A Razer Kishi V3 Pro XL iPad gaming controller" src="https://cdn.mos.cms.futurecdn.net/jLycYC6C2meQZmdLGF4y6G.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I tested this out by playing Need for Speed Heat, and I instantly noticed the performance difference between playing the game on my DualSense versus the Kishi V3 Pro XL. Thanks to the latter’s TMR sticks, I was able to not only maintain a straight line while driving, I could also go right up to the rear bumper of the car ahead of me and overtake right before making contact. This gave me a bit of a competitive advantage. I found the thumbsticks very comfortable too (I used the short convex caps), and thanks to how responsive they were, I was able to easily navigate down the winding mountain roads and turn tight corners.</p><p>I also appreciated being able to make minute adjustments in FPS titles, such as <a href="https://www.tomsguide.com/reviews/cyberpunk-2077-phantom-liberty">Cyberpunk 2077</a>. With my sniper rifle pointed at a group of NPCs in the distance, I could move the right stick ever so slightly to choose the correct target, even though several of them were standing close together. It made me feel like I was in a James Bond movie, to be honest.</p><h2 id="mouse-like-triggers-and-face-buttons">Mouse-like triggers and face buttons</h2><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="jPZ9k7GEx9KpVrfs87FLKF" name="Razer_Kishi_V3_Pro_XL" alt="A Razer Kishi V3 Pro XL iPad gaming controller" src="https://cdn.mos.cms.futurecdn.net/jPZ9k7GEx9KpVrfs87FLKF.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>Another thing I absolutely adore on the Razer Kishi V3 Pro XL is how the triggers and face buttons feel. The controller features analog triggers so while they aren’t as customizable as Hall Effect ones on the likes of the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/gamesir-g8-plus-review">GameSir G8 Plus</a> ($99), I’d be lying if I said they didn’t feel darn good to play with.</p><p>The triggers, along with the face buttons, two extra shoulder buttons and back buttons, feel mouse-like to press, similar to the ones on the Razer Wolverine V3 Pro. They’re extremely responsive and straight out of the box, they didn’t feel stiff at all. I jumped right into <a href="https://www.tomsguide.com/gaming/clair-obscur-expedition-33-review">Clair Obscur: Expedition 33</a> to try them out. Each button and trigger press was instantaneously registered, and I appreciated the tactile feedback I got as well. I also found it handy that I didn’t need to press the buttons or triggers too hard for my commands to register. I was able to execute perfectly timed parries and dodges in Expedition 33, which helped me win crucial boss battles.</p><p>Drifting and braking in Need for Speed Heat was a walk in the park thanks to the triggers as well. They’re full-size which means that there’s plenty of room for your fingers to sit atop the longer R2 and L2 triggers. Again, I didn’t find it fatiguing to hold down L2 in drift challenges. I also appreciate the addition of four extra clicky buttons (two on top, two around the back). I remapped the M1 button on the back as the nitro (N2O) button so all I had to do was use my right middle finger to toggle it when I needed a speed boost, which freed up my thumb to remain on the right thumbstick.</p><h2 id="user-friendly-companion-app">User-friendly companion app</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/pZb9hdVohkgYQgy2DomHsa.jpg" alt="Razer Nexus app screenshots" /><figcaption><small role="credit">Razer / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/A423DrsTsiyrP2TtEpTeta.jpg" alt="Razer Nexus app screenshots" /><figcaption><small role="credit">Razer / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/aUPj3vYUDQUPcHFB2gzwsa.jpg" alt="Razer Nexus app screenshots" /><figcaption><small role="credit">Razer / Tom's Guide</small></figcaption></figure></figure><p>As I alluded to before, the Razer Kishi V3 Pro XL is accompanied by the <a href="https://www.razer.com/gb-en/mobile/razer-nexus/" target="_blank" rel="nofollow">Razer Nexus</a> app which is free to download on iOS, iPadOS and Android. Razer Nexus sports a clean user interface and is your one-stop shop for all the games installed on your device, and for launching apps like PS Remote Play, Steam Link, and even emulators. It’s easy to navigate and there are no intrusive pop-ups that deter from the experience.</p><p>Razer Nexus is also your hub for customizing the Kishi V3 Pro XL. Within the app — which can be quickly accessed by hitting the Nexus button located under the right thumbstick — you can customize the four extra buttons, remap the others, adjust the TMR sticks’ deadzone, swap between analog and digital triggers, and adjust the controller’s polling rate. Simple enough to do, and thanks to native compatibility, you can even adjust a few of these settings from the iPad’s Settings menu too.</p><h2 id="passthrough-charging">Passthrough charging</h2><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="XZWKqA7YkxysAzJpmiUVmE" name="Razer_Kishi_V3_Pro_XL" alt="A Razer Kishi V3 Pro XL iPad gaming controller" src="https://cdn.mos.cms.futurecdn.net/XZWKqA7YkxysAzJpmiUVmE.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>Last but certainly not least, the Razer Kishi V3 Pro XL features passthrough charging. It’s important to note that the controller doesn’t feature a built-in battery and is instead powered by your tablet, so passthrough charging is a must. This basically means that you can charge your iPad or Android tablet while it’s slotted into the Kishi V3 Pro XL. The USB-C port is located on the right grip.</p><p>Passthrough charging has quickly become a non-negotiable for me, and I hate it when a controller doesn’t feature it — the GameSir G8 Plus and the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/the-scuf-nomad-mobile-controller-crushes-the-backbone-one-heres-why">Scuf Nomad</a> ($99), for instance. It’s also something we’ve seen on the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/backbone-pro-phone-controller-review">Backbone Pro</a> ($169) and the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/gamesir-x5-lite-review">GameSir X5 Lite</a> ($34) and, in all honesty, if Razer didn’t include passthrough charging at <em>this </em>price (more on that shortly) I would’ve been flabbergasted.</p><h2 class="article-body__section" id="section-razer-kishi-v3-pro-xl-review-the-downs"><span>Razer Kishi V3 Pro XL review: The downs</span></h2><p>Alas, the Razer Kishi V3 Pro XL isn’t perfect. There’s no rumble or haptics on Apple devices, and the price tag is a little difficult to stomach.</p><h2 id="no-rumble-or-haptics-on-apple-devices">No rumble or haptics on Apple devices</h2><p>One of the most disappointing things about the Razer Kishi V3 Pro XL, and perhaps a dealbreaker for some, is the fact that its rumble and haptics don’t work on iOS and iPadOS devices. You’d best believe it when I say that I let out the biggest sigh possible when I plugged in my iPad and there was no rumble in the games I played. Razer does state this on the <a href="https://www.razer.com/gb-en/mobile-controllers/razer-kishi-v3-pro-xl" target="_blank" rel="nofollow">official product page</a>, but in small print that might get missed by most people as it’s accompanied by bold letters stating “Next-Gen Tactile Feedback” and “RAZER SENSA HD HAPTICS” in all caps.</p><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="QyhpnA2ockidh5epEn6CnE" name="Razer_Kishi_V3_Pro_XL" alt="A Razer Kishi V3 Pro XL iPad gaming controller" src="https://cdn.mos.cms.futurecdn.net/QyhpnA2ockidh5epEn6CnE.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>This is a limitation confined to iOS and iPadOS (as the rumble works with Android tablets), but Apple added rumble support on iPadOS 15, so Razer isn’t off the hook here.</p><p>Even if it were an issue stemming from iPadOS or the PS Remote Play app, it would’ve been nice to have the incompatibility warning a little more prominent. I’ve seen many people complain about the lack of haptics on iPadOS on<a href="https://www.reddit.com/r/RazerKishi/" target="_blank" rel="nofollow"> r/razerkishi</a> and <a href="https://www.reddit.com/r/razer/" target="_blank" rel="nofollow">r/razer</a> subreddits, and many have stated that they’ve ended up returning their Kishi V3 Pro XLs for this reason. I won’t lie, it’s certainly disappointing especially given that the controller is advertised as one designed for iPads.</p><p>But I’d also like to note that rumble and haptics aren’t found on that many mobile controllers. These are missing from the GameSir G8 Plus and the Backbone Pro, for instance, and are a limitation of iOS and iPadOS. I really can’t think of any other iPad controller that does feature haptics. This is a major pre-purchase consideration for you to chew over, and the only drawback of using the Kishi V3 Pro XL and other controllers with an iPhone or iPad. In the meantime, I’ve reached out to a Razer representative to get a clearer picture and understanding.</p><h2 id="costs-a-premium-2">Costs a premium</h2><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="hf4gfMukUEwjmCcsHr8URF" name="Razer_Kishi_V3_Pro_XL" alt="A Razer Kishi V3 Pro XL iPad gaming controller" src="https://cdn.mos.cms.futurecdn.net/hf4gfMukUEwjmCcsHr8URF.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>While the Razer Kishi V3 Pro XL is an excellent iPad controller, there’s no sugarcoating the fact that it’s quite expensive. It retails for <a href="https://www.amazon.com/Kishi-Gaming-Controller-Android-Tablets-Smartphone/dp/B0DVKWZ5SX/" target="_blank" rel="nofollow">$199</a> / <a href="https://www.amazon.co.uk/Razer-Kishi-Pro-Plug-Play/dp/B0F2JD1HS2/" target="_blank" rel="nofollow">£164 at Amazon</a>, making it the most expensive mobile controller I’ve tested so far (at the time of writing). This makes the Kishi V3 Pro XL as expensive as the <a href="https://www.tomsguide.com/reviews/playstation-portal">PlayStation Portal</a> ($199). The standard, smaller Kishi V3 Pro model designed for smartphones is a little cheaper at $149, but is the $50 price difference justified, especially when rivals like the GameSir G8 Plus ($99) are available for far less?</p><p>But the Kishi V3 Pro XL doesn’t have many other competitors. Most other controllers compatible with the iPad take the shape and form of your regular gamepad, like the PlayStation DualSense (which works just fine with the iPad). The biggest difference is, of course, the fact that you need to prop your iPad up on a table to use a standard gamepad, which you don’t need to do with the Kishi V3 Pro XL. It is, then, perhaps justified that the controller costs so much, but the fact that rumble and haptics don’t work as intended leaves a sour taste in my mouth.</p><h2 class="article-body__section" id="section-razer-kishi-v3-pro-xl-review-verdict"><span>Razer Kishi V3 Pro XL review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="QX9RYmpW49JrwQhBYRFy9G" name="Razer_Kishi_V3_Pro_XL" alt="A Razer Kishi V3 Pro XL iPad gaming controller" src="https://cdn.mos.cms.futurecdn.net/QX9RYmpW49JrwQhBYRFy9G.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>Razer knows how to make a good gaming peripheral, and the Kishi V3 Pro XL is one of the best iPad accessories you can buy today, especially if you’re a gamer. The controller is ergonomically designed with full-size thumbsticks and triggers, making it perfect for all-day gaming. Passthrough charging also means that you don’t have to worry about your tablet running out of charge mid-gaming.</p><p>I love the TMR thumbsticks and mouse-like analog triggers and extra buttons. They’re all highly responsive in FPS, racing and RPG titles, and they can be customized via the user-friendly app too. But is all of this worth nearly $200, especially when there’s no haptics or rumble on Apple devices? Kinda. The Kishi V3 Pro XL has carved out a niche for itself, and if it’s an ergonomic iPad mobile game controller you need, it’s really the only one to get.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Corsair Vanguard Pro 96 review: A good keyboard, but is it worth the ‘big brand’ premium? ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Corsair Vanguard Pro 96 is a premium gaming keyboard from legendary gaming hardware manufacturer Corsair. It boasts a roster of today’s must-have gaming features — the two most notable being magnetic switches (and all their associated goodies, like adjustable actuation and Rapid Trigger) and 8K polling.</p><p>The Vanguard Pro has a number of virtues. It has the aforementioned gaming features under its belt, plus an LED screen for on-the-fly adjustments, custom assignable game buttons and easy-to-use companion software. It types nicely for a gaming board, is built fairly well, and comes with a magnetically attaching wrist rest.</p><p>There are some major frustrations, though. For all the potential the LED screen has, it’s cumbersome and frustrating in practice. It isn’t particularly pretty, and I can’t see much justification for the whopping $220, save the big-brand name (which usually doesn’t count for much in the keyboard world).</p><p>So, is it one of the <a href="https://www.tomsguide.com/best-picks/best-gaming-keyboard"><u>best gaming keyboards</u></a> you can buy? Find out in my full Corsair Vanguard Pro 96 review.</p><h2 class="article-body__section" id="section-corsair-vanguard-pro-96-review-cheat-sheet"><span>Corsair Vanguard Pro 96 review: Cheat sheet</span></h2><ul><li><strong>What is it?</strong> A 96% Hall Effect gaming keyboard from industry giant, Corsair</li><li><strong>Who is it for? </strong>Gamers who want a traditional-looking gaming deck with modern features</li><li><strong>What does it cost?</strong> <a href="https://www.amazon.com/Corsair-Vanguard-Magnetic-Mechanical-Keyboard-PC/dp/B0FKHPRZ45" target="_blank" rel="nofollow">$229</a> / <a href="https://www.amazon.co.uk/Corsair-VANGUARD-Magnetic-Mechanical-Keyboard/dp/B0FMF9T8RM" target="_blank" rel="nofollow">£209</a></li><li><strong>What's good? </strong>It offers a decent amount of gaming performance and customization, and comes with a premium wrist rest</li><li><strong>What's not?</strong> You can get more features for similar or less money, and the onboard controls are frustrating</li></ul><h2 class="article-body__section" id="section-corsair-vanguard-pro-96-review-specs"><span>Corsair Vanguard Pro 96 review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/Corsair-Vanguard-Magnetic-Mechanical-Keyboard-PC/dp/B0FKHPRZ45" target="_blank" rel="nofollow"><u>$229</u></a> /<a href="https://www.amazon.co.uk/Corsair-VANGUARD-Magnetic-Mechanical-Keyboard/dp/B0FMF9T8RM" target="_blank" rel="nofollow"> <u>£209</u></a></p></td></tr><tr><td class="firstcol " ><p><strong>Switches</strong></p></td><td  ><p>Corsair MGX Hyperdrive V2 Hall Effect</p></td></tr><tr><td class="firstcol " ><p><strong>Keycaps</strong></p></td><td  ><p>PBT</p></td></tr><tr><td class="firstcol " ><p><strong>Construction</strong></p></td><td  ><p>Aluminum</p></td></tr><tr><td class="firstcol " ><p><strong>Layout</strong></p></td><td  ><p>96%</p></td></tr><tr><td class="firstcol " ><p><strong>Operating system</strong></p></td><td  ><p>Windows, macOS Linux</p></td></tr><tr><td class="firstcol " ><p><strong>Backlighting</strong></p></td><td  ><p>Per-key RGB and Mix RGB</p></td></tr><tr><td class="firstcol " ><p><strong>Polling rate</strong></p></td><td  ><p>8,000Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Wired</p></td></tr><tr><td class="firstcol " ><p><strong>Measurements</strong></p></td><td  ><p>15.28 x 5.55 x 1.69 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>2.41lbs</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Black</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-corsair-vanguard-pro-96-review-the-ups"><span>Corsair Vanguard Pro 96 review: The ups</span></h2><p>The Corsair Vanguard Pro 96 has some attractive features, including its magnetic gaming features, typing experience and thoughtful design elements.</p><h2 id="gaming-performance">Gaming performance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ioMTMifHVzifBFERRzeUYh" name="corsair_Vanguard_Pro_96_ 6.JPG" alt="The Corsair Vanguard Pro 96 in black, on a stone surface" src="https://cdn.mos.cms.futurecdn.net/ioMTMifHVzifBFERRzeUYh.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><div  class="fancy-box"><div class="fancy_box-title">Tom's Guide reviews gaming platform</div><div class="fancy_box_body"><p class="fancy-box__body-text"><strong>Supplied by: </strong><a data-analytics-id="inline-link" href="https://www.msi.com/" target="_blank" rel="nofollow"><strong>MSI</strong></a><strong> | Tom's Guide</strong><br><strong></strong><br><strong>CPU:</strong> <a data-analytics-id="inline-link" href="https://www.amazon.com/AMD-7700X-16-Thread-Unlocked-Processor/dp/B0BBHHT8LY/" target="_blank" rel="nofollow">AMD Ryzen 7 7700X</a><strong> </strong>|<strong> Graphics card:</strong> <a data-analytics-id="inline-link" href="https://www.msi.com/Graphics-Card/GeForce-RTX-5070-Ti-16G-VANGUARD-SOC" target="_blank" rel="nofollow">MSI RTX 5070 Ti 16GB Vanguard SOC</a><strong> </strong>|<strong> Motherboard: </strong><a data-analytics-id="inline-link" href="https://www.msi.com/Motherboard/B850-GAMING-PLUS-WIFI" target="_blank" rel="nofollow">MSI B850E Gaming Plus WiFi</a><strong> </strong>|<strong> RAM: </strong><a data-analytics-id="inline-link" href="https://www.newegg.com/kingston-technology-corp-fury-renegade-32gb-ddr5-8000-cas-latency-cl38-desktop-memory-silver-black/p/N82E16820242829" target="_blank" rel="nofollow">Kingston Fury Renegade DDR5 32GB</a><strong> </strong>|<strong> Cooler:</strong> <a data-analytics-id="inline-link" href="https://www.amazon.com/Noctua-NH-U12S-chromax-Black-Single-Tower-Cooler/dp/B07Y88BNYZ" target="_blank">Noctua NH-U12S</a><strong> </strong>|<strong> PSU:</strong> <a data-analytics-id="inline-link" href="https://www.msi.com/Power-Supply/MEG-Ai1300P-PCIE5" target="_blank" rel="nofollow">MSI MEG Ai1300P PCIE5</a><strong> </strong>|<strong> Case: </strong><a data-analytics-id="inline-link" href="https://www.msi.com/PC-Case/MPG-GUNGNIR-110R" target="_blank" rel="nofollow">MSI MPG GUNGNIR 110R</a></p></div></div><p>The most important thing any gaming deck needs to do is perform well in-game, especially at $229. Thankfully, there’s a rather juicy roster of gaming features on the Corsair Vanguard Pro 96. Most of this boils down to the switches. The Vanguard Pro 96 uses Corsair’s MGX Hyperdrive Hall Effect magnetic switches, allowing a wide array of handy features, including adjustable actuation (down to 0.1mm), dual actuations per keypress, Rapid Trigger and Last Key Prioritization SOCD (A.K.A ‘Snap Tap.’</p><h4 id="adjustable-actuation">Adjustable actuation</h4><p>Like other magnetic boards, including the <a href="https://www.tomsguide.com/computing/keyboards/keychron-q6-he-8k-review"><u>Keychron Q6 HE 8K</u></a> ($239) and the <a href="https://www.tomsguide.com/computing/peripherals/lemokey-l5-he-review"><u>Lemokey L5 HE</u></a> ($220), the Vanguard’s actuation can be reduced to just 0.1mm. At 0.1mm, you can input commands extremely fast as the switches will actuate with just a tiny movement, for highly responsive gameplay (at the risk of accidental inputs). </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JPnHAMDxKkVQFkVgCeWFqJ" name="Corsair Vanguard Pro 96 Screenshots-4" alt="A screenshot showing the Corsair Web Hub being used to modify the Corsair Vanguard Pro 96" src="https://cdn.mos.cms.futurecdn.net/JPnHAMDxKkVQFkVgCeWFqJ.jpg" mos="" align="middle" fullscreen="1" width="3200" height="1800" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/JPnHAMDxKkVQFkVgCeWFqJ.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">Here, I'm adjusting the actuation of the Vanguard Pro 96's WASD keys down to 0.3mm on the Corsair Web Hub browser app. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Corsair / Future)</span></figcaption></figure><p>Traditional mechanical switches often take up to (or over) 2.5mm before actuating — you have to press the key much further to trigger your input, making them feel much less responsive.</p><p>You can only adjust down to 0.6mm on the board itself, with 0.1mm available via the Corsair Web Hub web app. I dialed global actuation down to 0.6mm for Counter-Strike 2, lowering the WASD keys to 0.3mm for ultra responsive movement while keeping the risk of accidentally knocking other keys comparatively low (versus 0.1mm).</p><p>You can also assign dual actuation zones for the switches, meaning a single keypress can perform two actions at different points of the keypress (setting half a press to walk, a full press to run, for instance). </p><h4 id="rapid-trigger-and-lkp">Rapid trigger and LKP</h4><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="w2H6FwQnaVHESG3tXr4gnJ" name="Corsair Vanguard Pro 96 Screenshots-3" alt="A screenshot showing the Corsair Web Hub being used to modify the Corsair Vanguard Pro 96" src="https://cdn.mos.cms.futurecdn.net/w2H6FwQnaVHESG3tXr4gnJ.jpg" mos="" align="middle" fullscreen="1" width="3200" height="1800" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/w2H6FwQnaVHESG3tXr4gnJ.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">Here, I'm setting up LKP ('Flash Tap' / 'Snap Tap') on the A and D keys using the Corsair Web Hub browser app. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Corsair / Future)</span></figcaption></figure><p>Interestingly, there are two Rapid Trigger modes. Typical Rapid Trigger allows you to consistently re-trigger the same key without needing to recycle the switch fully back to its reset point (as you would have to do with mechanical switches). We see this on almost all magnetic keyboards these days, including the Vanguard Pro. However, it also features a continuous mode to keep the trigger actuating repeatedly until the key is released — kinda like holding down a key when typing to get aaaaaaaaa load of lettersssssssssss.</p><p>There’s also Last Key Prioritization, A.K.A ‘Snap Tap,’ which facilitates easy counter strafing in games with inertia-mechanic-based accuracy penalties — like Counter-Strike 2 and Valorant. It works, although it’ll get you kicked immediately from CS2.</p><h4 id="poll-rate">Poll rate</h4><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8scpbx7ySA5TN8RqDhrtpJ" name="Corsair Vanguard Pro 96 Screenshots-6" alt="A screenshot showing the Corsair Web Hub being used to modify the Corsair Vanguard Pro 96" src="https://cdn.mos.cms.futurecdn.net/8scpbx7ySA5TN8RqDhrtpJ.jpg" mos="" align="middle" fullscreen="1" width="3200" height="1800" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/8scpbx7ySA5TN8RqDhrtpJ.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">Here, I'm adjusting the Vanguard Pro 96's poll rate using the Corsair Web Hub browser app. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Corsair / Future)</span></figcaption></figure><p>The Vanguard Pro 96 polls at up to 8,000Hz, to minimize input lag as much as possible. In reality, you’d be hard pressed noticing input lag from a 1,000Hz board, and even harder pressed to tell the difference between one of 1K and 8K.</p><p>8K can become a strain on system resources, but thankfully you can adjust the Vanguard Pro’s polling between 125-8,000Hz. I just left mine at 1,000Hz and didn’t notice any input lag whatsoever.</p><p>For comparison, the <a href="https://www.tomsguide.com/gaming/peripherals/steelseries-apex-pro-review"><u>SteelSeries Apex Pro</u></a> ($199) polls at 1,000Hz, while the Keychron Q6 HE 8K and the <a href="https://www.tomsguide.com/computing/peripherals/wooting-80he-review"><u>Wooting 80HE</u></a> ($199) poll at 8K.</p><h2 id="custom-game-buttons">Custom game buttons</h2><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="jLNMHBFPqTErY699TkhYWh" name="corsair_Vanguard_Pro_96_ 7.JPG" alt="The Corsair Vanguard Pro 96 in black, on a stone surface" src="https://cdn.mos.cms.futurecdn.net/jLNMHBFPqTErY699TkhYWh.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Vanguard Pro 96 features five custom buttons down its left-hand side, allowing you to assign your most frequently-used binds and functions. You can also assign custom macros or keystrokes.</p><p>I actually found it quicker to stretch my left pinky to the fourth button than I did moving my third finger down to hit Z in Hell Let Loose, which instantly throws you prone. It’s super important to be able to hit this quickly in game, so I appreciated having the shortcut.</p><p>For even more custom game buttons, check out the <a href="https://www.tomsguide.com/computing/peripherals/nuphy-field75-he-review"><u>NuPhy Field75 HE</u></a> ($169), which has eight in total over its left and lower edges. I find the Field75 HE’s lower row particularly useful and easy to tap, as my thumb is nearby most of the time.</p><h2 id="decent-customization-options">Decent customization options</h2><p>The Vanguard Pro 96 is hot swappable, which isn’t a given with gaming brands (Corsair, Razer, etc.) as it has become with custom brands (Keychron, NuPhy etc).</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="KbMkdSvcrrFgqqcmFfjURJ" name="Corsair Vanguard Pro 96 Screenshots-1" alt="A screenshot showing the Corsair Web Hub being used to modify the Corsair Vanguard Pro 96" src="https://cdn.mos.cms.futurecdn.net/KbMkdSvcrrFgqqcmFfjURJ.jpg" mos="" align="middle" fullscreen="1" width="3200" height="1800" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/KbMkdSvcrrFgqqcmFfjURJ.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">Here, I'm changing the RGB lighting layers on the Corsair Vanguard Pro 96, using the Corsair Web Hub browser app. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Corsair / Future)</span></figcaption></figure><p>To be fair, with magnetic boards, hot-swap is of questionable benefit at the moment. Magnetic switches are highly software reliant, meaning you can’t switch to just any brand of magnetic switches right now — it’s an industry-wide limitation. But hey, having hot-swap at your disposal might come in handy down the line if things open up a little.</p><p>More important for a magnetic board is the level of software customization at your fingertips, and any companion software’s ease of use. May the gaming gods be praised: I didn’t have to use Corsair’s clunky iCue app with the Vanguard Pro, as all tweaks can be done via Corsair’s Wub Hub browser app. </p><p>The <a href="https://www.corsair.com/web-hub/index.html?srsltid=AfmBOoq7I-R63NoqA_8_ezyIDLnhvhZ_6CPrWSmnhIqJ5Dhx_xJJ3VhC"><u>Corsair Web Hub</u></a> offers lots of scope for customization, from lighting through to poll rate, actuation distance and other magnetic features. It also lets you flash firmware, which was a necessity for me, as my board was janky as hell out of the box (more on this later). It’s easy to use and doesn’t require you to install any applications. </p><p>Admittedly, the Corsair app isn’t as slick as Keychron’s Launcher or NuPhy’s nuphy.io, but hey, it does the job.</p><h2 id="pleasant-typing">Pleasant typing</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="nhonpFY6WNhCM55XMux9Xh" name="corsair_Vanguard_Pro_96_ 5.JPG" alt="The Corsair Vanguard Pro 96 in black, on a stone surface" src="https://cdn.mos.cms.futurecdn.net/nhonpFY6WNhCM55XMux9Xh.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Corsair Vanguard Pro 96 is fairly pleasant to type on. It uses OEM profile keycaps, like the Wooting 80HE and SteelSeries Apex Pro. These are better suited to gaming than serious typing, thanks to their medium-high profile, fairly small top surface area and lack of any real ergonomic rake to the profile to make hitting outer keys easier.</p><p>That said, they’re fine gaming-skewed all-rounders, which is why you’ll see them equipped on many gaming boards. I had no issue putting in a super fast time while maintaining above average accuracy.</p><div ><table><thead><tr><th class="firstcol " ><p><strong>Keyboard</strong></p></th><th  ><p><strong>Words per minute</strong></p></th><th  ><p><strong>Typing accuracy</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p>Corsair Vanguard Pro 96 (2.6mm actuation)</p></td><td  ><p>105</p></td><td  ><p>96.34%</p></td></tr><tr><td class="firstcol " ><p>Wooting 80HE (2.6mm actuation)</p></td><td  ><p>95</p></td><td  ><p>86.81%</p></td></tr><tr><td class="firstcol " ><p>Lemokey L5 HE (2.6mm actuation)</p></td><td  ><p>104</p></td><td  ><p>86.96%</p></td></tr><tr><td class="firstcol " ><p>Keychron Q16 HE 8K (2.6mm actuation)</p></td><td  ><p>99</p></td><td  ><p>91.64%</p></td></tr><tr><td class="firstcol " ><p>NuPhy Air60 HE (2.6mm actuation)</p></td><td  ><p>101</p></td><td  ><p>87.72%</p></td></tr><tr><td class="firstcol " ><p>NuPhy Air60 HE (2.6mm actuation)</p></td><td  ><p>101</p></td><td  ><p>87.72%</p></td></tr><tr><td class="firstcol " ><p>Keychron K2 HE (2.6mm actuation)</p></td><td  ><p>106</p></td><td  ><p>93.97%</p></td></tr><tr><td class="firstcol " ><p>Epomaker HE75 Mag (2.6mm actuation)</p></td><td  ><p>99</p></td><td  ><p>91.51%</p></td></tr><tr><td class="firstcol " ><p>Pete's rolling averages (all keyboards)</p></td><td  ><p>94.9</p></td><td  ><p>88.19%</p></td></tr></tbody></table></div><p>If you’re going to be typing lots, I would recommend an 8K magnetic keyboard with productivity-oriented keycaps. The NuPhy Field75 HE uses Cherry profile keycaps which are arguably the ultimate all-rounders for gaming and typing. I type a lot, so prefer a productivity-oriented keycap profile, like the Keychron’s ergonomic OSA profile, found on the Q6 HE 8K. </p><p>The MGX Hyperdrive switches are nice-enough to use, too. The moderately heavy spring tops out at 55g actuation force when the switches are set to their maximum actuation height. This results in a slightly firm, elasticky feel, which I quite like. Just like the magnetic switches found in productivity-biased boards like the <a href="https://www.tomsguide.com/computing/peripherals/keychron-k2-he-review"><u>Keychron K2 HE</u></a> ($129), the MGX Hyperdrive switches use a dual-rail design, making them feel stable in use. And, as is expected with switches these days, they come pre-lubricated for smooth operation. Nothing groundbreaking, but nothing to complain about, either.</p><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="nhonpFY6WNhCM55XMux9Xh" name="corsair_Vanguard_Pro_96_ 5.JPG" alt="The Corsair Vanguard Pro 96 in black, on a stone surface" src="https://cdn.mos.cms.futurecdn.net/nhonpFY6WNhCM55XMux9Xh.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Corsair doesn’t specify the Vanguard Pro 96’s mount type, but it’s extremely firm, so likely either a top, plate or tray mount. As such, the Vanguard Pro 96 is less springy and comfortable than a gasket mounted productivity board like the Keychron Q1 Pro. This makes sense in a gaming board with ultra-sharp 0.1mm actuation, though, where it’s best to minimize as much unnecessary movement as possible for the most responsive and accurate inputs.</p><h2 id="thoughtful-design">Thoughtful design</h2><p>The Vanguard Pro 96 is, as the name suggests, a 96% full size board, meaning it packs the functionality of a 100% full-size deck — i.e. it retains the Num pad — while shrinking the overall profile slightly by chopping a few navigation keys and bringing everything closer together. It’s still a large board, though. In game, I like my keyboard placed far out to the left, which was very tricky with the Vanguard Pro 96. That’s why I prefer 60-65% boards for gaming, like the <a href="https://www.tomsguide.com/computing/peripherals/nuphy-air60-he-tiny-profile-huge-performance"><u>NuPhy Air60 HE</u></a> ($139) and <a href="https://www.tomsguide.com/computing/peripherals/keychron-q16-he-8k-review"><u>Keychron Q16 HE 8K</u></a> ($229), or 75% decks like the Keychron K2 HE.</p><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="fzdXFjTYyVkGEAkQLyDSWh" name="corsair_Vanguard_Pro_96_.JPG" alt="The Corsair Vanguard Pro 96 in black, on a stone surface" src="https://cdn.mos.cms.futurecdn.net/fzdXFjTYyVkGEAkQLyDSWh.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>If you can’t live without a Num pad — perhaps you regularly work on spreadsheets — a 96% is about as much compromise between functionality and space as you’re gonna get. The Vanguard Pro 96 is slightly more compact than other 96% boards like the Redragon K686 Pro SE, although there’s not much in it.</p><p>The Vanguard Pro 96 comes with a spongy wrist rest that attaches magnetically to the bottom edge of the board, so they both stay together. This relieves pressure on your wrists and prevents your arms rubbing against desk edges. The board’s USB-C port is inlaid into the base of the board, with cutouts running to the edges of the case, allowing you to channel the cable towards your PC — I love this, as it helps further minimize desk footprint.</p><h2 class="article-body__section" id="section-corsair-vanguard-pro-96-review-the-downs"><span>Corsair Vanguard Pro 96 review: The downs</span></h2><p>For all its virtues, the Corsair Vanguard Pro 96 has some disappointing flaws given its high price, including frustrating controls and a bland design. You can get more for your money elsewhere, too.</p><h2 id="frustrating-controls">Frustrating controls</h2><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="Hsasm8ZWQNpWoZfhGCkdYh" name="corsair_Vanguard_Pro_96_ 2.JPG" alt="The Corsair Vanguard Pro 96 in black, on a stone surface" src="https://cdn.mos.cms.futurecdn.net/Hsasm8ZWQNpWoZfhGCkdYh.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Despite all its potential — with the LED display and companion web-app — the Vanguard Pro 96 is super frustrating to control. The screen is extremely unintuitive: despite me having switch actuation set up as a sub-menu, I simply couldn’t navigate to it on the display. Eventually, I set it up as the only sub-menu (given everything else I could control via the Fn row anyway), where it was, by default, easy to access.</p><p>The board seems often at odds with the companion software, though. In testing, for example, the web app showed 0.6mm actuation, while the board itself showed 1.0mm. </p><p>My keyboard was also incredibly janky out of the box, triggering duplicate inputs and sometimes missing them altogether. I flashed the keyboard’s firmware via the web app, and these problems disappeared, but it’s disappointing to see them in the first place from a brand as big (and expensive) as Corsair.</p><h2 id="bland-gamer-aesthetic">Bland "gamer" aesthetic</h2><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="3AppxndpeuJLctScL98BWh" name="corsair_Vanguard_Pro_96_ 4.JPG" alt="The Corsair Vanguard Pro 96 in black, on a stone surface" src="https://cdn.mos.cms.futurecdn.net/3AppxndpeuJLctScL98BWh.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Obviously this is a subjective take, as beauty lies in the eyes of the beholder. But I find the Vanguard Pro 96’s design so boring. Stock “gamer” styling, with the raised switches/keycaps, blacked-out everything, OEM caps etc., etc.</p><p>If you’re a 14-year-old with a full unicorn-puke-RGB gaming rig and run-of-the-mill “gamer” style peripherals, I’m sure it’ll fit right in on your desk. If you’d like something a little more adult, check out the Keychron Q6 HE 8K or Wooting 80HE. And if you’d like something a little more fun and colorful, check out the NuPhy Field75 HE or Air60 HE.</p><h2 id="more-for-your-money-elsewhere">More for your money elsewhere</h2><p>All those boards I just mentioned above bring me to my final criticism of the Vanguard Pro 96: you can get <em>so</em> much more for similar or less money with rivals. This isn’t a bad keyboard, but it’s nothing special. It isn’t doing anything new, and it looks bland. Why spend nearly $230 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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RhvK8cyvyikGoLZsEQVk7h" name="corsair_Vanguard_Pro_96_ 8.JPG" alt="The Corsair Vanguard Pro 96 in black, on a stone surface" src="https://cdn.mos.cms.futurecdn.net/RhvK8cyvyikGoLZsEQVk7h.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>You’ll get more performance and gaming features from the Wooting 80HE and Keychron Q6 HE 8K — think more magnetic features, like quad actuation zones and customizable SOCD resolutions, to name but two — both of which cost a similar amount of money as the Vanguard Pro. The Wooting obviously lacks a Num pad, but the Q6 has you covered there, if you can accept a full 100% layout. Not only do they both offer more features than the Corsair, they’re better built, better looking, and nicer to type on. They both justify a circa-$200 price tag much more easily than the Vanguard Pro 96.</p><p>If it’s just features you’re after and you don’t care about layout, you can pick up a Hall Effect board for under $60, like the <a href="https://www.tomsguide.com/computing/peripherals/epomaker-he68-hall-effect-keyboard-review"><u>Epomaker HE68</u></a> ($59). All this begs the question: why would you drop $229 on the Vanguard Pro 96? </p><h2 class="article-body__section" id="section-corsair-vanguard-pro-96-review-verdict"><span>Corsair Vanguard Pro 96 review: Verdict</span></h2><p>I think I pretty well summed this up already in the paragraph above, but I’ll rehash it here for good measure in case anyone has skipped right here. The Corsair Vanguard Pro 96 isn’t a bad board, but it does nothing new, and nothing particularly well. </p><p>It packs a decent array of gaming features, high(ish) levels of customization and bundles some thoughtful design features. It’s alright to type on, too. And sure, those things are all well and good.</p><p>But this keyboard is simply way overpriced. You can get much more for the same money, and get similar performance for cheaper. So why is the Vanguard Pro 96 priced at $229? It’s the Corsair name, of course, which in the keyboard market holds much more prestige than it deserves.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/corsair-vanguard-pro-96-review</link>
                                                                            <description>
                            <![CDATA[ The Corsair Vanguard Pro 96 is a premium gaming keyboard with a smattering of today’s must-have gaming features, but you can get more for your money elsewhere. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">9ooVFE6hvduJXL3Z36E8X3</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/fzdXFjTYyVkGEAkQLyDSWh-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 27 Mar 2026 09:58:15 +0000</pubDate>                                                                                                                                <updated>Tue, 09 Jun 2026 10:32:26 +0000</updated>
                                                                                                                                            <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Keyboards]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                                                                <author><![CDATA[ peter.wolinski@futurenet.com (Peter Wolinski) ]]></author>                    <dc:creator><![CDATA[ Peter Wolinski ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/stgPfXWY7ukw8J8rfC7vjg.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Peter is a Senior Editor at Tom&#039;s Guide, heading up the site&#039;s Reviews team and Cameras section. Having built gaming PCs since he was 10 (that&#039;s a while ago now) he&#039;s a bit of a nerd about components and hardware. He&#039;s also been an iPhone user since the classic iPhone 4, and a Mac user for well over a decade. Experienced in using and testing all kinds of technology — from phones through to tablets, computers, games consoles, cameras and smart home tech — helping people find the best tech for them (at the best prices) is what Peter does best. A photographer since he bought his first camera (a Fujifilm) in 2015, Peter was previously an Editor for Canon-Europe.com. He then edited the Cameras and How To sections of Tom&#039;s Guide. When he&#039;s not crafting helpful, in-depth reviews, Peter can usually be found out and about honing his architectural photography skills, riding his motorcycle around Welsh mountain roads, telling everyone about his two greyhounds, squeezing a few extra FPS out of PC games or perfecting his espresso shots.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/fzdXFjTYyVkGEAkQLyDSWh-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Corsair Vanguard Pro 96 in black, on a stone surface]]></media:description>                                                            <media:text><![CDATA[The Corsair Vanguard Pro 96 in black, on a stone surface]]></media:text>
                                <media:title type="plain"><![CDATA[The Corsair Vanguard Pro 96 in black, on a stone surface]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/fzdXFjTYyVkGEAkQLyDSWh-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Corsair Vanguard Pro 96 is a premium gaming keyboard from legendary gaming hardware manufacturer Corsair. It boasts a roster of today’s must-have gaming features — the two most notable being magnetic switches (and all their associated goodies, like adjustable actuation and Rapid Trigger) and 8K polling.</p><p>The Vanguard Pro has a number of virtues. It has the aforementioned gaming features under its belt, plus an LED screen for on-the-fly adjustments, custom assignable game buttons and easy-to-use companion software. It types nicely for a gaming board, is built fairly well, and comes with a magnetically attaching wrist rest.</p><p>There are some major frustrations, though. For all the potential the LED screen has, it’s cumbersome and frustrating in practice. It isn’t particularly pretty, and I can’t see much justification for the whopping $220, save the big-brand name (which usually doesn’t count for much in the keyboard world).</p><p>So, is it one of the <a href="https://www.tomsguide.com/best-picks/best-gaming-keyboard"><u>best gaming keyboards</u></a> you can buy? Find out in my full Corsair Vanguard Pro 96 review.</p><h2 class="article-body__section" id="section-corsair-vanguard-pro-96-review-cheat-sheet"><span>Corsair Vanguard Pro 96 review: Cheat sheet</span></h2><ul><li><strong>What is it?</strong> A 96% Hall Effect gaming keyboard from industry giant, Corsair</li><li><strong>Who is it for? </strong>Gamers who want a traditional-looking gaming deck with modern features</li><li><strong>What does it cost?</strong> <a href="https://www.amazon.com/Corsair-Vanguard-Magnetic-Mechanical-Keyboard-PC/dp/B0FKHPRZ45" target="_blank" rel="nofollow">$229</a> / <a href="https://www.amazon.co.uk/Corsair-VANGUARD-Magnetic-Mechanical-Keyboard/dp/B0FMF9T8RM" target="_blank" rel="nofollow">£209</a></li><li><strong>What's good? </strong>It offers a decent amount of gaming performance and customization, and comes with a premium wrist rest</li><li><strong>What's not?</strong> You can get more features for similar or less money, and the onboard controls are frustrating</li></ul><h2 class="article-body__section" id="section-corsair-vanguard-pro-96-review-specs"><span>Corsair Vanguard Pro 96 review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/Corsair-Vanguard-Magnetic-Mechanical-Keyboard-PC/dp/B0FKHPRZ45" target="_blank" rel="nofollow"><u>$229</u></a> /<a href="https://www.amazon.co.uk/Corsair-VANGUARD-Magnetic-Mechanical-Keyboard/dp/B0FMF9T8RM" target="_blank" rel="nofollow"> <u>£209</u></a></p></td></tr><tr><td class="firstcol " ><p><strong>Switches</strong></p></td><td  ><p>Corsair MGX Hyperdrive V2 Hall Effect</p></td></tr><tr><td class="firstcol " ><p><strong>Keycaps</strong></p></td><td  ><p>PBT</p></td></tr><tr><td class="firstcol " ><p><strong>Construction</strong></p></td><td  ><p>Aluminum</p></td></tr><tr><td class="firstcol " ><p><strong>Layout</strong></p></td><td  ><p>96%</p></td></tr><tr><td class="firstcol " ><p><strong>Operating system</strong></p></td><td  ><p>Windows, macOS Linux</p></td></tr><tr><td class="firstcol " ><p><strong>Backlighting</strong></p></td><td  ><p>Per-key RGB and Mix RGB</p></td></tr><tr><td class="firstcol " ><p><strong>Polling rate</strong></p></td><td  ><p>8,000Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Wired</p></td></tr><tr><td class="firstcol " ><p><strong>Measurements</strong></p></td><td  ><p>15.28 x 5.55 x 1.69 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>2.41lbs</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Black</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-corsair-vanguard-pro-96-review-the-ups"><span>Corsair Vanguard Pro 96 review: The ups</span></h2><p>The Corsair Vanguard Pro 96 has some attractive features, including its magnetic gaming features, typing experience and thoughtful design elements.</p><h2 id="gaming-performance">Gaming performance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ioMTMifHVzifBFERRzeUYh" name="corsair_Vanguard_Pro_96_ 6.JPG" alt="The Corsair Vanguard Pro 96 in black, on a stone surface" src="https://cdn.mos.cms.futurecdn.net/ioMTMifHVzifBFERRzeUYh.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><div  class="fancy-box"><div class="fancy_box-title">Tom's Guide reviews gaming platform</div><div class="fancy_box_body"><p class="fancy-box__body-text"><strong>Supplied by: </strong><a data-analytics-id="inline-link" href="https://www.msi.com/" target="_blank" rel="nofollow"><strong>MSI</strong></a><strong> | Tom's Guide</strong><br><strong></strong><br><strong>CPU:</strong> <a data-analytics-id="inline-link" href="https://www.amazon.com/AMD-7700X-16-Thread-Unlocked-Processor/dp/B0BBHHT8LY/" target="_blank" rel="nofollow">AMD Ryzen 7 7700X</a><strong> </strong>|<strong> Graphics card:</strong> <a data-analytics-id="inline-link" href="https://www.msi.com/Graphics-Card/GeForce-RTX-5070-Ti-16G-VANGUARD-SOC" target="_blank" rel="nofollow">MSI RTX 5070 Ti 16GB Vanguard SOC</a><strong> </strong>|<strong> Motherboard: </strong><a data-analytics-id="inline-link" href="https://www.msi.com/Motherboard/B850-GAMING-PLUS-WIFI" target="_blank" rel="nofollow">MSI B850E Gaming Plus WiFi</a><strong> </strong>|<strong> RAM: </strong><a data-analytics-id="inline-link" href="https://www.newegg.com/kingston-technology-corp-fury-renegade-32gb-ddr5-8000-cas-latency-cl38-desktop-memory-silver-black/p/N82E16820242829" target="_blank" rel="nofollow">Kingston Fury Renegade DDR5 32GB</a><strong> </strong>|<strong> Cooler:</strong> <a data-analytics-id="inline-link" href="https://www.amazon.com/Noctua-NH-U12S-chromax-Black-Single-Tower-Cooler/dp/B07Y88BNYZ" target="_blank">Noctua NH-U12S</a><strong> </strong>|<strong> PSU:</strong> <a data-analytics-id="inline-link" href="https://www.msi.com/Power-Supply/MEG-Ai1300P-PCIE5" target="_blank" rel="nofollow">MSI MEG Ai1300P PCIE5</a><strong> </strong>|<strong> Case: </strong><a data-analytics-id="inline-link" href="https://www.msi.com/PC-Case/MPG-GUNGNIR-110R" target="_blank" rel="nofollow">MSI MPG GUNGNIR 110R</a></p></div></div><p>The most important thing any gaming deck needs to do is perform well in-game, especially at $229. Thankfully, there’s a rather juicy roster of gaming features on the Corsair Vanguard Pro 96. Most of this boils down to the switches. The Vanguard Pro 96 uses Corsair’s MGX Hyperdrive Hall Effect magnetic switches, allowing a wide array of handy features, including adjustable actuation (down to 0.1mm), dual actuations per keypress, Rapid Trigger and Last Key Prioritization SOCD (A.K.A ‘Snap Tap.’</p><h4 id="adjustable-actuation">Adjustable actuation</h4><p>Like other magnetic boards, including the <a href="https://www.tomsguide.com/computing/keyboards/keychron-q6-he-8k-review"><u>Keychron Q6 HE 8K</u></a> ($239) and the <a href="https://www.tomsguide.com/computing/peripherals/lemokey-l5-he-review"><u>Lemokey L5 HE</u></a> ($220), the Vanguard’s actuation can be reduced to just 0.1mm. At 0.1mm, you can input commands extremely fast as the switches will actuate with just a tiny movement, for highly responsive gameplay (at the risk of accidental inputs). </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JPnHAMDxKkVQFkVgCeWFqJ" name="Corsair Vanguard Pro 96 Screenshots-4" alt="A screenshot showing the Corsair Web Hub being used to modify the Corsair Vanguard Pro 96" src="https://cdn.mos.cms.futurecdn.net/JPnHAMDxKkVQFkVgCeWFqJ.jpg" mos="" align="middle" fullscreen="1" width="3200" height="1800" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/JPnHAMDxKkVQFkVgCeWFqJ.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">Here, I'm adjusting the actuation of the Vanguard Pro 96's WASD keys down to 0.3mm on the Corsair Web Hub browser app. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Corsair / Future)</span></figcaption></figure><p>Traditional mechanical switches often take up to (or over) 2.5mm before actuating — you have to press the key much further to trigger your input, making them feel much less responsive.</p><p>You can only adjust down to 0.6mm on the board itself, with 0.1mm available via the Corsair Web Hub web app. I dialed global actuation down to 0.6mm for Counter-Strike 2, lowering the WASD keys to 0.3mm for ultra responsive movement while keeping the risk of accidentally knocking other keys comparatively low (versus 0.1mm).</p><p>You can also assign dual actuation zones for the switches, meaning a single keypress can perform two actions at different points of the keypress (setting half a press to walk, a full press to run, for instance). </p><h4 id="rapid-trigger-and-lkp">Rapid trigger and LKP</h4><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="w2H6FwQnaVHESG3tXr4gnJ" name="Corsair Vanguard Pro 96 Screenshots-3" alt="A screenshot showing the Corsair Web Hub being used to modify the Corsair Vanguard Pro 96" src="https://cdn.mos.cms.futurecdn.net/w2H6FwQnaVHESG3tXr4gnJ.jpg" mos="" align="middle" fullscreen="1" width="3200" height="1800" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/w2H6FwQnaVHESG3tXr4gnJ.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">Here, I'm setting up LKP ('Flash Tap' / 'Snap Tap') on the A and D keys using the Corsair Web Hub browser app. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Corsair / Future)</span></figcaption></figure><p>Interestingly, there are two Rapid Trigger modes. Typical Rapid Trigger allows you to consistently re-trigger the same key without needing to recycle the switch fully back to its reset point (as you would have to do with mechanical switches). We see this on almost all magnetic keyboards these days, including the Vanguard Pro. However, it also features a continuous mode to keep the trigger actuating repeatedly until the key is released — kinda like holding down a key when typing to get aaaaaaaaa load of lettersssssssssss.</p><p>There’s also Last Key Prioritization, A.K.A ‘Snap Tap,’ which facilitates easy counter strafing in games with inertia-mechanic-based accuracy penalties — like Counter-Strike 2 and Valorant. It works, although it’ll get you kicked immediately from CS2.</p><h4 id="poll-rate">Poll rate</h4><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8scpbx7ySA5TN8RqDhrtpJ" name="Corsair Vanguard Pro 96 Screenshots-6" alt="A screenshot showing the Corsair Web Hub being used to modify the Corsair Vanguard Pro 96" src="https://cdn.mos.cms.futurecdn.net/8scpbx7ySA5TN8RqDhrtpJ.jpg" mos="" align="middle" fullscreen="1" width="3200" height="1800" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/8scpbx7ySA5TN8RqDhrtpJ.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">Here, I'm adjusting the Vanguard Pro 96's poll rate using the Corsair Web Hub browser app. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Corsair / Future)</span></figcaption></figure><p>The Vanguard Pro 96 polls at up to 8,000Hz, to minimize input lag as much as possible. In reality, you’d be hard pressed noticing input lag from a 1,000Hz board, and even harder pressed to tell the difference between one of 1K and 8K.</p><p>8K can become a strain on system resources, but thankfully you can adjust the Vanguard Pro’s polling between 125-8,000Hz. I just left mine at 1,000Hz and didn’t notice any input lag whatsoever.</p><p>For comparison, the <a href="https://www.tomsguide.com/gaming/peripherals/steelseries-apex-pro-review"><u>SteelSeries Apex Pro</u></a> ($199) polls at 1,000Hz, while the Keychron Q6 HE 8K and the <a href="https://www.tomsguide.com/computing/peripherals/wooting-80he-review"><u>Wooting 80HE</u></a> ($199) poll at 8K.</p><h2 id="custom-game-buttons">Custom game buttons</h2><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="jLNMHBFPqTErY699TkhYWh" name="corsair_Vanguard_Pro_96_ 7.JPG" alt="The Corsair Vanguard Pro 96 in black, on a stone surface" src="https://cdn.mos.cms.futurecdn.net/jLNMHBFPqTErY699TkhYWh.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Vanguard Pro 96 features five custom buttons down its left-hand side, allowing you to assign your most frequently-used binds and functions. You can also assign custom macros or keystrokes.</p><p>I actually found it quicker to stretch my left pinky to the fourth button than I did moving my third finger down to hit Z in Hell Let Loose, which instantly throws you prone. It’s super important to be able to hit this quickly in game, so I appreciated having the shortcut.</p><p>For even more custom game buttons, check out the <a href="https://www.tomsguide.com/computing/peripherals/nuphy-field75-he-review"><u>NuPhy Field75 HE</u></a> ($169), which has eight in total over its left and lower edges. I find the Field75 HE’s lower row particularly useful and easy to tap, as my thumb is nearby most of the time.</p><h2 id="decent-customization-options">Decent customization options</h2><p>The Vanguard Pro 96 is hot swappable, which isn’t a given with gaming brands (Corsair, Razer, etc.) as it has become with custom brands (Keychron, NuPhy etc).</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="KbMkdSvcrrFgqqcmFfjURJ" name="Corsair Vanguard Pro 96 Screenshots-1" alt="A screenshot showing the Corsair Web Hub being used to modify the Corsair Vanguard Pro 96" src="https://cdn.mos.cms.futurecdn.net/KbMkdSvcrrFgqqcmFfjURJ.jpg" mos="" align="middle" fullscreen="1" width="3200" height="1800" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/KbMkdSvcrrFgqqcmFfjURJ.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">Here, I'm changing the RGB lighting layers on the Corsair Vanguard Pro 96, using the Corsair Web Hub browser app. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Corsair / Future)</span></figcaption></figure><p>To be fair, with magnetic boards, hot-swap is of questionable benefit at the moment. Magnetic switches are highly software reliant, meaning you can’t switch to just any brand of magnetic switches right now — it’s an industry-wide limitation. But hey, having hot-swap at your disposal might come in handy down the line if things open up a little.</p><p>More important for a magnetic board is the level of software customization at your fingertips, and any companion software’s ease of use. May the gaming gods be praised: I didn’t have to use Corsair’s clunky iCue app with the Vanguard Pro, as all tweaks can be done via Corsair’s Wub Hub browser app. </p><p>The <a href="https://www.corsair.com/web-hub/index.html?srsltid=AfmBOoq7I-R63NoqA_8_ezyIDLnhvhZ_6CPrWSmnhIqJ5Dhx_xJJ3VhC"><u>Corsair Web Hub</u></a> offers lots of scope for customization, from lighting through to poll rate, actuation distance and other magnetic features. It also lets you flash firmware, which was a necessity for me, as my board was janky as hell out of the box (more on this later). It’s easy to use and doesn’t require you to install any applications. </p><p>Admittedly, the Corsair app isn’t as slick as Keychron’s Launcher or NuPhy’s nuphy.io, but hey, it does the job.</p><h2 id="pleasant-typing">Pleasant typing</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="nhonpFY6WNhCM55XMux9Xh" name="corsair_Vanguard_Pro_96_ 5.JPG" alt="The Corsair Vanguard Pro 96 in black, on a stone surface" src="https://cdn.mos.cms.futurecdn.net/nhonpFY6WNhCM55XMux9Xh.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Corsair Vanguard Pro 96 is fairly pleasant to type on. It uses OEM profile keycaps, like the Wooting 80HE and SteelSeries Apex Pro. These are better suited to gaming than serious typing, thanks to their medium-high profile, fairly small top surface area and lack of any real ergonomic rake to the profile to make hitting outer keys easier.</p><p>That said, they’re fine gaming-skewed all-rounders, which is why you’ll see them equipped on many gaming boards. I had no issue putting in a super fast time while maintaining above average accuracy.</p><div ><table><thead><tr><th class="firstcol " ><p><strong>Keyboard</strong></p></th><th  ><p><strong>Words per minute</strong></p></th><th  ><p><strong>Typing accuracy</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p>Corsair Vanguard Pro 96 (2.6mm actuation)</p></td><td  ><p>105</p></td><td  ><p>96.34%</p></td></tr><tr><td class="firstcol " ><p>Wooting 80HE (2.6mm actuation)</p></td><td  ><p>95</p></td><td  ><p>86.81%</p></td></tr><tr><td class="firstcol " ><p>Lemokey L5 HE (2.6mm actuation)</p></td><td  ><p>104</p></td><td  ><p>86.96%</p></td></tr><tr><td class="firstcol " ><p>Keychron Q16 HE 8K (2.6mm actuation)</p></td><td  ><p>99</p></td><td  ><p>91.64%</p></td></tr><tr><td class="firstcol " ><p>NuPhy Air60 HE (2.6mm actuation)</p></td><td  ><p>101</p></td><td  ><p>87.72%</p></td></tr><tr><td class="firstcol " ><p>NuPhy Air60 HE (2.6mm actuation)</p></td><td  ><p>101</p></td><td  ><p>87.72%</p></td></tr><tr><td class="firstcol " ><p>Keychron K2 HE (2.6mm actuation)</p></td><td  ><p>106</p></td><td  ><p>93.97%</p></td></tr><tr><td class="firstcol " ><p>Epomaker HE75 Mag (2.6mm actuation)</p></td><td  ><p>99</p></td><td  ><p>91.51%</p></td></tr><tr><td class="firstcol " ><p>Pete's rolling averages (all keyboards)</p></td><td  ><p>94.9</p></td><td  ><p>88.19%</p></td></tr></tbody></table></div><p>If you’re going to be typing lots, I would recommend an 8K magnetic keyboard with productivity-oriented keycaps. The NuPhy Field75 HE uses Cherry profile keycaps which are arguably the ultimate all-rounders for gaming and typing. I type a lot, so prefer a productivity-oriented keycap profile, like the Keychron’s ergonomic OSA profile, found on the Q6 HE 8K. </p><p>The MGX Hyperdrive switches are nice-enough to use, too. The moderately heavy spring tops out at 55g actuation force when the switches are set to their maximum actuation height. This results in a slightly firm, elasticky feel, which I quite like. Just like the magnetic switches found in productivity-biased boards like the <a href="https://www.tomsguide.com/computing/peripherals/keychron-k2-he-review"><u>Keychron K2 HE</u></a> ($129), the MGX Hyperdrive switches use a dual-rail design, making them feel stable in use. And, as is expected with switches these days, they come pre-lubricated for smooth operation. Nothing groundbreaking, but nothing to complain about, either.</p><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="nhonpFY6WNhCM55XMux9Xh" name="corsair_Vanguard_Pro_96_ 5.JPG" alt="The Corsair Vanguard Pro 96 in black, on a stone surface" src="https://cdn.mos.cms.futurecdn.net/nhonpFY6WNhCM55XMux9Xh.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Corsair doesn’t specify the Vanguard Pro 96’s mount type, but it’s extremely firm, so likely either a top, plate or tray mount. As such, the Vanguard Pro 96 is less springy and comfortable than a gasket mounted productivity board like the Keychron Q1 Pro. This makes sense in a gaming board with ultra-sharp 0.1mm actuation, though, where it’s best to minimize as much unnecessary movement as possible for the most responsive and accurate inputs.</p><h2 id="thoughtful-design">Thoughtful design</h2><p>The Vanguard Pro 96 is, as the name suggests, a 96% full size board, meaning it packs the functionality of a 100% full-size deck — i.e. it retains the Num pad — while shrinking the overall profile slightly by chopping a few navigation keys and bringing everything closer together. It’s still a large board, though. In game, I like my keyboard placed far out to the left, which was very tricky with the Vanguard Pro 96. That’s why I prefer 60-65% boards for gaming, like the <a href="https://www.tomsguide.com/computing/peripherals/nuphy-air60-he-tiny-profile-huge-performance"><u>NuPhy Air60 HE</u></a> ($139) and <a href="https://www.tomsguide.com/computing/peripherals/keychron-q16-he-8k-review"><u>Keychron Q16 HE 8K</u></a> ($229), or 75% decks like the Keychron K2 HE.</p><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="fzdXFjTYyVkGEAkQLyDSWh" name="corsair_Vanguard_Pro_96_.JPG" alt="The Corsair Vanguard Pro 96 in black, on a stone surface" src="https://cdn.mos.cms.futurecdn.net/fzdXFjTYyVkGEAkQLyDSWh.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>If you can’t live without a Num pad — perhaps you regularly work on spreadsheets — a 96% is about as much compromise between functionality and space as you’re gonna get. The Vanguard Pro 96 is slightly more compact than other 96% boards like the Redragon K686 Pro SE, although there’s not much in it.</p><p>The Vanguard Pro 96 comes with a spongy wrist rest that attaches magnetically to the bottom edge of the board, so they both stay together. This relieves pressure on your wrists and prevents your arms rubbing against desk edges. The board’s USB-C port is inlaid into the base of the board, with cutouts running to the edges of the case, allowing you to channel the cable towards your PC — I love this, as it helps further minimize desk footprint.</p><h2 class="article-body__section" id="section-corsair-vanguard-pro-96-review-the-downs"><span>Corsair Vanguard Pro 96 review: The downs</span></h2><p>For all its virtues, the Corsair Vanguard Pro 96 has some disappointing flaws given its high price, including frustrating controls and a bland design. You can get more for your money elsewhere, too.</p><h2 id="frustrating-controls">Frustrating controls</h2><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="Hsasm8ZWQNpWoZfhGCkdYh" name="corsair_Vanguard_Pro_96_ 2.JPG" alt="The Corsair Vanguard Pro 96 in black, on a stone surface" src="https://cdn.mos.cms.futurecdn.net/Hsasm8ZWQNpWoZfhGCkdYh.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Despite all its potential — with the LED display and companion web-app — the Vanguard Pro 96 is super frustrating to control. The screen is extremely unintuitive: despite me having switch actuation set up as a sub-menu, I simply couldn’t navigate to it on the display. Eventually, I set it up as the only sub-menu (given everything else I could control via the Fn row anyway), where it was, by default, easy to access.</p><p>The board seems often at odds with the companion software, though. In testing, for example, the web app showed 0.6mm actuation, while the board itself showed 1.0mm. </p><p>My keyboard was also incredibly janky out of the box, triggering duplicate inputs and sometimes missing them altogether. I flashed the keyboard’s firmware via the web app, and these problems disappeared, but it’s disappointing to see them in the first place from a brand as big (and expensive) as Corsair.</p><h2 id="bland-gamer-aesthetic">Bland "gamer" aesthetic</h2><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="3AppxndpeuJLctScL98BWh" name="corsair_Vanguard_Pro_96_ 4.JPG" alt="The Corsair Vanguard Pro 96 in black, on a stone surface" src="https://cdn.mos.cms.futurecdn.net/3AppxndpeuJLctScL98BWh.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Obviously this is a subjective take, as beauty lies in the eyes of the beholder. But I find the Vanguard Pro 96’s design so boring. Stock “gamer” styling, with the raised switches/keycaps, blacked-out everything, OEM caps etc., etc.</p><p>If you’re a 14-year-old with a full unicorn-puke-RGB gaming rig and run-of-the-mill “gamer” style peripherals, I’m sure it’ll fit right in on your desk. If you’d like something a little more adult, check out the Keychron Q6 HE 8K or Wooting 80HE. And if you’d like something a little more fun and colorful, check out the NuPhy Field75 HE or Air60 HE.</p><h2 id="more-for-your-money-elsewhere">More for your money elsewhere</h2><p>All those boards I just mentioned above bring me to my final criticism of the Vanguard Pro 96: you can get <em>so</em> much more for similar or less money with rivals. This isn’t a bad keyboard, but it’s nothing special. It isn’t doing anything new, and it looks bland. Why spend nearly $230 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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RhvK8cyvyikGoLZsEQVk7h" name="corsair_Vanguard_Pro_96_ 8.JPG" alt="The Corsair Vanguard Pro 96 in black, on a stone surface" src="https://cdn.mos.cms.futurecdn.net/RhvK8cyvyikGoLZsEQVk7h.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>You’ll get more performance and gaming features from the Wooting 80HE and Keychron Q6 HE 8K — think more magnetic features, like quad actuation zones and customizable SOCD resolutions, to name but two — both of which cost a similar amount of money as the Vanguard Pro. The Wooting obviously lacks a Num pad, but the Q6 has you covered there, if you can accept a full 100% layout. Not only do they both offer more features than the Corsair, they’re better built, better looking, and nicer to type on. They both justify a circa-$200 price tag much more easily than the Vanguard Pro 96.</p><p>If it’s just features you’re after and you don’t care about layout, you can pick up a Hall Effect board for under $60, like the <a href="https://www.tomsguide.com/computing/peripherals/epomaker-he68-hall-effect-keyboard-review"><u>Epomaker HE68</u></a> ($59). All this begs the question: why would you drop $229 on the Vanguard Pro 96? </p><h2 class="article-body__section" id="section-corsair-vanguard-pro-96-review-verdict"><span>Corsair Vanguard Pro 96 review: Verdict</span></h2><p>I think I pretty well summed this up already in the paragraph above, but I’ll rehash it here for good measure in case anyone has skipped right here. The Corsair Vanguard Pro 96 isn’t a bad board, but it does nothing new, and nothing particularly well. </p><p>It packs a decent array of gaming features, high(ish) levels of customization and bundles some thoughtful design features. It’s alright to type on, too. And sure, those things are all well and good.</p><p>But this keyboard is simply way overpriced. You can get much more for the same money, and get similar performance for cheaper. So why is the Vanguard Pro 96 priced at $229? It’s the Corsair name, of course, which in the keyboard market holds much more prestige than it deserves.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I’m calling it: these are the 18 best gaming peripheral deals in Amazon’s Big Smile Sale today ]]></title>
                                                                                                <dc:content><![CDATA[ <p>As an avid gamer, I'm always on the lookout for some gaming peripheral deals that will help me upgrade my setup. Thankfully, there are some great discounts currently available as part of <a href="https://www.tomsguide.com/live/news/amazon-big-smile-sale-2026" target="_blank">Amazon's Big Smile Sale</a>, and I've rounded up the 18 deals I think are worth your time.</p><p>I've spotted some excellent price reductions on gaming keyboards, mice, controllers and headsets, with brands like Logitech, Razer, Corsair and more all present and accounted for.</p><p>Of the options below, I'm particularly partial to the Epomaker X Aula F75 Gasket Mechanical Keyboard with 75% layout, partly due to the option of LEOBOG Reaper switches, which are linear and offer a light press force between 36 grams and 55 grams.</p><p>I'm also very tempted by the Logitech G502X Plus wireless gaming mouse, thanks to the option of infinite scroll, which I now consider a must-have feature for all mice going forward.</p><p>I've also added the 8BitDo 64 Bluetooth controller to my cart. I've had my eye on it ever since it launched alongside the Analogue 3D console, and now that it's available in the classic Nintendo 64-inspired 'Grey' colourway, I can no longer resist.</p><p>And finally, I do believe the deal on Razer's Barracuda X Chroma Wireless Gaming Headset is excellent value, slashing a massive 49% off the RRP. I especially like its translucent green design and support for both 2.4gHz wireless and Bluetooth.</p>        <div class="featured_product_block featured_block_hero" data-id="7ed4b1fd-5847-4e3b-bb88-1281eb71decc">            <a href="https://www.amazon.com.au/CORSAIR-Mechanical-Gaming-Keyboard-Switches/dp/B09NCMHTSB" data-model-name="K70 RGB Pro Wired Mechanical Gaming Keyboard" 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/yTfBfiZ4t7ZcYv4nkQDegH.jpg" alt="Corsair, K70 RGB Pro Wired Mechanical Gaming Keyboard"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Corsair</div>                                        <div class="featured__title">K70 RGB Pro Wired Mechanical Gaming Keyboard</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="d63372f9-fb4a-45d9-a686-68fe03521b30">            <a href="https://www.amazon.com.au/EPOMAKER-F75-Mechanical-Swappable-Five-Layer/dp/B0D3F69XSP" data-model-name="X Aula F75 Gasket Mechanical Keyboard (75% layout)" 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/85PB6oGWYYJvXALtWSSbYL.jpg" alt="Epomaker, X Aula F75 Gasket Mechanical Keyboard (75% layout)"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Epomaker</div>                                        <div class="featured__title">X Aula F75 Gasket Mechanical Keyboard (75% layout)</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="bd160c69-4797-4a2d-add6-533afe1ca94a">            <a href="https://www.amazon.com.au/ASUS-ROG-II-96-Mechanical/dp/B0CCX99FFW" data-model-name="ROG Strix Scope II 96 Wireless Mechanical Gaming Keyboard" 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/ygkHGzbyLqu47cFxSKMGpM.jpg" alt="Asus, ROG Strix Scope II 96 Wireless Mechanical Gaming Keyboard"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Asus</div>                                        <div class="featured__title">ROG Strix Scope II 96 Wireless Mechanical Gaming Keyboard</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="1ec5a92e-4708-4fdd-a407-7f4c1b7d4f3f">            <a href="https://www.amazon.com.au/Logitech-Lightspeed-Wireless-Gaming-Mouse/dp/B08KQ7WX5B" data-model-name="G305 Lightspeed Wireless Gaming Mouse, White" 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/4gJEkf4KWFrHSGq3eXQdRP.jpg" alt="Logitech, G305 Lightspeed Wireless Gaming Mouse, White"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Logitech</div>                                        <div class="featured__title">G305 Lightspeed Wireless Gaming Mouse, White</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="466fbfd3-beff-4553-9fd9-0a87f33c31b4">            <a href="https://www.amazon.com.au/Logitech-Lightspeed-Wireless-Gaming-Mouse/dp/B0BCJS25XM" data-model-name="G502X Plus Wireless Gaming Mouse, White" 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/fxGSa6fJRgyDLMeXR2n3bQ.jpg" alt="Logitech, G502X Plus Wireless Gaming Mouse, White"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Logitech</div>                                        <div class="featured__title">G502X Plus Wireless Gaming Mouse, White</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="0a479811-5082-4acb-bd51-b6b1c26a0137">            <a href="https://www.amazon.com.au/CORSAIR-IRONCLAW-Wireless-Gaming-Mouse/dp/B0G3QF1GGW" data-model-name="Ironclaw Wireless SE Gaming Mouse" 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/Xh2nFKDQ2p2n3La7FAkFnS.jpg" alt="Corsair, Ironclaw Wireless SE Gaming Mouse"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Corsair</div>                                        <div class="featured__title">Ironclaw Wireless SE Gaming Mouse</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="73b9806d-ff4e-488c-8544-74180a4a4741">            <a href="https://www.amazon.com.au/Razer-HyperSpeed-Wireless-Esports-Gaming/dp/B0CBCPB2T1" data-model-name="Viper V3 Hyperspeed Wireless Esports Gaming Mouse" 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/Sb3GnY7fYW8RwLtGjVa2WU.jpg" alt="Razer, Viper V3 Hyperspeed Wireless Esports Gaming Mouse"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Razer</div>                                        <div class="featured__title">Viper V3 Hyperspeed Wireless Esports Gaming Mouse</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="0e39359a-97e7-46f6-869e-875addea484a">            <a href="https://www.amazon.com.au/CORSAIR-SCIMITAR-ELITE-Wired-Gaming/dp/B08466VFT2" data-model-name="Scimitar RGB Elite Wired MOBA/MMO Gaming Mouse" 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/KNtT734K6TYkUPearVNdyV.jpg" alt="Corsair, Scimitar RGB Elite Wired MOBA/MMO Gaming Mouse"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Corsair</div>                                        <div class="featured__title">Scimitar RGB Elite Wired MOBA/MMO Gaming Mouse</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="4ac6fe12-b1d4-48ef-850c-12fab27fc24e">            <a href="https://www.amazon.com.au/Razer-Basilisk-35K-Customizable-HyperScroll/dp/B0DDC8WYTM" data-model-name="Basilisk V3 35k Wired Ergonomic Gaming Mouse" 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/XmYrCSAAHyMiNQkQQgfHWX.jpg" alt="Razer, Basilisk V3 35k Wired Ergonomic Gaming Mouse"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Razer</div>                                        <div class="featured__title">Basilisk V3 35k Wired Ergonomic Gaming Mouse</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="230e8975-8ba0-4b40-888c-e4a4b8767365">            <a href="https://www.amazon.com.au/8BitDo-Bluetooth-Controller-Analogue-Windows/dp/B00LG0I9ZQ/" data-model-name="64 Controller for Windows, Switch, Switch 2, Analogue 3D and Android" 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/7naNHRK5AFyNP7QU8oTxCZ.jpg" alt="8BitDo, 64 Controller for Windows, Switch, Switch 2, Analogue 3D and Android"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>8BitDo</div>                                        <div class="featured__title">64 Controller for Windows, Switch, Switch 2, Analogue 3D and Android</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="037d8caa-1c22-43f8-99d0-53b9e92b6b33">            <a href="https://www.amazon.com.au/8BitDo-Ultimate-Controller-Joysticks-Switchable/dp/B0DR8Y5W6Z" data-model-name="Ultimate 2 Wireless Controller for Windows and Android" 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/CdGt9LbcXTGXh3gRoDfjQa.jpg" alt="8BitDo, Ultimate 2 Wireless Controller for Windows and Android"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>8BitDo</div>                                        <div class="featured__title">Ultimate 2 Wireless Controller for Windows and Android</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="5fe8e50f-8b97-4a6c-9e6a-31e021d5e993">            <a href="https://www.amazon.com.au/Xbox-Wireless-Controller-Carbon-Black/dp/B0FFGQ5KW8" data-model-name="Xbox Series X/S Wireless Controller — Carbon Black" 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/VSJEFYuTLnfMdwHnfhNqhb.jpg" alt="Microsoft, Xbox Series X/S Wireless Controller — Carbon Black"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Microsoft</div>                                        <div class="featured__title">Xbox Series X/S Wireless Controller — Carbon Black</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="a05f2a03-527a-4491-afa0-2032ab1e9eb9">            <a href="https://www.amazon.com.au/GameSir-G7-Pro-Controller-controller/dp/B0G6DCNFDN" data-model-name="G7 Pro Zenless Zone Zero Edition Wireless Controller for Xbox, PC and Android" 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/qU246rQgo4EpE9jVqbpf3d.jpg" alt="GameSir, G7 Pro Zenless Zone Zero Edition Wireless Controller for Xbox, PC and Android"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>GameSir</div>                                        <div class="featured__title">G7 Pro Zenless Zone Zero Edition Wireless Controller for Xbox, PC and Android</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="a91d4526-ba61-4ac2-a74a-daa4813fcfb1">            <a href="https://www.amazon.com.au/Interactive-Wireless-Controller-Lighting-Remappable/dp/B0F3X3HM65/" data-model-name="One Interactive Screen Wireless Gaming Controller" 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/myNqTQzxPc5cbN7MpYMbFe.jpg" alt="Manba, One Interactive Screen Wireless Gaming Controller"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Manba</div>                                        <div class="featured__title">One Interactive Screen Wireless Gaming Controller</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="f5b567a4-90fb-4893-92b9-07d25e1a2530">            <a href="https://www.amazon.com.au/Razer-Wolverine-Wireless-Gaming-Controller/dp/B0F94C6RRR" data-model-name="Wolverine V3 Pro 8K PC Wireless Gaming Controller" 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/aTQyjwesBVbJQPbNTQgeZf.jpg" alt="Razer, Wolverine V3 Pro 8K PC Wireless Gaming Controller"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Razer</div>                                        <div class="featured__title">Wolverine V3 Pro 8K PC Wireless Gaming Controller</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="21918ea9-b43a-44b0-82e9-79c21af882b4">            <a href="https://www.amazon.com.au/Gaming-Over-Ear-Headphones-Microphone-Nintendo/dp/B0B1L859Z6" data-model-name="A10 Gaming Headset Gen 2 Wired Over-Ear Headphones" 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/Wef9qX9cfrn5JMLndECZ2n.jpg" alt="Logitech, A10 Gaming Headset Gen 2 Wired Over-Ear Headphones"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Logitech</div>                                        <div class="featured__title">A10 Gaming Headset Gen 2 Wired Over-Ear Headphones</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="39679a20-6e96-4231-9b77-b28619ecd748">            <a href="https://www.amazon.com.au/Corsair-Wireless-Multiplatform-Headset-Bluetooth/dp/B0D5Z1C5TB" data-model-name="HS80 MAX Wireless Multiplatform Gaming Headset with Bluetooth" 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/5iuoDm7oF2LGEV52Gsy2Mo.jpg" alt="Corsair, HS80 MAX Wireless Multiplatform Gaming Headset with Bluetooth"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Corsair</div>                                        <div class="featured__title">HS80 MAX Wireless Multiplatform Gaming Headset with Bluetooth</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="89439db7-80d9-451a-9491-005b1c189730">            <a href="https://www.amazon.com.au/Razer-Barracuda-Chroma-Wireless-Multi-Platform/dp/B0DX2H6RYR" data-model-name="Barracuda X Chroma Wireless Gaming Headset: 2.4gHz Wireless & Bluetooth" 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/Wae5yZXFX4Dj3geP2AzHz.jpg" alt="Razer, Barracuda X Chroma Wireless Gaming Headset: 2.4gHz Wireless & Bluetooth"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Razer</div>                                        <div class="featured__title">Barracuda X Chroma Wireless Gaming Headset: 2.4gHz Wireless & Bluetooth</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/sales-events/im-calling-it-these-are-the-18-best-gaming-peripheral-deals-in-amazons-big-smile-sale-today</link>
                                                                            <description>
                            <![CDATA[ You don't have to blow your budget to nab a bargain — here are some affordable finds that feel like proper steals. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">LWqoYSkDXNiuXr76awHS7T</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/HPNXhkm8DpbPUsHePZ3AE5-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 20 Mar 2026 04:37:09 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Sales Events]]></category>
                                                    <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Stephen Lambrechts ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/JN3jEQpqyyt32as8AJJqXe.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Stephen Lambrechts is the Managing Editor of Tom&#039;s Guide AU and has written professionally across the categories of tech, film, television and gaming for the last 15 years. Before Tom&#039;s Guide, he spent several years as a Senior Journalist at TechRadar, had a brief stint as Editor in Chief at Official Xbox Magazine Australia, and worked at IGN. He&#039;s also written for such mags and sites as APC, TechLife Australia, T3, FilmInk, Daily Telegraph and AskMen. Additionally, he&#039;s a Tomatometer-approved critic on Rotten Tomatoes, and has offered his tech advice on radio and television.&lt;/p&gt;&lt;p&gt;He&#039;s an expert when it comes to smartphones, TVs, gaming and streaming, having contributed many reviews in each of those categories over the years. Despite his many articles on streaming, he&#039;s a passionate collector of physical media who enjoys listening to vinyl records and acquiring obscure horror movies from the &#039;60s, &#039;70s and 80s. He can usually be seen rocking the latest retro sneaker releases, particularly Air Jordans and Reebok Pumps. Occasionally, he also indulges in other non-hipster stuff, like hiking.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/HPNXhkm8DpbPUsHePZ3AE5-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide / Edited with Gemini]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Gaming peripherals on a desk in front of a gaming pc]]></media:description>                                                            <media:text><![CDATA[Gaming peripherals on a desk in front of a gaming pc]]></media:text>
                                <media:title type="plain"><![CDATA[Gaming peripherals on a desk in front of a gaming pc]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/HPNXhkm8DpbPUsHePZ3AE5-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>As an avid gamer, I'm always on the lookout for some gaming peripheral deals that will help me upgrade my setup. Thankfully, there are some great discounts currently available as part of <a href="https://www.tomsguide.com/live/news/amazon-big-smile-sale-2026" target="_blank">Amazon's Big Smile Sale</a>, and I've rounded up the 18 deals I think are worth your time.</p><p>I've spotted some excellent price reductions on gaming keyboards, mice, controllers and headsets, with brands like Logitech, Razer, Corsair and more all present and accounted for.</p><p>Of the options below, I'm particularly partial to the Epomaker X Aula F75 Gasket Mechanical Keyboard with 75% layout, partly due to the option of LEOBOG Reaper switches, which are linear and offer a light press force between 36 grams and 55 grams.</p><p>I'm also very tempted by the Logitech G502X Plus wireless gaming mouse, thanks to the option of infinite scroll, which I now consider a must-have feature for all mice going forward.</p><p>I've also added the 8BitDo 64 Bluetooth controller to my cart. I've had my eye on it ever since it launched alongside the Analogue 3D console, and now that it's available in the classic Nintendo 64-inspired 'Grey' colourway, I can no longer resist.</p><p>And finally, I do believe the deal on Razer's Barracuda X Chroma Wireless Gaming Headset is excellent value, slashing a massive 49% off the RRP. I especially like its translucent green design and support for both 2.4gHz wireless and Bluetooth.</p>        <div class="featured_product_block featured_block_hero" data-id="7ed4b1fd-5847-4e3b-bb88-1281eb71decc">            <a href="https://www.amazon.com.au/CORSAIR-Mechanical-Gaming-Keyboard-Switches/dp/B09NCMHTSB" data-model-name="K70 RGB Pro Wired Mechanical Gaming Keyboard" 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/yTfBfiZ4t7ZcYv4nkQDegH.jpg" alt="Corsair, K70 RGB Pro Wired Mechanical Gaming Keyboard"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Corsair</div>                                        <div class="featured__title">K70 RGB Pro Wired Mechanical Gaming Keyboard</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="d63372f9-fb4a-45d9-a686-68fe03521b30">            <a href="https://www.amazon.com.au/EPOMAKER-F75-Mechanical-Swappable-Five-Layer/dp/B0D3F69XSP" data-model-name="X Aula F75 Gasket Mechanical Keyboard (75% layout)" 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/85PB6oGWYYJvXALtWSSbYL.jpg" alt="Epomaker, X Aula F75 Gasket Mechanical Keyboard (75% layout)"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Epomaker</div>                                        <div class="featured__title">X Aula F75 Gasket Mechanical Keyboard (75% layout)</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="bd160c69-4797-4a2d-add6-533afe1ca94a">            <a href="https://www.amazon.com.au/ASUS-ROG-II-96-Mechanical/dp/B0CCX99FFW" data-model-name="ROG Strix Scope II 96 Wireless Mechanical Gaming Keyboard" 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/ygkHGzbyLqu47cFxSKMGpM.jpg" alt="Asus, ROG Strix Scope II 96 Wireless Mechanical Gaming Keyboard"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Asus</div>                                        <div class="featured__title">ROG Strix Scope II 96 Wireless Mechanical Gaming Keyboard</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="1ec5a92e-4708-4fdd-a407-7f4c1b7d4f3f">            <a href="https://www.amazon.com.au/Logitech-Lightspeed-Wireless-Gaming-Mouse/dp/B08KQ7WX5B" data-model-name="G305 Lightspeed Wireless Gaming Mouse, White" 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/4gJEkf4KWFrHSGq3eXQdRP.jpg" alt="Logitech, G305 Lightspeed Wireless Gaming Mouse, White"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Logitech</div>                                        <div class="featured__title">G305 Lightspeed Wireless Gaming Mouse, White</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="466fbfd3-beff-4553-9fd9-0a87f33c31b4">            <a href="https://www.amazon.com.au/Logitech-Lightspeed-Wireless-Gaming-Mouse/dp/B0BCJS25XM" data-model-name="G502X Plus Wireless Gaming Mouse, White" 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/fxGSa6fJRgyDLMeXR2n3bQ.jpg" alt="Logitech, G502X Plus Wireless Gaming Mouse, White"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Logitech</div>                                        <div class="featured__title">G502X Plus Wireless Gaming Mouse, White</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="0a479811-5082-4acb-bd51-b6b1c26a0137">            <a href="https://www.amazon.com.au/CORSAIR-IRONCLAW-Wireless-Gaming-Mouse/dp/B0G3QF1GGW" data-model-name="Ironclaw Wireless SE Gaming Mouse" 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/Xh2nFKDQ2p2n3La7FAkFnS.jpg" alt="Corsair, Ironclaw Wireless SE Gaming Mouse"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Corsair</div>                                        <div class="featured__title">Ironclaw Wireless SE Gaming Mouse</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="73b9806d-ff4e-488c-8544-74180a4a4741">            <a href="https://www.amazon.com.au/Razer-HyperSpeed-Wireless-Esports-Gaming/dp/B0CBCPB2T1" data-model-name="Viper V3 Hyperspeed Wireless Esports Gaming Mouse" 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/Sb3GnY7fYW8RwLtGjVa2WU.jpg" alt="Razer, Viper V3 Hyperspeed Wireless Esports Gaming Mouse"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Razer</div>                                        <div class="featured__title">Viper V3 Hyperspeed Wireless Esports Gaming Mouse</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="0e39359a-97e7-46f6-869e-875addea484a">            <a href="https://www.amazon.com.au/CORSAIR-SCIMITAR-ELITE-Wired-Gaming/dp/B08466VFT2" data-model-name="Scimitar RGB Elite Wired MOBA/MMO Gaming Mouse" 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/KNtT734K6TYkUPearVNdyV.jpg" alt="Corsair, Scimitar RGB Elite Wired MOBA/MMO Gaming Mouse"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Corsair</div>                                        <div class="featured__title">Scimitar RGB Elite Wired MOBA/MMO Gaming Mouse</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="4ac6fe12-b1d4-48ef-850c-12fab27fc24e">            <a href="https://www.amazon.com.au/Razer-Basilisk-35K-Customizable-HyperScroll/dp/B0DDC8WYTM" data-model-name="Basilisk V3 35k Wired Ergonomic Gaming Mouse" 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/XmYrCSAAHyMiNQkQQgfHWX.jpg" alt="Razer, Basilisk V3 35k Wired Ergonomic Gaming Mouse"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Razer</div>                                        <div class="featured__title">Basilisk V3 35k Wired Ergonomic Gaming Mouse</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="230e8975-8ba0-4b40-888c-e4a4b8767365">            <a href="https://www.amazon.com.au/8BitDo-Bluetooth-Controller-Analogue-Windows/dp/B00LG0I9ZQ/" data-model-name="64 Controller for Windows, Switch, Switch 2, Analogue 3D and Android" 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/7naNHRK5AFyNP7QU8oTxCZ.jpg" alt="8BitDo, 64 Controller for Windows, Switch, Switch 2, Analogue 3D and Android"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>8BitDo</div>                                        <div class="featured__title">64 Controller for Windows, Switch, Switch 2, Analogue 3D and Android</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="037d8caa-1c22-43f8-99d0-53b9e92b6b33">            <a href="https://www.amazon.com.au/8BitDo-Ultimate-Controller-Joysticks-Switchable/dp/B0DR8Y5W6Z" data-model-name="Ultimate 2 Wireless Controller for Windows and Android" 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/CdGt9LbcXTGXh3gRoDfjQa.jpg" alt="8BitDo, Ultimate 2 Wireless Controller for Windows and Android"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>8BitDo</div>                                        <div class="featured__title">Ultimate 2 Wireless Controller for Windows and Android</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="5fe8e50f-8b97-4a6c-9e6a-31e021d5e993">            <a href="https://www.amazon.com.au/Xbox-Wireless-Controller-Carbon-Black/dp/B0FFGQ5KW8" data-model-name="Xbox Series X/S Wireless Controller — Carbon Black" 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/VSJEFYuTLnfMdwHnfhNqhb.jpg" alt="Microsoft, Xbox Series X/S Wireless Controller — Carbon Black"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Microsoft</div>                                        <div class="featured__title">Xbox Series X/S Wireless Controller — Carbon Black</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="a05f2a03-527a-4491-afa0-2032ab1e9eb9">            <a href="https://www.amazon.com.au/GameSir-G7-Pro-Controller-controller/dp/B0G6DCNFDN" data-model-name="G7 Pro Zenless Zone Zero Edition Wireless Controller for Xbox, PC and Android" 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/qU246rQgo4EpE9jVqbpf3d.jpg" alt="GameSir, G7 Pro Zenless Zone Zero Edition Wireless Controller for Xbox, PC and Android"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>GameSir</div>                                        <div class="featured__title">G7 Pro Zenless Zone Zero Edition Wireless Controller for Xbox, PC and Android</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="a91d4526-ba61-4ac2-a74a-daa4813fcfb1">            <a href="https://www.amazon.com.au/Interactive-Wireless-Controller-Lighting-Remappable/dp/B0F3X3HM65/" data-model-name="One Interactive Screen Wireless Gaming Controller" 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/myNqTQzxPc5cbN7MpYMbFe.jpg" alt="Manba, One Interactive Screen Wireless Gaming Controller"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Manba</div>                                        <div class="featured__title">One Interactive Screen Wireless Gaming Controller</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="f5b567a4-90fb-4893-92b9-07d25e1a2530">            <a href="https://www.amazon.com.au/Razer-Wolverine-Wireless-Gaming-Controller/dp/B0F94C6RRR" data-model-name="Wolverine V3 Pro 8K PC Wireless Gaming Controller" 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/aTQyjwesBVbJQPbNTQgeZf.jpg" alt="Razer, Wolverine V3 Pro 8K PC Wireless Gaming Controller"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Razer</div>                                        <div class="featured__title">Wolverine V3 Pro 8K PC Wireless Gaming Controller</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="21918ea9-b43a-44b0-82e9-79c21af882b4">            <a href="https://www.amazon.com.au/Gaming-Over-Ear-Headphones-Microphone-Nintendo/dp/B0B1L859Z6" data-model-name="A10 Gaming Headset Gen 2 Wired Over-Ear Headphones" 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/Wef9qX9cfrn5JMLndECZ2n.jpg" alt="Logitech, A10 Gaming Headset Gen 2 Wired Over-Ear Headphones"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Logitech</div>                                        <div class="featured__title">A10 Gaming Headset Gen 2 Wired Over-Ear Headphones</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="39679a20-6e96-4231-9b77-b28619ecd748">            <a href="https://www.amazon.com.au/Corsair-Wireless-Multiplatform-Headset-Bluetooth/dp/B0D5Z1C5TB" data-model-name="HS80 MAX Wireless Multiplatform Gaming Headset with Bluetooth" 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/5iuoDm7oF2LGEV52Gsy2Mo.jpg" alt="Corsair, HS80 MAX Wireless Multiplatform Gaming Headset with Bluetooth"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Corsair</div>                                        <div class="featured__title">HS80 MAX Wireless Multiplatform Gaming Headset with Bluetooth</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="89439db7-80d9-451a-9491-005b1c189730">            <a href="https://www.amazon.com.au/Razer-Barracuda-Chroma-Wireless-Multi-Platform/dp/B0DX2H6RYR" data-model-name="Barracuda X Chroma Wireless Gaming Headset: 2.4gHz Wireless & Bluetooth" 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/Wae5yZXFX4Dj3geP2AzHz.jpg" alt="Razer, Barracuda X Chroma Wireless Gaming Headset: 2.4gHz Wireless & Bluetooth"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Razer</div>                                        <div class="featured__title">Barracuda X Chroma Wireless Gaming Headset: 2.4gHz Wireless & Bluetooth</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I wore Razer’s Project Motoko AI gaming headset — and I’m not sure real life is supposed to have cheat codes like this ]]></title>
                                                                                                <dc:content><![CDATA[ <p>What do you get when a gaming headset and Ray-Ban Meta smart glasses get a bit busy in the bedroom? You get Razer’s Project Motoko, and after testing them, I’m convinced that this is now so much more than just a headphone/smart glasses mashup.</p><p>These debuted at <a href="https://www.tomsguide.com/tech-events/best-of-ces-2026-awards-the-top-25-new-gadgets">CES 2026</a> as a prototype that the company promised will be released at some point, at a price that would compete with smart glasses. And at <a href="https://www.tomsguide.com/tag/mwc">MWC 2026</a>, I got to take another look at them.</p><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="pmvxqg6s4DeSkYyK8PNaKP" name="Razer Project Motoko" alt="Razer Project Motoko" src="https://cdn.mos.cms.futurecdn.net/pmvxqg6s4DeSkYyK8PNaKP.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>Chances are you already know the spec sheet here — a premium pair of cans with two 4K cameras, a Snapdragon chip (that Razer’s not allowed to say what it is, which makes me think it's something <strong>new and unannounced</strong>), and a promised 36-hour battery life.</p><p>But what matters here is this form factor unlocks so much as an AI device, beyond what AI glasses can do. Let me explain.</p>                    <div class= "tiktok-wrapper" style="min-height: 750px;"><blockquote class="tiktok-embed" cite="https://www.tiktok.com/@tomsguide/video/7595683853470027022" data-video-id="7595683853470027022" style="max-width: 605px; min-width: 325px;">                        <section>                            <a target="_blank" title="@tomsguide" href="https://www.tiktok.com/@tomsguide">@tomsguide</a>                            <p></p><a target="_blank" title="♬ original sound - Tom’s Guide" href="https://www.tiktok.com/music/original-sound-7595683859086248717">♬ original sound - Tom’s Guide</a></section>                    </blockquote></div>                <h2 id="mission-complete">Mission complete</h2><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="NEZYcEK2YfNT9fmdTF5kVP" name="Razer Project Motoko" alt="Razer Project Motoko" src="https://cdn.mos.cms.futurecdn.net/NEZYcEK2YfNT9fmdTF5kVP.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>Given these have the DNA of smart glasses, AI-wise, the use cases on show are your pretty standard affair. Point the dual 12MP cameras at something, ask a question and get answers. </p><p>I tested it in a gaming sense (because, Razer) and got rapid feedback on how to use my Minecraft inventory in the silliest way possible. </p><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="XwKWAWY9z2xH62D4bsBRZP" name="Razer Project Motoko" alt="Razer Project Motoko" src="https://cdn.mos.cms.futurecdn.net/XwKWAWY9z2xH62D4bsBRZP.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>But then I went further into real-life examples like asking what dishes to avoid on a foreign-language menu based on allergies and asking what to cook with a bunch of ingredients. It honestly felt like going through a game tutorial for life moments.</p><p>Responses are fast, with a capture taken and processed within seconds, and the headset is AI model agnostic — open to Gemini, ChatGPT (<a href="https://www.tomsguide.com/ai/chatgpt/the-quitgpt-movement-gains-steam-as-openais-department-of-war-deal-has-users-saying-cancel-chatgpt">more like QuitGPT</a>) and more that you can tune to different tasks for a multi-modal experience.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="CPaTjnu595KWPYwNW2FeaP" name="Razer Project Motoko" alt="Razer Project Motoko" src="https://cdn.mos.cms.futurecdn.net/CPaTjnu595KWPYwNW2FeaP.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>Razer does tout more features coming too, including real-time AI assistance through persistent video, AI-enhanced visual awareness that uses those wide angle cameras to identify details you may miss in your peripheral vision, and even machine learning tools to train robots.</p><h2 id="a-mass-appeal-form-factor">A mass-appeal form factor</h2><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="9orMCTW8X4nwyEKnPCL27P" name="Razer Project Motoko" alt="Razer Project Motoko" src="https://cdn.mos.cms.futurecdn.net/9orMCTW8X4nwyEKnPCL27P.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 idea of what AI hardware will look like is a question so many companies are trying to answer in so many different ways. One of the most common answers has been smart glasses, but Qualcomm itself (the company behind the chip) finds the idea of camera buds “interesting.”</p><p>“If people don’t want to wear glasses, you could have a camera in each one and now you can pretty much do everything that smart glasses can do,” Zaid Asghar, SVP of wearables and personal AI told Tom’s Guide.</p><p>Because let’s be honest — glasses aren’t for anyone. Be it from a comfort perspective or a “I don’t want to look like a hipster by wearing glasses I don’t need” side of things, they cause a bigger visual statement than a humble pair of cans.</p><p>And that’s why I’m <em>very </em>intrigued by Project Motoko. It changes the dynamic of how you use them from being just something you use every now and then in glasses to something that can be with you at all times. </p><p>It’s rare you’ll find me without headphones on my neck or around my head, and chances are you’re the same too. This elevates it to an actually useful AI assistant you’d use on the regular, instead of something you use on vacations to tell you fun facts about buildings.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/smart-glasses/i-zoned-out-and-stopped-listening-to-my-fiancee-and-the-even-realities-g2-made-sure-she-never-knew">I zoned out and stopped listening to my fiancée — and the Even Realities G2 made sure she never knew</a></li><li><a href="https://www.tomsguide.com/computing/smart-glasses/memomind-one-ai-smart-glasses-hands-on-review">I tested the MemoMind One AI smart glasses — and I think I’m seeing double</a></li><li><a href="https://www.tomsguide.com/computing/laptops/lenovos-gone-all-framework-on-me-with-the-thinkbook-modular-laptop-concept-and-i-hope-this-is-a-sign-of-greener-things-to-come">I tried Lenovo’s mindblowing modular ThinkBook concept — and now I want this in every laptop</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/peripherals/i-wore-razers-project-motoko-ai-gaming-headset-and-im-not-sure-real-life-is-supposed-to-have-cheat-codes-like-this</link>
                                                                            <description>
                            <![CDATA[ I wore Razer’s Project Motoko and tested its new AI features — this is now so much more than just a gaming headset-smart glasses mashup, it’s the future default AI hardware form factor (in my opinion). ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">NGPF56L5FM4etPtHNcdFi</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Z6VB4pmWHU9fUp7kmhGrKP-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 05 Mar 2026 09:49:45 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Gaming Peripherals]]></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/Z6VB4pmWHU9fUp7kmhGrKP-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Razer Project Motoko]]></media:description>                                                            <media:text><![CDATA[Razer Project Motoko]]></media:text>
                                <media:title type="plain"><![CDATA[Razer Project Motoko]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Z6VB4pmWHU9fUp7kmhGrKP-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>What do you get when a gaming headset and Ray-Ban Meta smart glasses get a bit busy in the bedroom? You get Razer’s Project Motoko, and after testing them, I’m convinced that this is now so much more than just a headphone/smart glasses mashup.</p><p>These debuted at <a href="https://www.tomsguide.com/tech-events/best-of-ces-2026-awards-the-top-25-new-gadgets">CES 2026</a> as a prototype that the company promised will be released at some point, at a price that would compete with smart glasses. And at <a href="https://www.tomsguide.com/tag/mwc">MWC 2026</a>, I got to take another look at them.</p><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="pmvxqg6s4DeSkYyK8PNaKP" name="Razer Project Motoko" alt="Razer Project Motoko" src="https://cdn.mos.cms.futurecdn.net/pmvxqg6s4DeSkYyK8PNaKP.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>Chances are you already know the spec sheet here — a premium pair of cans with two 4K cameras, a Snapdragon chip (that Razer’s not allowed to say what it is, which makes me think it's something <strong>new and unannounced</strong>), and a promised 36-hour battery life.</p><p>But what matters here is this form factor unlocks so much as an AI device, beyond what AI glasses can do. Let me explain.</p>                    <div class= "tiktok-wrapper" style="min-height: 750px;"><blockquote class="tiktok-embed" cite="https://www.tiktok.com/@tomsguide/video/7595683853470027022" data-video-id="7595683853470027022" style="max-width: 605px; min-width: 325px;">                        <section>                            <a target="_blank" title="@tomsguide" href="https://www.tiktok.com/@tomsguide">@tomsguide</a>                            <p></p><a target="_blank" title="♬ original sound - Tom’s Guide" href="https://www.tiktok.com/music/original-sound-7595683859086248717">♬ original sound - Tom’s Guide</a></section>                    </blockquote></div>                <h2 id="mission-complete">Mission complete</h2><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="NEZYcEK2YfNT9fmdTF5kVP" name="Razer Project Motoko" alt="Razer Project Motoko" src="https://cdn.mos.cms.futurecdn.net/NEZYcEK2YfNT9fmdTF5kVP.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>Given these have the DNA of smart glasses, AI-wise, the use cases on show are your pretty standard affair. Point the dual 12MP cameras at something, ask a question and get answers. </p><p>I tested it in a gaming sense (because, Razer) and got rapid feedback on how to use my Minecraft inventory in the silliest way possible. </p><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="XwKWAWY9z2xH62D4bsBRZP" name="Razer Project Motoko" alt="Razer Project Motoko" src="https://cdn.mos.cms.futurecdn.net/XwKWAWY9z2xH62D4bsBRZP.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>But then I went further into real-life examples like asking what dishes to avoid on a foreign-language menu based on allergies and asking what to cook with a bunch of ingredients. It honestly felt like going through a game tutorial for life moments.</p><p>Responses are fast, with a capture taken and processed within seconds, and the headset is AI model agnostic — open to Gemini, ChatGPT (<a href="https://www.tomsguide.com/ai/chatgpt/the-quitgpt-movement-gains-steam-as-openais-department-of-war-deal-has-users-saying-cancel-chatgpt">more like QuitGPT</a>) and more that you can tune to different tasks for a multi-modal experience.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="CPaTjnu595KWPYwNW2FeaP" name="Razer Project Motoko" alt="Razer Project Motoko" src="https://cdn.mos.cms.futurecdn.net/CPaTjnu595KWPYwNW2FeaP.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>Razer does tout more features coming too, including real-time AI assistance through persistent video, AI-enhanced visual awareness that uses those wide angle cameras to identify details you may miss in your peripheral vision, and even machine learning tools to train robots.</p><h2 id="a-mass-appeal-form-factor">A mass-appeal form factor</h2><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="9orMCTW8X4nwyEKnPCL27P" name="Razer Project Motoko" alt="Razer Project Motoko" src="https://cdn.mos.cms.futurecdn.net/9orMCTW8X4nwyEKnPCL27P.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 idea of what AI hardware will look like is a question so many companies are trying to answer in so many different ways. One of the most common answers has been smart glasses, but Qualcomm itself (the company behind the chip) finds the idea of camera buds “interesting.”</p><p>“If people don’t want to wear glasses, you could have a camera in each one and now you can pretty much do everything that smart glasses can do,” Zaid Asghar, SVP of wearables and personal AI told Tom’s Guide.</p><p>Because let’s be honest — glasses aren’t for anyone. Be it from a comfort perspective or a “I don’t want to look like a hipster by wearing glasses I don’t need” side of things, they cause a bigger visual statement than a humble pair of cans.</p><p>And that’s why I’m <em>very </em>intrigued by Project Motoko. It changes the dynamic of how you use them from being just something you use every now and then in glasses to something that can be with you at all times. </p><p>It’s rare you’ll find me without headphones on my neck or around my head, and chances are you’re the same too. This elevates it to an actually useful AI assistant you’d use on the regular, instead of something you use on vacations to tell you fun facts about buildings.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/smart-glasses/i-zoned-out-and-stopped-listening-to-my-fiancee-and-the-even-realities-g2-made-sure-she-never-knew">I zoned out and stopped listening to my fiancée — and the Even Realities G2 made sure she never knew</a></li><li><a href="https://www.tomsguide.com/computing/smart-glasses/memomind-one-ai-smart-glasses-hands-on-review">I tested the MemoMind One AI smart glasses — and I think I’m seeing double</a></li><li><a href="https://www.tomsguide.com/computing/laptops/lenovos-gone-all-framework-on-me-with-the-thinkbook-modular-laptop-concept-and-i-hope-this-is-a-sign-of-greener-things-to-come">I tried Lenovo’s mindblowing modular ThinkBook concept — and now I want this in every laptop</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The Logitech G325 Lightspeed costs less than $80 but punches way above its weight — here’s my verdict after a week of testing ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The <a href="https://www.tomsguide.com/best-picks/best-cheap-gaming-headsets">best cheap gaming headsets</a> can deliver excellent in-game audio without breaking the bank, and the Logitech G325 Lightspeed is one such set of cans. Sporting a lovely, colorful design, the headset is extremely comfortable to wear for long periods of time. You get 24 hours of battery life, too, so it’s perfect for marathon gaming sessions. Thanks to multi-platform compatibility, it works with a range of consoles, including both PlayStation and Xbox.</p><p>For the most part, the in-game audio is superb. The treble and upper ranges are sharp and vibrant, giving you a competitive advantage in FPS and RPG titles. However, the sub-bass feels underwhelming, and the lack of a proper boom mic is less than ideal.</p><p>To find out more, read my full Logitech G325 Lightspeed review.</p><h2 class="article-body__section" id="section-logitech-g325-lightspeed-review-specs"><span>Logitech G325 Lightspeed review: Specs</span></h2><div ><table><thead><tr><th class="firstcol " ><p><strong>Specs</strong></p></th><th  ><p><strong>Logitech G325 Lightspeed</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/Logitech-Lightspeed-Bluetooth-Reduction-PlayStation/dp/B0G12HGD6R/" target="_blank" rel="nofollow">$79</a> / <a href="https://www.logitechg.com/en-gb/shop/p/g325-lightspeed-headset" target="_blank" rel="nofollow">£69</a></p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Lilac, Black, White</p></td></tr><tr><td class="firstcol " ><p><strong>Platforms</strong></p></td><td  ><p>PC, macOS, PlayStation 5, PlayStation 4, Xbox Series X|S, Xbox One, Nintendo Switch 2, Nintendo Switch</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Bluetooth 5.2, 2.4GHz dongle, USB-C wired</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>Rechargeable</p></td></tr><tr><td class="firstcol " ><p><strong>Battery life (rated)</strong></p></td><td  ><p>24 hours</p></td></tr><tr><td class="firstcol " ><p><strong>Frequency response</strong></p></td><td  ><p>20-20,000Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Drivers</strong></p></td><td  ><p>32mm</p></td></tr><tr><td class="firstcol " ><p><strong>Multipoint connectivity</strong></p></td><td  ><p>No</p></td></tr><tr><td class="firstcol " ><p><strong>Paired devices max</strong></p></td><td  ><p>1</p></td></tr><tr><td class="firstcol " ><p><strong>Microphone</strong></p></td><td  ><p>Built-in, omnidirectional</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>7.47oz</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-logitech-g325-lightspeed-review-cheat-sheet"><span>Logitech G325 Lightspeed review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>A budget gaming headset compatible with practically every console and smart device</li><li><strong>Who is it for? </strong>For casual gamers on a budget</li><li><strong>How much does it cost? </strong>The Logitech G325 Lightspeed is available for <a href="https://www.amazon.com/Logitech-Lightspeed-Bluetooth-Reduction-PlayStation/dp/B0G12HGD6R/" target="_blank" rel="nofollow">$79</a> / <a href="https://www.logitechg.com/en-gb/shop/p/g325-lightspeed-headset" target="_blank" rel="nofollow">£69</a></li><li><strong>What do we like?</strong> The extremely comfortable design, excellent in-game audio, multi-platform compatibility and long battery life</li><li><strong>What don’t we like? </strong>The creaking headband, slightly underwhelming sub-bass and absence of a proper microphone</li></ul><h2 class="article-body__section" id="section-logitech-g325-lightspeed-review-the-ups"><span>Logitech G325 Lightspeed review: The ups</span></h2><p>From its extremely comfortable ear cushions and headband to its in-game audio performance and multi-platform compatibility, the Logitech G325 Lightspeed is a formidable budget gaming headset.</p><h2 id="extremely-comfortable-2">Extremely comfortable</h2><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="ifHM5HeQMx4NA75xfAv2Lm" name="_logitech_G325_.JPG" alt="A lilac Logitech G325 Lightspeed wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/ifHM5HeQMx4NA75xfAv2Lm.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There are many areas the Logitech G325 Lightspeed excels, and it gets full points from me in the comfort department. If you’re on a budget, it’s the most comfortable headset you can buy. It weighs just 7.47oz, so it’s lighter than the likes of the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/turtle-beach-stealth-500-review-a-wallet-friendly-wonder">Turtle Beach Stealth 500</a> (8.28oz, $79), the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/cherry-xtrfy-h3-gaming-headset-review">Cherry XTRFY H3</a> (11.46oz, $99) and the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/cooler-master-ch351-review">Cooler Master CH351</a> (14.24oz, $89).</p><p>The G325 Lightspeed’s low weight means that not only can you easily carry it while traveling, but it’s extremely comfortable to wear for long periods of time, as you don’t feel weighed down. The lightness is further bolstered by the breathable knit fabric plush headband, which feels soft to touch and relieves pressure on the top of your head. Its ear cushions are made of dual-layer memory foam, which feel breathable, and I didn’t notice any sweat pooling up or my ears heating up during extended playtime.</p><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="2rEC5AmWygyucPgzhxYHDk" name="_logitech_G325_ 9.JPG" alt="A lilac Logitech G325 Lightspeed wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/2rEC5AmWygyucPgzhxYHDk.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I’m not a fan of leatherette earcups, as they tend to get quite hot — something I experienced with the Turtle Beach Stealth 500. I much prefer memory foam ones, like the ones found on the G325 Lightspeed, so I have no complaints about the headset’s comfort. I wore it for an eight-hour-long gaming session and barely felt the G325 Lightspeed on my head and around my ears.</p><h2 id="girlypop-or-emo">Girlypop or emo?</h2><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="mygZiXKtv86xiZPBMUBAGk" name="_logitech_G325_ 3A.JPG" alt="A lilac Logitech G325 Lightspeed wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/mygZiXKtv86xiZPBMUBAGk.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>Another thing I really appreciate about the Logitech G325 Lightspeed’s design is that the headset comes in three different colors. You can pick it up in black, white or lilac. Logitech sent me the lilac model for testing, and I’d be lying if I said I didn’t love it. My go-to headset is the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-blackshark-v3-pro-review">Razer BlackShark V3 Pro</a> ($249), which sports an all-black design. It looks great, but all-black designs can feel boring after a while — not the G325 Lightspeed though. The lilac model also features accents of orange, seen on the volume up and down buttons as well as the cables emerging from the headband and making their way into the earcups — it’s so much fun.</p><h2 id="competitively-priced-3">Competitively priced</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ZVbMQAizezgASQdQBUpNBm" name="_logitech_G325_ 4.JPG" alt="A lilac Logitech G325 Lightspeed wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/ZVbMQAizezgASQdQBUpNBm.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>Before we move on to the Logitech G325 Lightspeed’s performance, I want to mention one very important buying factor: the headset’s price. The G325 Lightspeed is a budget, entry-level headset, and it retails for <a href="https://www.amazon.com/Logitech-Lightspeed-Bluetooth-Reduction-PlayStation/dp/B0G12HGD6R/" target="_blank" rel="nofollow">$79 at Amazon U.S.</a> / <a href="https://www.logitechg.com/en-gb/shop/p/g325-lightspeed-headset" target="_blank" rel="nofollow">£69 at Logitech U.K.</a> It’s a fantastic set of cans to get if you’re a casual gamer who doesn’t want to spend hundreds on a competent headset.</p><p>I’ve tested my fair share of budget gaming headsets, and if there’s one cheap set of cans I <em>had </em>to keep, it would be the G325 Lightspeed. In contrast with the Turtle Beach Stealth 500, the G325 Lightspeed never gave me any connectivity issues. Compared to the Cooler Master CH351, I never felt uncomfortable wearing the headset. And unlike the Cherry XTRFY H3, you don’t need to worry about the G325 Lightspeed not being compatible with Xbox (though that headset <em>does </em>win in a few more areas, such as mic performance).</p><h2 id="multi-platform-compatibility-2">Multi-platform compatibility</h2><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="T8tBzBN9so8VWvG77iPpMk" name="_logitech_G325_ 11.JPG" alt="A lilac Logitech G325 Lightspeed wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/T8tBzBN9so8VWvG77iPpMk.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you own multiple consoles and smart devices and don’t want to buy separate headsets for each, the Logitech G325 Lightspeed should be right up your street. This headset is compatible with a plethora of consoles and devices, namely PC, macOS, <a href="https://www.tomsguide.com/reviews/ps5">PlayStation 5</a>, <a href="https://www.tomsguide.com/us/sony-ps4-review,review-1939.html">PlayStation 4</a>, <a href="https://www.tomsguide.com/reviews/xbox-series-x">Xbox Series X</a> and <a href="https://www.tomsguide.com/reviews/xbox-series-s">S</a>, <a href="https://www.tomsguide.com/us/xbox-one,review-1948.html">Xbox One</a>, <a href="https://www.tomsguide.com/gaming/nintendo/nintendo-switch-2-console-review">Nintendo Switch 2</a>, <a href="https://www.tomsguide.com/reviews/nintendo-switch">Nintendo Switch</a>, Android and iOS.</p><p>The G325 Lightspeed features Bluetooth 5.2 to seamlessly connect to your phone or Nintendo Switch, and comes with a 2.4GHz Lightspeed USB-A dongle, which you can plug into the back of your PS5 (like I did) or your PC. You can also use it wired, thanks to the USB-C port on the left earcup, so you can plug it into your Xbox controller.</p><p>Many cheap headsets aren’t compatible with both Xbox and PlayStation, as you often need to choose the model at checkout, such as with the Turtle Beach Stealth 500, so this is a win for Logitech in my books.</p><h2 id="excellent-in-game-audio">Excellent in-game audio</h2><p>The Logitech G325 Lightspeed is a formidable gaming headset when it comes to in-game audio quality. The headset features 32mm drivers that cover a frequency response range of 20Hz to 20,000Hz. This is fairly standard for a gaming headset, and it means that it can relay a wide array of sound frequencies, from soft footsteps up in the treble to loud explosions in the 20Hz sub bass range. </p><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="NHTVMGRekHdY9LmoN6Kn2m" name="_logitech_G325_ 5.JPG" alt="A lilac Logitech G325 Lightspeed wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/NHTVMGRekHdY9LmoN6Kn2m.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 much pricier <a href="https://www.tomsguide.com/gaming/gaming-peripherals/audeze-maxwell-2-review">Audeze Maxwell 2</a> ($349) and <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-elite-review">SteelSeries Arctis Nova Elite</a> ($599) have a wider frequency range, dropping down to 10Hz for the rumbling bass you can feel. They also have more tonal extension up top (50,000Hz and 40,000Hz, respectively). But this is of questionable benefit given human hearing tops out at around 20,000Hz, so the G325 Lightspeed should technically offer enough upper extension for clear and detailed treble.</p><p>As I mentioned earlier, you can use the G325 Lightspeed wired or wirelessly. To test it, I plugged the 2.4GHz Lightspeed dongle into the back of my <a href="https://www.tomsguide.com/gaming/playstation/ps5-slim">PS5 Slim</a>, which was simple enough as the headset has a plug-and-play interface, and I had a stable connection throughout my testing — no connectivity issues to report here. I played a few games, namely <a href="https://www.tomsguide.com/gaming/playstation/the-best-ps5-game-you-probably-havent-played-just-got-a-prequel-announced-at-state-of-play-and-you-can-get-the-original-right-now-for-just-usd9">Neva</a>, <a href="https://www.tomsguide.com/gaming/clair-obscur-expedition-33-review">Clair Obscur: Expedition 33</a>, and <a href="https://www.tomsguide.com/news/control-ultimate-edition-on-ps5-looks-incredible-but-its-still-behind-pc">Control</a>. Throughout all three titles, the G325 Lightspeed did a fantastic job of reproducing the in-game soundscapes.</p><h4 id="neva">Neva</h4><p>Neva is a 2D side-scrolling game that doesn’t feature much spoken dialogue, and the only time the protagonist, Alba, speaks is when she’s calling out for her cub, Neva. The emotional storyline banks entirely on the music and artistic graphics, so this game proved to be a great test for the headset. Needless to say, the G325 Lightspeed was up to the challenge.</p><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="u3KZBHyooAUFjXpXR2kwJm" name="_logitech_G325_ 7.JPG" alt="A lilac Logitech G325 Lightspeed wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/u3KZBHyooAUFjXpXR2kwJm.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 mid-range is where the G325 Lightspeed shines. I love how the headset captured the subtle shifts in Alba’s tone and voice when she’s calling out for her cub. In the first chapter, Summer, her voice sounded playful and high-pitched but never shrill, while in the later chapters, the headset excelled at delivering the desperation in her strained shouts. Even when Alba was mumbling at the beginning of the Winter chapter, I could hear her loud and clear, and could even hear the trembling in her voice, brought upon by the snow and cold.</p><p>Neva features a lovely soundtrack that can feel fun and emotional at different points of the game. The G325 Lightspeed made the violins and shimmering synth sound crisp and characterful. During combat sequences against the enemies, known as the Corruption, the G325 Lightspeed did a good job of balancing the bloated roars against the fast-paced soundtrack, and it never felt muddied or as though the soundscape had lost its cleanliness. Alba’s footsteps were still discernible and clear too, even when the soundtrack was loud.</p><h4 id="clair-obscur-expedition-33">Clair Obscur: Expedition 33</h4><p>Clair Obscur: Expedition 33’s reactive turn-based combat system is super fun, and while visual cues help you parry, audio cues are the secret to winning battles as each enemy has a distinct tell sound before an attack. These are often high-pitched, second-long sounds, which can be easily missed.</p><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="snndBaUHm2BAZEja9wfYQm" name="_logitech_G325_ 8.JPG" alt="A lilac Logitech G325 Lightspeed wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/snndBaUHm2BAZEja9wfYQm.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>Because the G325 Lightspeed doesn’t have a bloated low-end, I found that these pings cut through the orchestral soundtrack with precision, and I could clearly hear them every time, regardless of the music playing in the background. To test out if it was my eyes helping me execute perfect parries or my ears, I closed my eyes and relied entirely on the headset to help me parry. Granted, I’ve played this game for over 150 hours, so I’m very familiar with the enemies I’m up against, but even so, the G325 Lightspeed gave me a competitive edge, and even with my eyes closed, I didn’t miss many parries.</p><p>This game also features one of the best gaming soundtracks of all time, with operatic, orchestral tracks soundtracking your battles and adventures. The G325 Lightspeed makes music sound crisp and pleasant, with violin harmonies feeling loud and clear, and Alice Duport-Percier’s ethereal vocals having plenty of warmth to them.</p><h2 id="respectable-battery-life">Respectable battery life</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wWkV7C4sgE4JPTQkceB6Ck" name="_logitech_G325_ 1.JPG" alt="A lilac Logitech G325 Lightspeed wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/wWkV7C4sgE4JPTQkceB6Ck.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 cherry on top of the cake is the Logitech G325 Lightspeed’s battery life. Logitech claims the headset can last over 24 hours between charges, and this proved to be true in my testing. I only needed to charge the headset after 25 hours or so. This will, of course, depend on the usage conditions. I mostly played with the volume set to 40% or 50%, and the higher the volume, the quicker the battery will drain.</p><p>I will caveat this point by saying that the Turtle Beach Stealth 500 can last for up to 40 hours, the Cooler Master CH351 can last for 30 hours, and the Cherry XTRFY H3 has a battery life of a whopping 100 hours. In comparison, the G325 Lightspeed’s battery life is short-lived. However, since this is a budget headset aimed at casual gamers who are playing at home, I don’t think it’s a massive drawback. Of course, if you’re on the move and play a lot on your Switch while traveling, for instance, I’d recommend either the Turtle Beach or the Cherry headset mentioned above.</p><h2 class="article-body__section" id="section-logitech-g325-lightspeed-review-the-downs"><span>Logitech G325 Lightspeed review: The downs</span></h2><p>Alas, the Logitech G325 Lightspeed isn’t perfect, as there’s a creaking sound when you move your head sometimes, and the lack of a proper microphone leaves a lot to be desired.</p><h2 id="creaking-while-moving">Creaking while moving</h2><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="3Pt8RfcJgwQWq3dwDPCG8m" name="_logitech_G325_ 2.JPG" alt="A lilac Logitech G325 Lightspeed wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/3Pt8RfcJgwQWq3dwDPCG8m.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 Logitech G325 Lightspeed is an extremely comfortable headset, as I elaborated on earlier. However, in my testing, I noticed a creaking sound when I moved my head to either the left or the right, and it felt like the creaking was coming from the headband. I didn’t experience this very often, but there were a couple of instances.</p><p>This could be because of the headset’s plasticky build, which is disappointing. I also had this issue with the Turtle Beach Stealth 500 when I tested it, which is also quite a cheap-feeling headset. Although the G325 Lightspeed’s creaking didn’t bother me too much, I’d recommend spending the extra $20 on the Cherry XTRFY H3 if you think the creaking will get on your nerves.</p><h2 id="slightly-underwhelming-sub-bass">(Slightly) underwhelming sub-bass</h2><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="ZjSbNDnQXxgEHKg8ffawRk" name="_logitech_G325_ 10.JPG" alt="A lilac Logitech G325 Lightspeed wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/ZjSbNDnQXxgEHKg8ffawRk.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>When I was testing the Logitech G325 Lightspeed, I was replaying Control in preparation for the then imminent release of Control: Resonant. A horror, sci-fi role-playing game, Control features many different sounds, many of which have been implemented to scare the player. While I enjoyed playing the game through the G325 Lightspeed, I’d be lying if I said the headset performed excellently here.</p><p>For the most part, it did really well. Action sounds, like my weapon firing, were loud and clear, as was dialog, with the voice inside Jesse’s head having a distinct, softer tone than the pointed words coming out of her mouth. But I immediately noticed that the G325 Lightspeed struggled with the sub-bass and lower frequencies.</p><p>The Hiss, your primary enemies in the game, are terrifying to listen to as they make chilling, alien-like sounds. When several of them were coming towards me and chanting in harmony, the low-end drone felt more like a buzz, and I couldn’t feel the environmental pressure that makes the Hiss so unnerving. The overall soundscape ends up feeling thin and hollow, and in a horror game where the environment is supposed to instill a bone-shaking fear in you, that’s no good.</p><p>Similarly, in Clair Obscur: Expedition 33, while the soundtrack sounds pleasant, the headset fails to capture the epic scale, as the orchestral thrum that usually gives me goosebumps sounds dialed back. For a more rounded gaming experience, I’d recommend the Cherry XTRFY H3, whose 53mm drivers have more surface area for better sub-bass.</p><h2 id="no-proper-microphone">No proper microphone</h2><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="HhkPSEVN9EmoWgxZ2ZNoFm" name="_logitech_G325_ 6.JPG" alt="A lilac Logitech G325 Lightspeed wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/HhkPSEVN9EmoWgxZ2ZNoFm.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>Last but not least, the Logitech G325 Lightspeed doesn’t feature a boom mic that can be retracted or detached, as seen on the likes of the Turtle Beach Stealth 500 and the Cherry XTRFY H3. Instead, the G325 Lightspeed features a built-in omnidirectional mic, and Logitech says that this “beamforming microphone is designed so your voice can be heard clearly.”</p><audio src="https://cdn.mos.cms.futurecdn.net/cY7wM6xBZ5ivCcLuZQn3cF/Logitech%20G325%20Lightspeed%20%E2%80%94%20Audio%20clip%201.mp3"  controls="controls" preload="none"></audio><p><br>As you can hear in the clip above, the G325 Lightspeed’s mic can be described as merely okay. My voice sounds a little thin, and the vocal timbre feels flat and hollow. It lacks the warmth and richness of a dedicated boom mic, like the one you’ll find on the Cherry XTRFY H3, which is better, in my opinion.</p><p>It’s also important to note that the mic has a frequency response range of 100Hz to 7,000Hz, so it has a tendency to remove the bottom end of your voice, which can make deep voices sound more high-pitched than usual.</p><audio src="https://cdn.mos.cms.futurecdn.net/omtKdeKjrVVbvmUeSgWXYF/Logitech%20G325%20Lightspeed%20%E2%80%94%20Audio%20clip%202.mp3"  controls="controls" preload="none"></audio><p><br>Omnidirectional mics pick up sounds from all around, and not just the sounds coming from your mouth, as unidirectional mics do. This can be disadvantageous, but the G325 Lightspeed features AI-powered noise reduction, which helps reduce some ambient noise. I tested this by playing an episode of House M.D. on my phone in the background, and while the headset does a decent job of highlighting my voice, there is some muddiness where it sounds like my voice and the characters’ voices are bleeding into one another.</p><h2 class="article-body__section" id="section-logitech-g325-lightspeed-review-verdict"><span>Logitech G325 Lightspeed 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:960px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="3Pt8RfcJgwQWq3dwDPCG8m" name="_logitech_G325_ 2.JPG" alt="A lilac Logitech G325 Lightspeed wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/v2/t:511,l:478,cw:960,ch:540,q:80/3Pt8RfcJgwQWq3dwDPCG8m.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As budget gaming headsets go, the Logitech G325 Lightspeed is one of the best you can buy today. It doesn’t give you a lot to complain about, especially in the design and comfort departments. I found the headset super comfortable to wear for up to eight hours, and the long 24-hour battery life meant that I didn’t need to worry about running out of charge mid-session.</p><p>When it comes to in-game audio quality, the G325 Lightspeed is fantastic, making footsteps sound loud and clear even when loud music is playing in the background. High-pitched sounds are never shrill or piercing through the headset. However, if you want better sub-bass for a more immersive experience, I’d recommend the Cherry XTRFY H3. The G325 Lightspeed doesn’t feature a boom mic either, and its built-in mic is just okay.</p><p>If you don’t mind these drawbacks, the G325 Lightspeed is still an outstanding choice for casual gamers on a budget. For less than $80, it certainly punches above its weight.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/logitech-g325-lightspeed-review</link>
                                                                            <description>
                            <![CDATA[ The Logitech G325 Lightspeed is an excellent, comfortable budget gaming headset, boasting great sound quality and multi-platform compatibility. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">rMtqhoD3gMVJLWhNW7KgS</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/mygZiXKtv86xiZPBMUBAGk-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 26 Feb 2026 13:16:40 +0000</pubDate>                                                                                                                                <updated>Thu, 26 Mar 2026 10:31:34 +0000</updated>
                                                                                                                                            <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/mygZiXKtv86xiZPBMUBAGk-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A lilac Logitech G325 Lightspeed wireless gaming headset]]></media:description>                                                            <media:text><![CDATA[A lilac Logitech G325 Lightspeed wireless gaming headset]]></media:text>
                                <media:title type="plain"><![CDATA[A lilac Logitech G325 Lightspeed wireless gaming headset]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/mygZiXKtv86xiZPBMUBAGk-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The <a href="https://www.tomsguide.com/best-picks/best-cheap-gaming-headsets">best cheap gaming headsets</a> can deliver excellent in-game audio without breaking the bank, and the Logitech G325 Lightspeed is one such set of cans. Sporting a lovely, colorful design, the headset is extremely comfortable to wear for long periods of time. You get 24 hours of battery life, too, so it’s perfect for marathon gaming sessions. Thanks to multi-platform compatibility, it works with a range of consoles, including both PlayStation and Xbox.</p><p>For the most part, the in-game audio is superb. The treble and upper ranges are sharp and vibrant, giving you a competitive advantage in FPS and RPG titles. However, the sub-bass feels underwhelming, and the lack of a proper boom mic is less than ideal.</p><p>To find out more, read my full Logitech G325 Lightspeed review.</p><h2 class="article-body__section" id="section-logitech-g325-lightspeed-review-specs"><span>Logitech G325 Lightspeed review: Specs</span></h2><div ><table><thead><tr><th class="firstcol " ><p><strong>Specs</strong></p></th><th  ><p><strong>Logitech G325 Lightspeed</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/Logitech-Lightspeed-Bluetooth-Reduction-PlayStation/dp/B0G12HGD6R/" target="_blank" rel="nofollow">$79</a> / <a href="https://www.logitechg.com/en-gb/shop/p/g325-lightspeed-headset" target="_blank" rel="nofollow">£69</a></p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Lilac, Black, White</p></td></tr><tr><td class="firstcol " ><p><strong>Platforms</strong></p></td><td  ><p>PC, macOS, PlayStation 5, PlayStation 4, Xbox Series X|S, Xbox One, Nintendo Switch 2, Nintendo Switch</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Bluetooth 5.2, 2.4GHz dongle, USB-C wired</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>Rechargeable</p></td></tr><tr><td class="firstcol " ><p><strong>Battery life (rated)</strong></p></td><td  ><p>24 hours</p></td></tr><tr><td class="firstcol " ><p><strong>Frequency response</strong></p></td><td  ><p>20-20,000Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Drivers</strong></p></td><td  ><p>32mm</p></td></tr><tr><td class="firstcol " ><p><strong>Multipoint connectivity</strong></p></td><td  ><p>No</p></td></tr><tr><td class="firstcol " ><p><strong>Paired devices max</strong></p></td><td  ><p>1</p></td></tr><tr><td class="firstcol " ><p><strong>Microphone</strong></p></td><td  ><p>Built-in, omnidirectional</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>7.47oz</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-logitech-g325-lightspeed-review-cheat-sheet"><span>Logitech G325 Lightspeed review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>A budget gaming headset compatible with practically every console and smart device</li><li><strong>Who is it for? </strong>For casual gamers on a budget</li><li><strong>How much does it cost? </strong>The Logitech G325 Lightspeed is available for <a href="https://www.amazon.com/Logitech-Lightspeed-Bluetooth-Reduction-PlayStation/dp/B0G12HGD6R/" target="_blank" rel="nofollow">$79</a> / <a href="https://www.logitechg.com/en-gb/shop/p/g325-lightspeed-headset" target="_blank" rel="nofollow">£69</a></li><li><strong>What do we like?</strong> The extremely comfortable design, excellent in-game audio, multi-platform compatibility and long battery life</li><li><strong>What don’t we like? </strong>The creaking headband, slightly underwhelming sub-bass and absence of a proper microphone</li></ul><h2 class="article-body__section" id="section-logitech-g325-lightspeed-review-the-ups"><span>Logitech G325 Lightspeed review: The ups</span></h2><p>From its extremely comfortable ear cushions and headband to its in-game audio performance and multi-platform compatibility, the Logitech G325 Lightspeed is a formidable budget gaming headset.</p><h2 id="extremely-comfortable-2">Extremely comfortable</h2><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="ifHM5HeQMx4NA75xfAv2Lm" name="_logitech_G325_.JPG" alt="A lilac Logitech G325 Lightspeed wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/ifHM5HeQMx4NA75xfAv2Lm.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There are many areas the Logitech G325 Lightspeed excels, and it gets full points from me in the comfort department. If you’re on a budget, it’s the most comfortable headset you can buy. It weighs just 7.47oz, so it’s lighter than the likes of the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/turtle-beach-stealth-500-review-a-wallet-friendly-wonder">Turtle Beach Stealth 500</a> (8.28oz, $79), the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/cherry-xtrfy-h3-gaming-headset-review">Cherry XTRFY H3</a> (11.46oz, $99) and the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/cooler-master-ch351-review">Cooler Master CH351</a> (14.24oz, $89).</p><p>The G325 Lightspeed’s low weight means that not only can you easily carry it while traveling, but it’s extremely comfortable to wear for long periods of time, as you don’t feel weighed down. The lightness is further bolstered by the breathable knit fabric plush headband, which feels soft to touch and relieves pressure on the top of your head. Its ear cushions are made of dual-layer memory foam, which feel breathable, and I didn’t notice any sweat pooling up or my ears heating up during extended playtime.</p><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="2rEC5AmWygyucPgzhxYHDk" name="_logitech_G325_ 9.JPG" alt="A lilac Logitech G325 Lightspeed wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/2rEC5AmWygyucPgzhxYHDk.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I’m not a fan of leatherette earcups, as they tend to get quite hot — something I experienced with the Turtle Beach Stealth 500. I much prefer memory foam ones, like the ones found on the G325 Lightspeed, so I have no complaints about the headset’s comfort. I wore it for an eight-hour-long gaming session and barely felt the G325 Lightspeed on my head and around my ears.</p><h2 id="girlypop-or-emo">Girlypop or emo?</h2><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="mygZiXKtv86xiZPBMUBAGk" name="_logitech_G325_ 3A.JPG" alt="A lilac Logitech G325 Lightspeed wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/mygZiXKtv86xiZPBMUBAGk.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>Another thing I really appreciate about the Logitech G325 Lightspeed’s design is that the headset comes in three different colors. You can pick it up in black, white or lilac. Logitech sent me the lilac model for testing, and I’d be lying if I said I didn’t love it. My go-to headset is the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-blackshark-v3-pro-review">Razer BlackShark V3 Pro</a> ($249), which sports an all-black design. It looks great, but all-black designs can feel boring after a while — not the G325 Lightspeed though. The lilac model also features accents of orange, seen on the volume up and down buttons as well as the cables emerging from the headband and making their way into the earcups — it’s so much fun.</p><h2 id="competitively-priced-3">Competitively priced</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ZVbMQAizezgASQdQBUpNBm" name="_logitech_G325_ 4.JPG" alt="A lilac Logitech G325 Lightspeed wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/ZVbMQAizezgASQdQBUpNBm.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>Before we move on to the Logitech G325 Lightspeed’s performance, I want to mention one very important buying factor: the headset’s price. The G325 Lightspeed is a budget, entry-level headset, and it retails for <a href="https://www.amazon.com/Logitech-Lightspeed-Bluetooth-Reduction-PlayStation/dp/B0G12HGD6R/" target="_blank" rel="nofollow">$79 at Amazon U.S.</a> / <a href="https://www.logitechg.com/en-gb/shop/p/g325-lightspeed-headset" target="_blank" rel="nofollow">£69 at Logitech U.K.</a> It’s a fantastic set of cans to get if you’re a casual gamer who doesn’t want to spend hundreds on a competent headset.</p><p>I’ve tested my fair share of budget gaming headsets, and if there’s one cheap set of cans I <em>had </em>to keep, it would be the G325 Lightspeed. In contrast with the Turtle Beach Stealth 500, the G325 Lightspeed never gave me any connectivity issues. Compared to the Cooler Master CH351, I never felt uncomfortable wearing the headset. And unlike the Cherry XTRFY H3, you don’t need to worry about the G325 Lightspeed not being compatible with Xbox (though that headset <em>does </em>win in a few more areas, such as mic performance).</p><h2 id="multi-platform-compatibility-2">Multi-platform compatibility</h2><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="T8tBzBN9so8VWvG77iPpMk" name="_logitech_G325_ 11.JPG" alt="A lilac Logitech G325 Lightspeed wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/T8tBzBN9so8VWvG77iPpMk.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you own multiple consoles and smart devices and don’t want to buy separate headsets for each, the Logitech G325 Lightspeed should be right up your street. This headset is compatible with a plethora of consoles and devices, namely PC, macOS, <a href="https://www.tomsguide.com/reviews/ps5">PlayStation 5</a>, <a href="https://www.tomsguide.com/us/sony-ps4-review,review-1939.html">PlayStation 4</a>, <a href="https://www.tomsguide.com/reviews/xbox-series-x">Xbox Series X</a> and <a href="https://www.tomsguide.com/reviews/xbox-series-s">S</a>, <a href="https://www.tomsguide.com/us/xbox-one,review-1948.html">Xbox One</a>, <a href="https://www.tomsguide.com/gaming/nintendo/nintendo-switch-2-console-review">Nintendo Switch 2</a>, <a href="https://www.tomsguide.com/reviews/nintendo-switch">Nintendo Switch</a>, Android and iOS.</p><p>The G325 Lightspeed features Bluetooth 5.2 to seamlessly connect to your phone or Nintendo Switch, and comes with a 2.4GHz Lightspeed USB-A dongle, which you can plug into the back of your PS5 (like I did) or your PC. You can also use it wired, thanks to the USB-C port on the left earcup, so you can plug it into your Xbox controller.</p><p>Many cheap headsets aren’t compatible with both Xbox and PlayStation, as you often need to choose the model at checkout, such as with the Turtle Beach Stealth 500, so this is a win for Logitech in my books.</p><h2 id="excellent-in-game-audio">Excellent in-game audio</h2><p>The Logitech G325 Lightspeed is a formidable gaming headset when it comes to in-game audio quality. The headset features 32mm drivers that cover a frequency response range of 20Hz to 20,000Hz. This is fairly standard for a gaming headset, and it means that it can relay a wide array of sound frequencies, from soft footsteps up in the treble to loud explosions in the 20Hz sub bass range. </p><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="NHTVMGRekHdY9LmoN6Kn2m" name="_logitech_G325_ 5.JPG" alt="A lilac Logitech G325 Lightspeed wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/NHTVMGRekHdY9LmoN6Kn2m.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 much pricier <a href="https://www.tomsguide.com/gaming/gaming-peripherals/audeze-maxwell-2-review">Audeze Maxwell 2</a> ($349) and <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-elite-review">SteelSeries Arctis Nova Elite</a> ($599) have a wider frequency range, dropping down to 10Hz for the rumbling bass you can feel. They also have more tonal extension up top (50,000Hz and 40,000Hz, respectively). But this is of questionable benefit given human hearing tops out at around 20,000Hz, so the G325 Lightspeed should technically offer enough upper extension for clear and detailed treble.</p><p>As I mentioned earlier, you can use the G325 Lightspeed wired or wirelessly. To test it, I plugged the 2.4GHz Lightspeed dongle into the back of my <a href="https://www.tomsguide.com/gaming/playstation/ps5-slim">PS5 Slim</a>, which was simple enough as the headset has a plug-and-play interface, and I had a stable connection throughout my testing — no connectivity issues to report here. I played a few games, namely <a href="https://www.tomsguide.com/gaming/playstation/the-best-ps5-game-you-probably-havent-played-just-got-a-prequel-announced-at-state-of-play-and-you-can-get-the-original-right-now-for-just-usd9">Neva</a>, <a href="https://www.tomsguide.com/gaming/clair-obscur-expedition-33-review">Clair Obscur: Expedition 33</a>, and <a href="https://www.tomsguide.com/news/control-ultimate-edition-on-ps5-looks-incredible-but-its-still-behind-pc">Control</a>. Throughout all three titles, the G325 Lightspeed did a fantastic job of reproducing the in-game soundscapes.</p><h4 id="neva">Neva</h4><p>Neva is a 2D side-scrolling game that doesn’t feature much spoken dialogue, and the only time the protagonist, Alba, speaks is when she’s calling out for her cub, Neva. The emotional storyline banks entirely on the music and artistic graphics, so this game proved to be a great test for the headset. Needless to say, the G325 Lightspeed was up to the challenge.</p><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="u3KZBHyooAUFjXpXR2kwJm" name="_logitech_G325_ 7.JPG" alt="A lilac Logitech G325 Lightspeed wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/u3KZBHyooAUFjXpXR2kwJm.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 mid-range is where the G325 Lightspeed shines. I love how the headset captured the subtle shifts in Alba’s tone and voice when she’s calling out for her cub. In the first chapter, Summer, her voice sounded playful and high-pitched but never shrill, while in the later chapters, the headset excelled at delivering the desperation in her strained shouts. Even when Alba was mumbling at the beginning of the Winter chapter, I could hear her loud and clear, and could even hear the trembling in her voice, brought upon by the snow and cold.</p><p>Neva features a lovely soundtrack that can feel fun and emotional at different points of the game. The G325 Lightspeed made the violins and shimmering synth sound crisp and characterful. During combat sequences against the enemies, known as the Corruption, the G325 Lightspeed did a good job of balancing the bloated roars against the fast-paced soundtrack, and it never felt muddied or as though the soundscape had lost its cleanliness. Alba’s footsteps were still discernible and clear too, even when the soundtrack was loud.</p><h4 id="clair-obscur-expedition-33">Clair Obscur: Expedition 33</h4><p>Clair Obscur: Expedition 33’s reactive turn-based combat system is super fun, and while visual cues help you parry, audio cues are the secret to winning battles as each enemy has a distinct tell sound before an attack. These are often high-pitched, second-long sounds, which can be easily missed.</p><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="snndBaUHm2BAZEja9wfYQm" name="_logitech_G325_ 8.JPG" alt="A lilac Logitech G325 Lightspeed wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/snndBaUHm2BAZEja9wfYQm.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>Because the G325 Lightspeed doesn’t have a bloated low-end, I found that these pings cut through the orchestral soundtrack with precision, and I could clearly hear them every time, regardless of the music playing in the background. To test out if it was my eyes helping me execute perfect parries or my ears, I closed my eyes and relied entirely on the headset to help me parry. Granted, I’ve played this game for over 150 hours, so I’m very familiar with the enemies I’m up against, but even so, the G325 Lightspeed gave me a competitive edge, and even with my eyes closed, I didn’t miss many parries.</p><p>This game also features one of the best gaming soundtracks of all time, with operatic, orchestral tracks soundtracking your battles and adventures. The G325 Lightspeed makes music sound crisp and pleasant, with violin harmonies feeling loud and clear, and Alice Duport-Percier’s ethereal vocals having plenty of warmth to them.</p><h2 id="respectable-battery-life">Respectable battery life</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wWkV7C4sgE4JPTQkceB6Ck" name="_logitech_G325_ 1.JPG" alt="A lilac Logitech G325 Lightspeed wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/wWkV7C4sgE4JPTQkceB6Ck.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 cherry on top of the cake is the Logitech G325 Lightspeed’s battery life. Logitech claims the headset can last over 24 hours between charges, and this proved to be true in my testing. I only needed to charge the headset after 25 hours or so. This will, of course, depend on the usage conditions. I mostly played with the volume set to 40% or 50%, and the higher the volume, the quicker the battery will drain.</p><p>I will caveat this point by saying that the Turtle Beach Stealth 500 can last for up to 40 hours, the Cooler Master CH351 can last for 30 hours, and the Cherry XTRFY H3 has a battery life of a whopping 100 hours. In comparison, the G325 Lightspeed’s battery life is short-lived. However, since this is a budget headset aimed at casual gamers who are playing at home, I don’t think it’s a massive drawback. Of course, if you’re on the move and play a lot on your Switch while traveling, for instance, I’d recommend either the Turtle Beach or the Cherry headset mentioned above.</p><h2 class="article-body__section" id="section-logitech-g325-lightspeed-review-the-downs"><span>Logitech G325 Lightspeed review: The downs</span></h2><p>Alas, the Logitech G325 Lightspeed isn’t perfect, as there’s a creaking sound when you move your head sometimes, and the lack of a proper microphone leaves a lot to be desired.</p><h2 id="creaking-while-moving">Creaking while moving</h2><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="3Pt8RfcJgwQWq3dwDPCG8m" name="_logitech_G325_ 2.JPG" alt="A lilac Logitech G325 Lightspeed wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/3Pt8RfcJgwQWq3dwDPCG8m.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 Logitech G325 Lightspeed is an extremely comfortable headset, as I elaborated on earlier. However, in my testing, I noticed a creaking sound when I moved my head to either the left or the right, and it felt like the creaking was coming from the headband. I didn’t experience this very often, but there were a couple of instances.</p><p>This could be because of the headset’s plasticky build, which is disappointing. I also had this issue with the Turtle Beach Stealth 500 when I tested it, which is also quite a cheap-feeling headset. Although the G325 Lightspeed’s creaking didn’t bother me too much, I’d recommend spending the extra $20 on the Cherry XTRFY H3 if you think the creaking will get on your nerves.</p><h2 id="slightly-underwhelming-sub-bass">(Slightly) underwhelming sub-bass</h2><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="ZjSbNDnQXxgEHKg8ffawRk" name="_logitech_G325_ 10.JPG" alt="A lilac Logitech G325 Lightspeed wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/ZjSbNDnQXxgEHKg8ffawRk.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>When I was testing the Logitech G325 Lightspeed, I was replaying Control in preparation for the then imminent release of Control: Resonant. A horror, sci-fi role-playing game, Control features many different sounds, many of which have been implemented to scare the player. While I enjoyed playing the game through the G325 Lightspeed, I’d be lying if I said the headset performed excellently here.</p><p>For the most part, it did really well. Action sounds, like my weapon firing, were loud and clear, as was dialog, with the voice inside Jesse’s head having a distinct, softer tone than the pointed words coming out of her mouth. But I immediately noticed that the G325 Lightspeed struggled with the sub-bass and lower frequencies.</p><p>The Hiss, your primary enemies in the game, are terrifying to listen to as they make chilling, alien-like sounds. When several of them were coming towards me and chanting in harmony, the low-end drone felt more like a buzz, and I couldn’t feel the environmental pressure that makes the Hiss so unnerving. The overall soundscape ends up feeling thin and hollow, and in a horror game where the environment is supposed to instill a bone-shaking fear in you, that’s no good.</p><p>Similarly, in Clair Obscur: Expedition 33, while the soundtrack sounds pleasant, the headset fails to capture the epic scale, as the orchestral thrum that usually gives me goosebumps sounds dialed back. For a more rounded gaming experience, I’d recommend the Cherry XTRFY H3, whose 53mm drivers have more surface area for better sub-bass.</p><h2 id="no-proper-microphone">No proper microphone</h2><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="HhkPSEVN9EmoWgxZ2ZNoFm" name="_logitech_G325_ 6.JPG" alt="A lilac Logitech G325 Lightspeed wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/HhkPSEVN9EmoWgxZ2ZNoFm.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>Last but not least, the Logitech G325 Lightspeed doesn’t feature a boom mic that can be retracted or detached, as seen on the likes of the Turtle Beach Stealth 500 and the Cherry XTRFY H3. Instead, the G325 Lightspeed features a built-in omnidirectional mic, and Logitech says that this “beamforming microphone is designed so your voice can be heard clearly.”</p><audio src="https://cdn.mos.cms.futurecdn.net/cY7wM6xBZ5ivCcLuZQn3cF/Logitech%20G325%20Lightspeed%20%E2%80%94%20Audio%20clip%201.mp3"  controls="controls" preload="none"></audio><p><br>As you can hear in the clip above, the G325 Lightspeed’s mic can be described as merely okay. My voice sounds a little thin, and the vocal timbre feels flat and hollow. It lacks the warmth and richness of a dedicated boom mic, like the one you’ll find on the Cherry XTRFY H3, which is better, in my opinion.</p><p>It’s also important to note that the mic has a frequency response range of 100Hz to 7,000Hz, so it has a tendency to remove the bottom end of your voice, which can make deep voices sound more high-pitched than usual.</p><audio src="https://cdn.mos.cms.futurecdn.net/omtKdeKjrVVbvmUeSgWXYF/Logitech%20G325%20Lightspeed%20%E2%80%94%20Audio%20clip%202.mp3"  controls="controls" preload="none"></audio><p><br>Omnidirectional mics pick up sounds from all around, and not just the sounds coming from your mouth, as unidirectional mics do. This can be disadvantageous, but the G325 Lightspeed features AI-powered noise reduction, which helps reduce some ambient noise. I tested this by playing an episode of House M.D. on my phone in the background, and while the headset does a decent job of highlighting my voice, there is some muddiness where it sounds like my voice and the characters’ voices are bleeding into one another.</p><h2 class="article-body__section" id="section-logitech-g325-lightspeed-review-verdict"><span>Logitech G325 Lightspeed 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:960px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="3Pt8RfcJgwQWq3dwDPCG8m" name="_logitech_G325_ 2.JPG" alt="A lilac Logitech G325 Lightspeed wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/v2/t:511,l:478,cw:960,ch:540,q:80/3Pt8RfcJgwQWq3dwDPCG8m.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As budget gaming headsets go, the Logitech G325 Lightspeed is one of the best you can buy today. It doesn’t give you a lot to complain about, especially in the design and comfort departments. I found the headset super comfortable to wear for up to eight hours, and the long 24-hour battery life meant that I didn’t need to worry about running out of charge mid-session.</p><p>When it comes to in-game audio quality, the G325 Lightspeed is fantastic, making footsteps sound loud and clear even when loud music is playing in the background. High-pitched sounds are never shrill or piercing through the headset. However, if you want better sub-bass for a more immersive experience, I’d recommend the Cherry XTRFY H3. The G325 Lightspeed doesn’t feature a boom mic either, and its built-in mic is just okay.</p><p>If you don’t mind these drawbacks, the G325 Lightspeed is still an outstanding choice for casual gamers on a budget. For less than $80, it certainly punches above its weight.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tested Reddit’s favorite gaming headsets and there’s a clear winner (but not the one I expected) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I’m lucky. I get to test many of the <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">best gaming headsets</a> out there for my job. That means I literally get paid to play games and listen to music. Yes, I know I have the best job in the world.</p><div  class="fancy-box"><div class="fancy_box-title">Games played for this test</div><div class="fancy_box_body"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' ><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JS4RmXyZpXnabvNcMJqpdJ" name="Fractal_Scape-9.JPG" caption="" alt="The Fractal Design Scape on a stone surface with a blue background" src="https://cdn.mos.cms.futurecdn.net/JS4RmXyZpXnabvNcMJqpdJ.jpg" mos="" link="" align="" fullscreen="" width="" height="" attribution="" endorsement="" class="pinterest-pin-exclude"></p></div></div><figcaption itemprop="caption description" class=""><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p class="fancy-box__body-text"><ul><li><em><strong></strong></em><a data-analytics-id="inline-link" href="https://www.amazon.com/Kingdom-Come-Deliverance-II-PlayStation-5/dp/B0D2FGZ3HF" target="_blank" rel="nofollow"><em><strong>Kingdom Come Deliverance 2</strong></em></a><em><strong></strong></em></li><li><a data-analytics-id="inline-link" href="https://www.amazon.com/Sold-Out-Sales-Marketing-SOSM2384/dp/B09R7X8WW6" target="_blank" rel="nofollow"><em><strong>Sniper Elite: Resistance</strong></em></a></li><li><a data-analytics-id="inline-link" href="https://store.steampowered.com/app/730/CounterStrike_2/" target="_blank" rel="nofollow"><em><strong>Counter Strike 2</strong></em></a></li><li><a data-analytics-id="inline-link" href="https://www.amazon.com/Hell-Let-Loose-Deluxe-PlayStation-5/dp/B0DJFW6R4L" target="_blank" rel="nofollow"><em><strong>Hell Let Loose</strong></em></a></li><li><a data-analytics-id="inline-link" href="https://store.steampowered.com/app/1556790/Isonzo/" target="_blank" rel="nofollow"><em><strong>Isonzo</strong></em></a></li><li><em><strong></strong></em><a data-analytics-id="inline-link" href="https://store.steampowered.com/app/214950/Total_War_ROME_II__Emperor_Edition/" target="_blank" rel="nofollow"><em><strong>Total War: Rome II</strong></em></a></li><li><em><strong></strong></em><a data-analytics-id="inline-link" href="https://store.steampowered.com/app/949230/Cities_Skylines_II/" target="_blank" rel="nofollow"><em><strong>Cities: Skylines II</strong></em></a></li></ul></p></div></div><p>Naturally, I need to do quite a bit of research around all the products I test. I don’t read other publications’ reviews before writing my own. But, where possible, I look for online discourse to check for any common issues users are experiencing. Myself and other reviewers often don’t have the luxury of using products for long periods of time, so we can sometimes miss chronic issues that the general public will end up having some way down the line. This isn’t always possible, of course, as we’re often testing products before or just after launch. </p><p>Case in point: I recently put the new <a href="https://www.tomsguide.com/gaming/gaming-peripherals/audeze-maxwell-2-review">Audeze Maxwell 2</a> to the test, and had a scour of Reddit to see what users were thinking; it had been out for a few weeks, so were there any pain points I needed to devote time to investigating? </p><p>During my research, I noticed a fair number of comparisons being made between today’s ultra premium headsets. The Maxwell 2 was repeatedly being weighed up against the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-elite-review">SteelSeries Arctis Nova Elite</a> and, interestingly, the much cheaper <a href="https://www.tomsguide.com/gaming/gaming-peripherals/fractal-design-scape-review">Fractal Design Scape </a>— which often made discussions thanks to its excellent sound quality.</p><p>Well, it just so happens that the bulk of my headset testing takes place at the ultra-premium end of the market, including all of the above. So I thought I’d put together a rundown of my comparisons of them all. I added in another contender, though — the <a href="https://www.tomsguide.com/reviews/steelseries-arctis-nova-pro-wireless">SteelSeries Arctis Nova Pro</a>, which offers many of the Elite’s benefits at a much lower price.</p><p>Without further ado, here are some of Reddit’s favorite ultra-premium headsets compared and, most importantly, my winner.</p><h2 class="article-body__section" id="section-the-contenders"><span>The contenders</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/aAJ7AAKezSFJRnwXtGpKB9.jpg" alt="The SteelSeries Arctis Nova Elite being worn" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/UpQZSQVToNyudfszFzCWwJ.jpg" alt="SteelSeries Arctis Nova Pro Wireless in white on a person's head" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/JS4RmXyZpXnabvNcMJqpdJ.jpg" alt="The Fractal Design Scape on a stone surface with a blue background" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/wEaKwWY3kj56y6r25WSFAi.jpg" alt="Audeze Maxwell 2 against a blue background" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>This test includes four high-end gaming headsets. The audiophile-geared Audeze Maxwell 2; the extravagantly-priced SteelSeries Arctis Nova Elite; the ultra-premium SteelSeries Arctis Nova Pro; and the beautiful Fractal Design Scape.</p><p>I've tested all of these headsets extensively. See that dashing gentleman in the image gallery above? Yeah, stop swooning. That's me! Wearing each of these headsets. I'm Pete, senior reviews editor here at Tom's Guide. I've been a PC gamer for well over two decades, so I've used more than a few headsets in my time.</p><h2 class="article-body__section" id="section-price"><span>Price</span></h2><ul><li><strong>Audeze Maxwell 2: </strong><a href="https://www.audeze.com/products/maxwell-2-wireless-gaming-headset" target="_blank" rel="nofollow">$329</a> / <a href="https://www.audeze.co.uk/products/maxwell-2" target="_blank" rel="nofollow">£339</a></li><li><strong>SteelSeries Arctis Nova Elite: </strong><a href="https://www.amazon.com/SteelSeries-Arctis-Nova-Elite-Multi-Source-PlayStation/dp/B0FQXB7JHT" target="_blank" rel="nofollow">$599</a> / <a href="https://www.amazon.co.uk/SteelSeries-Arctis-Nova-Elite-Multi-Source/dp/B0FNW8X8QK" target="_blank" rel="nofollow">£599</a></li><li><strong>SteelSeries Arctis Nova Pro: </strong><a href="https://www.amazon.com/SteelSeries-Arctis-Wireless-Multi-System-Headset/dp/B0D1SCV5WR" target="_blank" rel="nofollow">$379</a> / <a href="https://www.amazon.co.uk/SteelSeries-Arctis-Nova-Pro-Wireless/dp/B09ZLRCH1H" target="_blank" rel="nofollow">£329</a></li><li><strong>Fractal Design Scape: </strong><a href="https://www.amazon.com/Fractal-Design-Scape-Flip-Mute/dp/B0D5HGK3C2/" target="_blank" rel="nofollow">$199</a> / <a href="https://www.amazon.co.uk/Fractal-Design-FD-HS-SCA1-01-Scape-Dark/dp/B0D5HGK3C2" target="_blank" rel="nofollow">£177</a></li></ul><p>First, let’s talk about money. And there’s a clear loser here: the Arctis Nova Elite, which costs a whopping $599. As I mentioned in my SteelSeries Arctis Nova Elite review, while it’s a brilliant headset with some awesome features, there’s no way it’s worth that money. </p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/fjiVTtLd7rSKPqbgin8jYJ.jpg" alt="The Fractal Design Scape on a stone surface with a blue background" /><figcaption>Fractal Design Scape<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/4xHjavBtZVgQW3GbHynR3i.jpg" alt="Audeze Maxwell 2 against a blue background" /><figcaption>Audeze Maxwell 2<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/gsAz6FcyebGd25PPAH3nfJ.jpg" alt="SteelSeries Arctis Nova Pro Wireless in white on a stone surface with a gentle purple reflection on the headset" /><figcaption>SteelSeries Arctis Nova Pro Wireless<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/mSdJqCY3hv2wSfaGiQVY99.jpg" alt="The SteelSeries Arctis Nova Elite with its USB hub on a stone surface with a blue background" /><figcaption>SteelSeries Arctis Nova Elite<small role="credit">Future</small></figcaption></figure></figure><p>In the middle are the Nova Pro and Maxwell 2, and both are solid in terms of bang for buck — especially the Nova Pro, which can be found for around <a href="https://www.amazon.com/SteelSeries-Arctis-Wireless-Multi-System-Headset/dp/B0D1SCV5WR"><u>$299 at Amazon</u></a> as I write this. From these two, it’ll be down to what you want: more connectivity features and punchier bass from the Nova Pro and its dynamic drivers; or a more refined, audiophile-esque sound from the Maxwell 2’s planar magnetic drivers.</p><p>If budget is your primary concern, the Fractal Design Scape takes the cake. It has its issues, as you’ll see throughout this article, but it offers sound quality comparable to the Nova Pro and Elite at a much more palatable price (I won’t say affordable, as $200 is still objectively a lot of money). In other words, it’s punching way above its price tag.</p><h4 id="winner-fractal-design-scape">Winner: Fractal Design Scape</h4><div class="product"><a data-dimension112="21be8930-e787-4ddf-8801-19f974421265" data-action="Deal Block" data-label="Scape" data-dimension48="Scape" data-dimension25="$199.99" href="https://www.amazon.com/Fractal-Design-Scape-Flip-Mute/dp/B0D5HGK3C2" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1419px;"><p class="vanilla-image-block" style="padding-top:105.71%;"><img id="hZtZy3hWfNHwhMwe6dGbXN" name="Fractal Design Scape" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/hZtZy3hWfNHwhMwe6dGbXN.jpg" mos="" align="middle" fullscreen="" width="1419" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The prettiest headset on the market in my opinion, and the cheapest of these four contenders. The Scape offers excellent sound quality, premium, design and a handy charging dock.<a class="view-deal button" href="https://www.amazon.com/Fractal-Design-Scape-Flip-Mute/dp/B0D5HGK3C2" target="_blank" rel="nofollow" data-dimension112="21be8930-e787-4ddf-8801-19f974421265" data-action="Deal Block" data-label="Scape" data-dimension48="Scape" data-dimension25="$199.99">View Deal</a></p></div><h2 class="article-body__section" id="section-comfort"><span>Comfort</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/QQ98TAGYpnDWoKfw8LBZoJ.jpg" alt="SteelSeries Arctis Nova Pro Wireless in white on a stone surface with a gentle purple reflection on the headset" /><figcaption>SteelSeries Arctis Nova Pro Wireless<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/gzuGUd3KQN84P9UKuGnF79.jpg" alt="The SteelSeries Arctis Nova Elite earcups" /><figcaption>SteelSeries Arctis Nova Elite<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/eMU8J5BLVm6KEUAtDsHS6i.jpg" alt="Audeze Maxwell 2 against a blue background" /><figcaption>Audeze Maxwell 2<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/eCnFs9xrbky8NgGSehbjXJ.jpg" alt="The Fractal Design Scape on a stone surface with a blue background" /><figcaption>Fractal Design Scape<small role="credit">Future</small></figcaption></figure></figure><p>Three of the headsets here utilize suspended inner headbands, meaning they easily come out on top. Unfortunately, the Fractal Design Scape uses an old-fashioned single padded headband, which started to dig into my head during testing. It’s a shame because the earcups are very comfortable.</p><p>The Maxwell 2, while featuring a much-needed earcup redesign from its predecessor, the OG Audeze Maxwell, is still the biggest and heaviest of the headsets by far. And it features a very restrictive adjustment mechanism with only three levels. It’s comfortable but annoying to wear, and its large curb weight means it falls off easily if you tilt your head downwards.</p><p>The Arctis Nova Elite and Nova Pro are essentially the same headset in their core design — the differences between them almost all relate to internal hardware, connectivity and features, with one exception that I’ll cover below.</p><p>They’re both exceptionally comfortable: the low weight and suspended inner headband allow them to sit like feathers on your head, and the earcups are incredibly comfortable. The Nova Elite pads use a slightly softer-touch faux leather. But is that worth the extra $220? Nope.</p><h4 id="winner-steelseries-arctis-nova-pro">Winner: SteelSeries Arctis Nova Pro</h4><div class="product"><a data-dimension112="7ded6c74-6c30-4b93-ba00-5916d87a0bdc" data-action="Deal Block" data-label="Arctis Nova Pro Wireless" data-dimension48="Arctis Nova Pro Wireless" data-dimension25="$299.99" href="https://www.amazon.com/SteelSeries-Arctis-Wireless-Multi-System-Headset/dp/B0D1SCV5WR/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1065px;"><p class="vanilla-image-block" style="padding-top:140.66%;"><img id="KXsZwQFJ4CKGmnoGX4QAwG" name="SteelSeries Arctis Nova Pro" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/KXsZwQFJ4CKGmnoGX4QAwG.jpg" mos="" align="middle" fullscreen="" width="1065" height="1498" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/SteelSeries-Arctis-Wireless-Multi-System-Headset/dp/B0D1SCV5WR/" target="_blank" rel="nofollow" data-dimension112="7ded6c74-6c30-4b93-ba00-5916d87a0bdc" data-action="Deal Block" data-label="Arctis Nova Pro Wireless" data-dimension48="Arctis Nova Pro Wireless" data-dimension25="$299.99">Arctis Nova Pro Wireless: was $379.99 now $299.99</a></strong><br>The Nova Pro is the most comfortable headset on this roundup. The pricier Arctis Nova Elite has slightly softer earcups, but those don't make a huge difference, and the Nova Pro is way more affordable.<a class="view-deal button" href="https://www.amazon.com/SteelSeries-Arctis-Wireless-Multi-System-Headset/dp/B0D1SCV5WR/" target="_blank" rel="nofollow" data-dimension112="7ded6c74-6c30-4b93-ba00-5916d87a0bdc" data-action="Deal Block" data-label="Arctis Nova Pro Wireless" data-dimension48="Arctis Nova Pro Wireless" data-dimension25="$299.99">View Deal</a></p></div><h3 class="article-body__section" id="section-sound-quality"><span>Sound quality</span></h3><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/y8W3d5QzwFpC9vLJxAegbJ.jpg" alt="A photo of the Audeze Maxwell 2's earcups" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/FCMyXfWhZ5PmLuWuWy3UaJ.jpg" alt="The Fractal Design Scape on a stone surface with a blue background" /><figcaption>Fractal Design Scape<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/TpDyjCRF8X7gxRdaFuvsmJ.jpg" alt="SteelSeries Arctis Nova Pro Wireless in white on a stone surface " /><figcaption>SteelSeries Arctis Nova Pro<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/TN7ZWsMsU7Eoo6mAzzsCA9.jpg" alt="The SteelSeries Arctis Nova Elite controls" /><figcaption>SteelSeries Arctis Nova Elite<small role="credit">Future</small></figcaption></figure></figure><p>This is a really tricky one. All of these headsets offer excellent sound quality. It sounds like a cop out, but this’ll kinda depend on what you want. The Scape’s sound quality is fantastic, with strong tonal separation, bags of clarity in the treble and mids and decent-enough spatial audio. Plus there’s a 5-band parametric EQ to play with. Its frequency response range is a little shorter on the low-end than the other headsets here, stopping at 20Hz. Unlike the other headsets, it’s missing the super low 10-20Hz frequencies that you can feel (rather than hear) during gameplay — the rumble of tanks and artillery in war games, for example.</p><p>Both the Arctis Nova Elite and Pro sound similar, although the Nova Elite definitely edges it, thanks to its upgraded carbon fiber drivers and brass support ring for better control over bass frequencies. Still, both headsets are really very bassy. For gaming, this is great — bags of punchy bass down to 10Hz make for an immersive experience. For music, you’ll need to play around with EQ to stop bass overriding everything — especially in mid-heavy music like rock or metal. Both headsets have strong clarity up top though, especially the Nova Elite, and very good directional sound to help with enemy detection in competitive or stealth games.</p><iframe allow="" height="390" width="378" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://widget.qobuz.com/playlist/58146609?zone=GB-en"></iframe><p>In my opinion, though, the Audeze Maxwell takes the victory here. Its planar magnetic drivers can start and stop vibrating much faster than dynamic drivers, resulting in a cleaner, crisp sound with very good clarity, especially in high and mid frequencies. The trade off is a lack of power in lower frequencies — bass lacks thickness, so to speak, while sub-bass lacks that skull-shaking rumble. A lot of this can be addressed via EQ, though. In a word, the sound is more refined than the rest, making this the headset for audiophile gamers.</p><h4 id="winner-audeze-maxwell-2">Winner: Audeze Maxwell 2</h4><div class="product"><a data-dimension112="84f9ce30-6c91-4f1f-82b6-bf2276a04e84" data-action="Deal Block" data-label="Maxwell 2" data-dimension48="Maxwell 2" data-dimension25="$329" href="https://www.amazon.com/Audeze-Maxwell-PlayStation-Low-Latency-Bluetooth/dp/B0G98TB4ZF" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:671px;"><p class="vanilla-image-block" style="padding-top:133.38%;"><img id="YciPJLYFcvwPZmnxbdMQKP" name="Audeze Maxwell 2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YciPJLYFcvwPZmnxbdMQKP.jpg" mos="" align="middle" fullscreen="" width="671" height="895" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Maxwell 2 takes the crown for best sound quality. Its large planar magnetic drivers deliver bags of clarity and definition, although for raw bass power you'll want the super punchy dynamic drivers of the Nova Pro or Nova Elite.<a class="view-deal button" href="https://www.amazon.com/Audeze-Maxwell-PlayStation-Low-Latency-Bluetooth/dp/B0G98TB4ZF" target="_blank" rel="nofollow" data-dimension112="84f9ce30-6c91-4f1f-82b6-bf2276a04e84" data-action="Deal Block" data-label="Maxwell 2" data-dimension48="Maxwell 2" data-dimension25="$329">View Deal</a></p></div><h2 class="article-body__section" id="section-microphone"><span>Microphone</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/gDzWTjY9f2MepkqZvDnR6i.jpg" alt="Audeze Maxwell 2 against a blue background" /><figcaption>Audeze Maxwell 2<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/HDwTcVQ6LGLchBAuo2mR99.jpg" alt="The SteelSeries Arctis Nova Elite boom mic" /><figcaption>SteelSeries Arctis Nova Elite<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/sZ8Ygz3EXmM4C83fmurHoJ.jpg" alt="SteelSeries Arctis Nova Pro Wireless mic in hand" /><figcaption>SteelSeries Arctis Nova Pro<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/JT6NdYrJt7q2xVkvHA9sdJ.jpg" alt="The Fractal Design Scape on a stone surface with a blue background" /><figcaption>Fractal Design Scape<small role="credit">Future</small></figcaption></figure></figure><p>Unfortunately, gaming headset manufacturers routinely cheap out on microphones, resulting in tinny audio. I can kinda see why — after all, a headset mic primarily needs to transmit your voice in game chat, which doesn’t need to be excellent quality. </p><p>But if you’re a streamer (and high end headsets are commonly aimed at streamers), you’ll need much better quality. Unfortunately, neither the Fractal Design Scape, Arctis Nova Pro or Nova Elite will deliver that. In my testing, their mics all sounded tinny, fuzzy and far from professional-/broadcast-quality.</p><p>The clear winner is the Audeze Maxwell 2, whose microphone sounds excellent — good enough for streaming (although still not as good as a dedicated broadcast mic like the <a href="https://www.tomsguide.com/audio/microphones/shure-mv6-microphone-review">Shure MV6</a>). Its microphone noise cancellation affects audio quality significantly, but that’s common with noise cancellation. And besides, if you’re streaming, you’ll likely be in a quiet environment.</p><h4 id="winner-audeze-maxwell-2-2">Winner: Audeze Maxwell 2</h4><div class="product"><a data-dimension112="eb2274de-c3af-4a1a-8faf-72778ffd1e84" data-action="Deal Block" data-label="Maxwell 2" data-dimension48="Maxwell 2" data-dimension25="$329" href="https://www.amazon.com/Audeze-Maxwell-PlayStation-Low-Latency-Bluetooth/dp/B0G98TB4ZF" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:671px;"><p class="vanilla-image-block" style="padding-top:133.38%;"><img id="YciPJLYFcvwPZmnxbdMQKP" name="Audeze Maxwell 2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YciPJLYFcvwPZmnxbdMQKP.jpg" mos="" align="middle" fullscreen="" width="671" height="895" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Maxwell 2 also wins in the microphone category, and is the only one of he four here that I'd actually recommend for high quality broadcast audio, like streaming.<a class="view-deal button" href="https://www.amazon.com/Audeze-Maxwell-PlayStation-Low-Latency-Bluetooth/dp/B0G98TB4ZF" target="_blank" rel="nofollow" data-dimension112="eb2274de-c3af-4a1a-8faf-72778ffd1e84" data-action="Deal Block" data-label="Maxwell 2" data-dimension48="Maxwell 2" data-dimension25="$329">View Deal</a></p></div><h2 class="article-body__section" id="section-features"><span>Features</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/vVaWm47sgpKVKYnZYdyaA9.jpg" alt="The SteelSeries Arctis Nova Elite with a carry pouch and its cables on a stone surface" /><figcaption>SteelSeries Arctis Nova Elite<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/CjJ7E9NHoWjk6gAKYrzy89.jpg" alt="The SteelSeries Arctis Nova Elite USB hub with a battery poking out" /><figcaption>SteelSeries Arctis Nova Elite USB hub / DAC<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/mspxpKdzzEVmMcgiLYuPdJ.jpg" alt="SteelSeries Arctis Nova Pro Wireless in white on a stone surface with a gentle purple reflection on the headset" /><figcaption>SteelSeries Arctis Nova Pro<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/6sXYjcXE8tzUgTJ2kUezsJ.jpg" alt="SteelSeries Arctis Nova Pro Wireless USB hub" /><figcaption>SteelSeries Arctis Nova Pro USB hub / DAC<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/eCnFs9xrbky8NgGSehbjXJ.jpg" alt="The Fractal Design Scape on a stone surface with a blue background" /><figcaption>Fractal Design Scape wireless charging stand<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/rNDmSbWf9okHyHUaKwdJVJ.jpg" alt="The Fractal Design Scape on a stone surface with a blue background" /><figcaption>Fractal Design Scape USB-A dongle<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Qw7u8DjCQLmk6McMUDHg8i.jpg" alt="Audeze Maxwell 2 against a blue background" /><figcaption>Audeze Maxwell 2<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/ADwxcLXvk2VK6Y5o4K2G4i.jpg" alt="Audeze Maxwell 2 dongle on a stone surface" /><figcaption>Audeze Maxwell 2 USB-C dongle<small role="credit">Future</small></figcaption></figure></figure><p>The Maxwell 2 is the weakest in this regard, with little in the way of additional features except for its microphone noise cancellation, 2.4GHz dongle and companion app (which hosts the equalizer).</p><p>The Fractal Design Scape has some very interesting features, including a stand/charging dock that doubles as a pass-through port for the 2.4GHz dongle. There’s also a companion app with a 5-band parametric equalizer, and microphone noise cancellation (via the app).</p><p>On the features front, there’s no doubt that the two SteelSeries headsets offer the most. Both feature ANC and MNC; each comes with a USB hub/DAC for 2.4GHz connection, high-res audio streaming, device control and spare battery charging; and each pairs with both the SteelSeries GG/Sonar desktop app and the SteelSeries Arctis smartphone app.</p><p>The Nova Elite comes out on top, though, as its USB hub offers more connectivity than the Pro, with 3x Wi-Fi channels (2x PC + 1x console/PC)  in addition to the headset’s Bluetooth channel. The Nova Pro, meanwhile, offers only 2x Wi-Fi channels (1x PC + 1x console/PC) and a Bluetooth channel. Again, if that’s worth $220, fair enough, otherwise the Arctis Nova Pro will suit you just fine.</p><h4 id="winner-steelseries-arctis-nova-elite-pro">Winner: SteelSeries Arctis Nova Elite / Pro</h4><div class="product"><a data-dimension112="e19d658e-6e3d-4981-a097-d6806d063861" data-action="Deal Block" data-label="Arctis Nova Elite" data-dimension48="Arctis Nova Elite" data-dimension25="$599.99" href="https://www.amazon.com/SteelSeries-Arctis-Nova-Elite-Multi-Source-PlayStation/dp/B0FQXPXRJQ" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1105px;"><p class="vanilla-image-block" style="padding-top:135.75%;"><img id="AgbzFmgauopx5t8jPQV9zn" name="SteelSeries Arctis Nova Elite" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/AgbzFmgauopx5t8jPQV9zn.jpg" mos="" align="middle" fullscreen="" width="1105" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The SteelSeries Arctis Nova Elite simply offers the most features of any headset on the market. It's USB hub / DAC is the standout feature, though, allowing multiple device hookup over 2.4G and on-the-fly channel mixing.<a class="view-deal button" href="https://www.amazon.com/SteelSeries-Arctis-Nova-Elite-Multi-Source-PlayStation/dp/B0FQXPXRJQ" target="_blank" rel="nofollow" data-dimension112="e19d658e-6e3d-4981-a097-d6806d063861" data-action="Deal Block" data-label="Arctis Nova Elite" data-dimension48="Arctis Nova Elite" data-dimension25="$599.99">View Deal</a></p></div><h2 class="article-body__section" id="section-styling-build-quality"><span>Styling & build quality</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/sLVUiZTV3gnQfJYBXBW6eJ.jpg" alt="The Fractal Design Scape on a stone surface with a blue background" /><figcaption>Fractal Design Scape<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/kmCd9PRxtqWBSSE2LVTKcJ.jpg" alt="SteelSeries Arctis Nova Pro Wireless in white on a stone surface with a gentle purple reflection on the headset" /><figcaption>SteelSeries Arctis Nova Pro<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/i5ZTEGEP4xVCeCSvgz2b79.jpg" alt="The SteelSeries Arctis Nova Elite leaning on a stone plinth with a blue background" /><figcaption>SteelSeries Arctis Nova Elite<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/yv77WEaZoKz7HPeY3AaB9i.jpg" alt="Audeze Maxwell 2 against a blue background" /><figcaption>Audeze Maxwell 2<small role="credit">Future</small></figcaption></figure></figure><p>All four of these headsets offer sublime build quality, using high quality materials and premium finishes. You shouldn’t have a problem with any of them in this department. The only let down is the SteelSeries Arctis Nova Pro, whose dials are the same cheap plasticky components found on the $199 <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-7-gen-2-review">SteelSeries Arctis Nova 7 Gen 2</a> — they don’t befit a $199 headset, let alone a $379 one. The Arctis Nova Elite, by contrast, features milled metal dials which are much nicer in look and feel (and I’d bloody hope so, given it costs $599). </p><p>The Fractal Design Scape easily takes home the victory here, though. The Scandi-style design looks gorgeous and is complemented by subtle, diffused RGB (which is customizable in the web-based companion software). The materials are super high quality, too, like the metal volume dial on the left earcup. On its charging dock, it just looks so good slotted into place on my desk — it’s a sure fire upgrade to any setup.</p><h4 id="winner-fractal-design-scape-2">Winner: Fractal Design Scape</h4><div class="product"><a data-dimension112="296c7642-68c2-47d6-afe4-91f618b69668" data-action="Deal Block" data-label="Scape" data-dimension48="Scape" data-dimension25="$199.99" href="https://www.amazon.com/Fractal-Design-Scape-Flip-Mute/dp/B0D5HGK3C2" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1419px;"><p class="vanilla-image-block" style="padding-top:105.71%;"><img id="hZtZy3hWfNHwhMwe6dGbXN" name="Fractal Design Scape" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/hZtZy3hWfNHwhMwe6dGbXN.jpg" mos="" align="middle" fullscreen="" width="1419" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>As I mentioned above, not only is the Fractal Design Scape arguably the prettiest headset on the market, it's also phenomenally well put together.<a class="view-deal button" href="https://www.amazon.com/Fractal-Design-Scape-Flip-Mute/dp/B0D5HGK3C2" target="_blank" rel="nofollow" data-dimension112="296c7642-68c2-47d6-afe4-91f618b69668" data-action="Deal Block" data-label="Scape" data-dimension48="Scape" data-dimension25="$199.99">View Deal</a></p></div><h2 class="article-body__section" id="section-battery-life"><span>Battery life</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/RVcdcnjNA5Hiu6t6pRHbAi.jpg" alt="Audeze Maxwell 2 against a blue background" /><figcaption>Audeze Maxwell 2<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/6azfXuWU2fWm8fvarVhf69.jpg" alt="The SteelSeries Arctis Nova Elite with its battery showing" /><figcaption>SteelSeries Arctis Nova Elite<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/eFWZftiC4YveXYn2ponXnJ.jpg" alt="SteelSeries Arctis Nova Pro Wireless in white on a stone surface " /><figcaption>SteelSeries Arctis Nova Pro<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/QCaMD3XoaXWosqky6fP2eJ.jpg" alt="The Fractal Design Scape on a stone surface with a blue background" /><figcaption>Fractal Design Scape<small role="credit">Future</small></figcaption></figure></figure><p>This is another tricky one, because it depends on how we define battery life. Do we mean the hours of play we get from a single charge; or do we mean how much life we get before we're forced into downtime for charging? Both Arctis Nova headsets come with a spare battery that charges in the USB hub while you play, so when one dies you simply switch out and you’re back to playing — no downtime, despite comparatively weak battery life on paper.</p><p>I’m going to judge this section on pure battery life, full to flat. In reality, most people game at home near a power source and don’t play for +18 hours at a time (the weakest of these headset batteries lasts 18 hours — the Nova Pro). As long as a headset lasts 8-16 hours, you won’t run out during even the longest sessions and can simply charge up when you go to bed. The Fractal Design Scape’s wireless charging stand makes that especially easy. </p><p>However, battery life matters most, in my opinion, if you’re gaming on the move — when traveling, for instance. In that case, it’s all about pure runtime. The Scape’s battery lasts 40 hours with RGB off (20 with it on); the Nova Elite’s batteries last 30 hours each, 60 in total; while the Nova Pro’s batteries last around 36-44 hours total, according to SteelSeries, although, in my testing, it’s definitely on the low side (I was literally watching the battery life go down on the SteelSeries GG app, and after 3 hours of mixed use had lost 25%). </p><p>The Audeze Maxwell 2, by contrast, has them all well and truly beat, offering 80 hours — it was actually a challenge to drain the headset in my battery testing.</p><h4 id="winner-audeze-maxwell-2-3">Winner: Audeze Maxwell 2</h4><div class="product"><a data-dimension112="f853f01b-165e-4e20-992e-aabafd93daf2" data-action="Deal Block" data-label="Maxwell 2" data-dimension48="Maxwell 2" data-dimension25="$329" href="https://www.amazon.com/Audeze-Maxwell-PlayStation-Low-Latency-Bluetooth/dp/B0G98TB4ZF" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:671px;"><p class="vanilla-image-block" style="padding-top:133.38%;"><img id="YciPJLYFcvwPZmnxbdMQKP" name="Audeze Maxwell 2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YciPJLYFcvwPZmnxbdMQKP.jpg" mos="" align="middle" fullscreen="" width="671" height="895" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>It's another win for the Maxwell 2 thanks to the phenomenal 80 hour battery life from its 1,800mAh battery. <a class="view-deal button" href="https://www.amazon.com/Audeze-Maxwell-PlayStation-Low-Latency-Bluetooth/dp/B0G98TB4ZF" target="_blank" rel="nofollow" data-dimension112="f853f01b-165e-4e20-992e-aabafd93daf2" data-action="Deal Block" data-label="Maxwell 2" data-dimension48="Maxwell 2" data-dimension25="$329">View Deal</a></p></div><h2 class="article-body__section" id="section-reddit-s-favorite-premium-gaming-headsets-result"><span>Reddit’s favorite premium gaming headsets: Result</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PrNS74jzbQyyBvW3Dqmx2i" name="Audeze_Maxwell2_ 1.JPG" alt="Audeze Maxwell 2 against a blue background" src="https://cdn.mos.cms.futurecdn.net/PrNS74jzbQyyBvW3Dqmx2i.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><h4 id="victor-audeze-maxwell-2">Victor: Audeze Maxwell 2</h4><p>We have a winner! The Audeze Maxwell 2 comes out on top with three wins versus two for the Fractal Design Scape, two for the Arctis Nova Pro and one for the Arctis Nova Elite. I honestly went into this thinking the Nova Pro would clinch it — it costs a similar amount of money as the Maxwell 2 but has that super useful USB hub and excellent sound quality.</p><p>Of course, I seriously doubt you’d have many complaints about the Nova Pro, as it’s fantastic. The Scape is also excellent for the money, with crystal clear sound and that handy charging stand, but is slightly let down by its outdated headband design and crappy mic.</p><p>The only headset I wouldn’t recommend you buy over the others is the Nova Elite. Yes, it has the most features. Yes, it sounds great. Yes, it’s very comfortable. But is any of that worth nearly $600? Not if you ask me.</p><p>The Audeze Maxwell 2’s victory is well-deserved. Sound quality is, for many, the most important aspect of a headset, and the Maxwell’s planar magnetic drivers really deliver here. Its mic is fantastic, it’s comfortable, and (although this is kinda crazy) it’s the second cheapest on this roundup. As I pointed out in my Maxwell 2 review, if you already own the OG Maxwell, there’s no need to upgrade. Otherwise, the Maxwell 2 is the best of the high-end bunch.</p><p><em>Disagree with me? Let me know your thoughts in the comments. Or, if you have any other headsets you'd like me to compare, I'd love to hear about those too! You can find full reviews of these headsets linked below.</em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WVA9qe"></div>                            </div>                            <script src="https://kwizly.com/embed/WVA9qe.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/gaming/gaming-peripherals/audeze-maxwell-2-review">The Audeze Maxwell 2 just ruined every other gaming headset for me — here’s why</a></li><li><a href="https://www.tomsguide.com/gaming/gaming-peripherals/audeze-maxwell-review">Audeze Maxwell (OG) review: the audiophile’s gaming headset</a></li><li><a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-elite-review">I spent a month with the most expensive gaming headset on the market — here’s what happened</a></li><li><a href="https://www.tomsguide.com/gaming/gaming-peripherals/fractal-design-scape-review">Fractal Design Scape review: Is this the prettiest gaming headset ever made?</a></li><li><a href="https://www.tomsguide.com/reviews/steelseries-arctis-nova-pro-wireless">SteelSeries Arctis Nova Pro Wireless review</a></li></ul><div data-widget-type="multimodelreview" data-model-name="Audeze Maxwell 2,SteelSeries Arctis Nova Elite,SteelSeries Arctis Nova Pro,Fractal Design Scape,Audeze Maxwell" data-widget-title="Today's best high-end gaming headset deals"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/i-tested-reddits-favorite-high-end-gaming-headsets-and-theres-a-clear-winner-but-its-not-the-one-i-expected</link>
                                                                            <description>
                            <![CDATA[ It's an ultra-premium shoot out, focusing on Reddit's favorite gaming headsets for sound quality. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">bXR67cxiCNiU8XLhjgNrgd</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/xTnMPZqY8EVpj5U9ruToTV-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 21 Feb 2026 06:15:00 +0000</pubDate>                                                                                                                                <updated>Tue, 28 Apr 2026 18:06:52 +0000</updated>
                                                                                                                                            <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                <author><![CDATA[ peter.wolinski@futurenet.com (Peter Wolinski) ]]></author>                    <dc:creator><![CDATA[ Peter Wolinski ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/stgPfXWY7ukw8J8rfC7vjg.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Peter is a Senior Editor at Tom&#039;s Guide, heading up the site&#039;s Reviews team and Cameras section. Having built gaming PCs since he was 10 (that&#039;s a while ago now) he&#039;s a bit of a nerd about components and hardware. He&#039;s also been an iPhone user since the classic iPhone 4, and a Mac user for well over a decade. Experienced in using and testing all kinds of technology — from phones through to tablets, computers, games consoles, cameras and smart home tech — helping people find the best tech for them (at the best prices) is what Peter does best. A photographer since he bought his first camera (a Fujifilm) in 2015, Peter was previously an Editor for Canon-Europe.com. He then edited the Cameras and How To sections of Tom&#039;s Guide. When he&#039;s not crafting helpful, in-depth reviews, Peter can usually be found out and about honing his architectural photography skills, riding his motorcycle around Welsh mountain roads, telling everyone about his two greyhounds, squeezing a few extra FPS out of PC games or perfecting his espresso shots.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/xTnMPZqY8EVpj5U9ruToTV-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A split image showing two gaming headsets. The Fractal Design Scope in black is on the left; the SteelSeries Arctis Nova Pro in white is on the right.]]></media:description>                                                            <media:text><![CDATA[A split image showing two gaming headsets. The Fractal Design Scope in black is on the left; the SteelSeries Arctis Nova Pro in white is on the right.]]></media:text>
                                <media:title type="plain"><![CDATA[A split image showing two gaming headsets. The Fractal Design Scope in black is on the left; the SteelSeries Arctis Nova Pro in white is on the right.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/xTnMPZqY8EVpj5U9ruToTV-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I’m lucky. I get to test many of the <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">best gaming headsets</a> out there for my job. That means I literally get paid to play games and listen to music. Yes, I know I have the best job in the world.</p><div  class="fancy-box"><div class="fancy_box-title">Games played for this test</div><div class="fancy_box_body"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' ><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JS4RmXyZpXnabvNcMJqpdJ" name="Fractal_Scape-9.JPG" caption="" alt="The Fractal Design Scape on a stone surface with a blue background" src="https://cdn.mos.cms.futurecdn.net/JS4RmXyZpXnabvNcMJqpdJ.jpg" mos="" link="" align="" fullscreen="" width="" height="" attribution="" endorsement="" class="pinterest-pin-exclude"></p></div></div><figcaption itemprop="caption description" class=""><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p class="fancy-box__body-text"><ul><li><em><strong></strong></em><a data-analytics-id="inline-link" href="https://www.amazon.com/Kingdom-Come-Deliverance-II-PlayStation-5/dp/B0D2FGZ3HF" target="_blank" rel="nofollow"><em><strong>Kingdom Come Deliverance 2</strong></em></a><em><strong></strong></em></li><li><a data-analytics-id="inline-link" href="https://www.amazon.com/Sold-Out-Sales-Marketing-SOSM2384/dp/B09R7X8WW6" target="_blank" rel="nofollow"><em><strong>Sniper Elite: Resistance</strong></em></a></li><li><a data-analytics-id="inline-link" href="https://store.steampowered.com/app/730/CounterStrike_2/" target="_blank" rel="nofollow"><em><strong>Counter Strike 2</strong></em></a></li><li><a data-analytics-id="inline-link" href="https://www.amazon.com/Hell-Let-Loose-Deluxe-PlayStation-5/dp/B0DJFW6R4L" target="_blank" rel="nofollow"><em><strong>Hell Let Loose</strong></em></a></li><li><a data-analytics-id="inline-link" href="https://store.steampowered.com/app/1556790/Isonzo/" target="_blank" rel="nofollow"><em><strong>Isonzo</strong></em></a></li><li><em><strong></strong></em><a data-analytics-id="inline-link" href="https://store.steampowered.com/app/214950/Total_War_ROME_II__Emperor_Edition/" target="_blank" rel="nofollow"><em><strong>Total War: Rome II</strong></em></a></li><li><em><strong></strong></em><a data-analytics-id="inline-link" href="https://store.steampowered.com/app/949230/Cities_Skylines_II/" target="_blank" rel="nofollow"><em><strong>Cities: Skylines II</strong></em></a></li></ul></p></div></div><p>Naturally, I need to do quite a bit of research around all the products I test. I don’t read other publications’ reviews before writing my own. But, where possible, I look for online discourse to check for any common issues users are experiencing. Myself and other reviewers often don’t have the luxury of using products for long periods of time, so we can sometimes miss chronic issues that the general public will end up having some way down the line. This isn’t always possible, of course, as we’re often testing products before or just after launch. </p><p>Case in point: I recently put the new <a href="https://www.tomsguide.com/gaming/gaming-peripherals/audeze-maxwell-2-review">Audeze Maxwell 2</a> to the test, and had a scour of Reddit to see what users were thinking; it had been out for a few weeks, so were there any pain points I needed to devote time to investigating? </p><p>During my research, I noticed a fair number of comparisons being made between today’s ultra premium headsets. The Maxwell 2 was repeatedly being weighed up against the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-elite-review">SteelSeries Arctis Nova Elite</a> and, interestingly, the much cheaper <a href="https://www.tomsguide.com/gaming/gaming-peripherals/fractal-design-scape-review">Fractal Design Scape </a>— which often made discussions thanks to its excellent sound quality.</p><p>Well, it just so happens that the bulk of my headset testing takes place at the ultra-premium end of the market, including all of the above. So I thought I’d put together a rundown of my comparisons of them all. I added in another contender, though — the <a href="https://www.tomsguide.com/reviews/steelseries-arctis-nova-pro-wireless">SteelSeries Arctis Nova Pro</a>, which offers many of the Elite’s benefits at a much lower price.</p><p>Without further ado, here are some of Reddit’s favorite ultra-premium headsets compared and, most importantly, my winner.</p><h2 class="article-body__section" id="section-the-contenders"><span>The contenders</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/aAJ7AAKezSFJRnwXtGpKB9.jpg" alt="The SteelSeries Arctis Nova Elite being worn" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/UpQZSQVToNyudfszFzCWwJ.jpg" alt="SteelSeries Arctis Nova Pro Wireless in white on a person's head" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/JS4RmXyZpXnabvNcMJqpdJ.jpg" alt="The Fractal Design Scape on a stone surface with a blue background" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/wEaKwWY3kj56y6r25WSFAi.jpg" alt="Audeze Maxwell 2 against a blue background" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>This test includes four high-end gaming headsets. The audiophile-geared Audeze Maxwell 2; the extravagantly-priced SteelSeries Arctis Nova Elite; the ultra-premium SteelSeries Arctis Nova Pro; and the beautiful Fractal Design Scape.</p><p>I've tested all of these headsets extensively. See that dashing gentleman in the image gallery above? Yeah, stop swooning. That's me! Wearing each of these headsets. I'm Pete, senior reviews editor here at Tom's Guide. I've been a PC gamer for well over two decades, so I've used more than a few headsets in my time.</p><h2 class="article-body__section" id="section-price"><span>Price</span></h2><ul><li><strong>Audeze Maxwell 2: </strong><a href="https://www.audeze.com/products/maxwell-2-wireless-gaming-headset" target="_blank" rel="nofollow">$329</a> / <a href="https://www.audeze.co.uk/products/maxwell-2" target="_blank" rel="nofollow">£339</a></li><li><strong>SteelSeries Arctis Nova Elite: </strong><a href="https://www.amazon.com/SteelSeries-Arctis-Nova-Elite-Multi-Source-PlayStation/dp/B0FQXB7JHT" target="_blank" rel="nofollow">$599</a> / <a href="https://www.amazon.co.uk/SteelSeries-Arctis-Nova-Elite-Multi-Source/dp/B0FNW8X8QK" target="_blank" rel="nofollow">£599</a></li><li><strong>SteelSeries Arctis Nova Pro: </strong><a href="https://www.amazon.com/SteelSeries-Arctis-Wireless-Multi-System-Headset/dp/B0D1SCV5WR" target="_blank" rel="nofollow">$379</a> / <a href="https://www.amazon.co.uk/SteelSeries-Arctis-Nova-Pro-Wireless/dp/B09ZLRCH1H" target="_blank" rel="nofollow">£329</a></li><li><strong>Fractal Design Scape: </strong><a href="https://www.amazon.com/Fractal-Design-Scape-Flip-Mute/dp/B0D5HGK3C2/" target="_blank" rel="nofollow">$199</a> / <a href="https://www.amazon.co.uk/Fractal-Design-FD-HS-SCA1-01-Scape-Dark/dp/B0D5HGK3C2" target="_blank" rel="nofollow">£177</a></li></ul><p>First, let’s talk about money. And there’s a clear loser here: the Arctis Nova Elite, which costs a whopping $599. As I mentioned in my SteelSeries Arctis Nova Elite review, while it’s a brilliant headset with some awesome features, there’s no way it’s worth that money. </p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/fjiVTtLd7rSKPqbgin8jYJ.jpg" alt="The Fractal Design Scape on a stone surface with a blue background" /><figcaption>Fractal Design Scape<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/4xHjavBtZVgQW3GbHynR3i.jpg" alt="Audeze Maxwell 2 against a blue background" /><figcaption>Audeze Maxwell 2<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/gsAz6FcyebGd25PPAH3nfJ.jpg" alt="SteelSeries Arctis Nova Pro Wireless in white on a stone surface with a gentle purple reflection on the headset" /><figcaption>SteelSeries Arctis Nova Pro Wireless<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/mSdJqCY3hv2wSfaGiQVY99.jpg" alt="The SteelSeries Arctis Nova Elite with its USB hub on a stone surface with a blue background" /><figcaption>SteelSeries Arctis Nova Elite<small role="credit">Future</small></figcaption></figure></figure><p>In the middle are the Nova Pro and Maxwell 2, and both are solid in terms of bang for buck — especially the Nova Pro, which can be found for around <a href="https://www.amazon.com/SteelSeries-Arctis-Wireless-Multi-System-Headset/dp/B0D1SCV5WR"><u>$299 at Amazon</u></a> as I write this. From these two, it’ll be down to what you want: more connectivity features and punchier bass from the Nova Pro and its dynamic drivers; or a more refined, audiophile-esque sound from the Maxwell 2’s planar magnetic drivers.</p><p>If budget is your primary concern, the Fractal Design Scape takes the cake. It has its issues, as you’ll see throughout this article, but it offers sound quality comparable to the Nova Pro and Elite at a much more palatable price (I won’t say affordable, as $200 is still objectively a lot of money). In other words, it’s punching way above its price tag.</p><h4 id="winner-fractal-design-scape">Winner: Fractal Design Scape</h4><div class="product"><a data-dimension112="21be8930-e787-4ddf-8801-19f974421265" data-action="Deal Block" data-label="Scape" data-dimension48="Scape" data-dimension25="$199.99" href="https://www.amazon.com/Fractal-Design-Scape-Flip-Mute/dp/B0D5HGK3C2" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1419px;"><p class="vanilla-image-block" style="padding-top:105.71%;"><img id="hZtZy3hWfNHwhMwe6dGbXN" name="Fractal Design Scape" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/hZtZy3hWfNHwhMwe6dGbXN.jpg" mos="" align="middle" fullscreen="" width="1419" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The prettiest headset on the market in my opinion, and the cheapest of these four contenders. The Scape offers excellent sound quality, premium, design and a handy charging dock.<a class="view-deal button" href="https://www.amazon.com/Fractal-Design-Scape-Flip-Mute/dp/B0D5HGK3C2" target="_blank" rel="nofollow" data-dimension112="21be8930-e787-4ddf-8801-19f974421265" data-action="Deal Block" data-label="Scape" data-dimension48="Scape" data-dimension25="$199.99">View Deal</a></p></div><h2 class="article-body__section" id="section-comfort"><span>Comfort</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/QQ98TAGYpnDWoKfw8LBZoJ.jpg" alt="SteelSeries Arctis Nova Pro Wireless in white on a stone surface with a gentle purple reflection on the headset" /><figcaption>SteelSeries Arctis Nova Pro Wireless<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/gzuGUd3KQN84P9UKuGnF79.jpg" alt="The SteelSeries Arctis Nova Elite earcups" /><figcaption>SteelSeries Arctis Nova Elite<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/eMU8J5BLVm6KEUAtDsHS6i.jpg" alt="Audeze Maxwell 2 against a blue background" /><figcaption>Audeze Maxwell 2<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/eCnFs9xrbky8NgGSehbjXJ.jpg" alt="The Fractal Design Scape on a stone surface with a blue background" /><figcaption>Fractal Design Scape<small role="credit">Future</small></figcaption></figure></figure><p>Three of the headsets here utilize suspended inner headbands, meaning they easily come out on top. Unfortunately, the Fractal Design Scape uses an old-fashioned single padded headband, which started to dig into my head during testing. It’s a shame because the earcups are very comfortable.</p><p>The Maxwell 2, while featuring a much-needed earcup redesign from its predecessor, the OG Audeze Maxwell, is still the biggest and heaviest of the headsets by far. And it features a very restrictive adjustment mechanism with only three levels. It’s comfortable but annoying to wear, and its large curb weight means it falls off easily if you tilt your head downwards.</p><p>The Arctis Nova Elite and Nova Pro are essentially the same headset in their core design — the differences between them almost all relate to internal hardware, connectivity and features, with one exception that I’ll cover below.</p><p>They’re both exceptionally comfortable: the low weight and suspended inner headband allow them to sit like feathers on your head, and the earcups are incredibly comfortable. The Nova Elite pads use a slightly softer-touch faux leather. But is that worth the extra $220? Nope.</p><h4 id="winner-steelseries-arctis-nova-pro">Winner: SteelSeries Arctis Nova Pro</h4><div class="product"><a data-dimension112="7ded6c74-6c30-4b93-ba00-5916d87a0bdc" data-action="Deal Block" data-label="Arctis Nova Pro Wireless" data-dimension48="Arctis Nova Pro Wireless" data-dimension25="$299.99" href="https://www.amazon.com/SteelSeries-Arctis-Wireless-Multi-System-Headset/dp/B0D1SCV5WR/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1065px;"><p class="vanilla-image-block" style="padding-top:140.66%;"><img id="KXsZwQFJ4CKGmnoGX4QAwG" name="SteelSeries Arctis Nova Pro" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/KXsZwQFJ4CKGmnoGX4QAwG.jpg" mos="" align="middle" fullscreen="" width="1065" height="1498" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/SteelSeries-Arctis-Wireless-Multi-System-Headset/dp/B0D1SCV5WR/" target="_blank" rel="nofollow" data-dimension112="7ded6c74-6c30-4b93-ba00-5916d87a0bdc" data-action="Deal Block" data-label="Arctis Nova Pro Wireless" data-dimension48="Arctis Nova Pro Wireless" data-dimension25="$299.99">Arctis Nova Pro Wireless: was $379.99 now $299.99</a></strong><br>The Nova Pro is the most comfortable headset on this roundup. The pricier Arctis Nova Elite has slightly softer earcups, but those don't make a huge difference, and the Nova Pro is way more affordable.<a class="view-deal button" href="https://www.amazon.com/SteelSeries-Arctis-Wireless-Multi-System-Headset/dp/B0D1SCV5WR/" target="_blank" rel="nofollow" data-dimension112="7ded6c74-6c30-4b93-ba00-5916d87a0bdc" data-action="Deal Block" data-label="Arctis Nova Pro Wireless" data-dimension48="Arctis Nova Pro Wireless" data-dimension25="$299.99">View Deal</a></p></div><h3 class="article-body__section" id="section-sound-quality"><span>Sound quality</span></h3><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/y8W3d5QzwFpC9vLJxAegbJ.jpg" alt="A photo of the Audeze Maxwell 2's earcups" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/FCMyXfWhZ5PmLuWuWy3UaJ.jpg" alt="The Fractal Design Scape on a stone surface with a blue background" /><figcaption>Fractal Design Scape<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/TpDyjCRF8X7gxRdaFuvsmJ.jpg" alt="SteelSeries Arctis Nova Pro Wireless in white on a stone surface " /><figcaption>SteelSeries Arctis Nova Pro<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/TN7ZWsMsU7Eoo6mAzzsCA9.jpg" alt="The SteelSeries Arctis Nova Elite controls" /><figcaption>SteelSeries Arctis Nova Elite<small role="credit">Future</small></figcaption></figure></figure><p>This is a really tricky one. All of these headsets offer excellent sound quality. It sounds like a cop out, but this’ll kinda depend on what you want. The Scape’s sound quality is fantastic, with strong tonal separation, bags of clarity in the treble and mids and decent-enough spatial audio. Plus there’s a 5-band parametric EQ to play with. Its frequency response range is a little shorter on the low-end than the other headsets here, stopping at 20Hz. Unlike the other headsets, it’s missing the super low 10-20Hz frequencies that you can feel (rather than hear) during gameplay — the rumble of tanks and artillery in war games, for example.</p><p>Both the Arctis Nova Elite and Pro sound similar, although the Nova Elite definitely edges it, thanks to its upgraded carbon fiber drivers and brass support ring for better control over bass frequencies. Still, both headsets are really very bassy. For gaming, this is great — bags of punchy bass down to 10Hz make for an immersive experience. For music, you’ll need to play around with EQ to stop bass overriding everything — especially in mid-heavy music like rock or metal. Both headsets have strong clarity up top though, especially the Nova Elite, and very good directional sound to help with enemy detection in competitive or stealth games.</p><iframe allow="" height="390" width="378" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://widget.qobuz.com/playlist/58146609?zone=GB-en"></iframe><p>In my opinion, though, the Audeze Maxwell takes the victory here. Its planar magnetic drivers can start and stop vibrating much faster than dynamic drivers, resulting in a cleaner, crisp sound with very good clarity, especially in high and mid frequencies. The trade off is a lack of power in lower frequencies — bass lacks thickness, so to speak, while sub-bass lacks that skull-shaking rumble. A lot of this can be addressed via EQ, though. In a word, the sound is more refined than the rest, making this the headset for audiophile gamers.</p><h4 id="winner-audeze-maxwell-2">Winner: Audeze Maxwell 2</h4><div class="product"><a data-dimension112="84f9ce30-6c91-4f1f-82b6-bf2276a04e84" data-action="Deal Block" data-label="Maxwell 2" data-dimension48="Maxwell 2" data-dimension25="$329" href="https://www.amazon.com/Audeze-Maxwell-PlayStation-Low-Latency-Bluetooth/dp/B0G98TB4ZF" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:671px;"><p class="vanilla-image-block" style="padding-top:133.38%;"><img id="YciPJLYFcvwPZmnxbdMQKP" name="Audeze Maxwell 2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YciPJLYFcvwPZmnxbdMQKP.jpg" mos="" align="middle" fullscreen="" width="671" height="895" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Maxwell 2 takes the crown for best sound quality. Its large planar magnetic drivers deliver bags of clarity and definition, although for raw bass power you'll want the super punchy dynamic drivers of the Nova Pro or Nova Elite.<a class="view-deal button" href="https://www.amazon.com/Audeze-Maxwell-PlayStation-Low-Latency-Bluetooth/dp/B0G98TB4ZF" target="_blank" rel="nofollow" data-dimension112="84f9ce30-6c91-4f1f-82b6-bf2276a04e84" data-action="Deal Block" data-label="Maxwell 2" data-dimension48="Maxwell 2" data-dimension25="$329">View Deal</a></p></div><h2 class="article-body__section" id="section-microphone"><span>Microphone</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/gDzWTjY9f2MepkqZvDnR6i.jpg" alt="Audeze Maxwell 2 against a blue background" /><figcaption>Audeze Maxwell 2<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/HDwTcVQ6LGLchBAuo2mR99.jpg" alt="The SteelSeries Arctis Nova Elite boom mic" /><figcaption>SteelSeries Arctis Nova Elite<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/sZ8Ygz3EXmM4C83fmurHoJ.jpg" alt="SteelSeries Arctis Nova Pro Wireless mic in hand" /><figcaption>SteelSeries Arctis Nova Pro<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/JT6NdYrJt7q2xVkvHA9sdJ.jpg" alt="The Fractal Design Scape on a stone surface with a blue background" /><figcaption>Fractal Design Scape<small role="credit">Future</small></figcaption></figure></figure><p>Unfortunately, gaming headset manufacturers routinely cheap out on microphones, resulting in tinny audio. I can kinda see why — after all, a headset mic primarily needs to transmit your voice in game chat, which doesn’t need to be excellent quality. </p><p>But if you’re a streamer (and high end headsets are commonly aimed at streamers), you’ll need much better quality. Unfortunately, neither the Fractal Design Scape, Arctis Nova Pro or Nova Elite will deliver that. In my testing, their mics all sounded tinny, fuzzy and far from professional-/broadcast-quality.</p><p>The clear winner is the Audeze Maxwell 2, whose microphone sounds excellent — good enough for streaming (although still not as good as a dedicated broadcast mic like the <a href="https://www.tomsguide.com/audio/microphones/shure-mv6-microphone-review">Shure MV6</a>). Its microphone noise cancellation affects audio quality significantly, but that’s common with noise cancellation. And besides, if you’re streaming, you’ll likely be in a quiet environment.</p><h4 id="winner-audeze-maxwell-2-2">Winner: Audeze Maxwell 2</h4><div class="product"><a data-dimension112="eb2274de-c3af-4a1a-8faf-72778ffd1e84" data-action="Deal Block" data-label="Maxwell 2" data-dimension48="Maxwell 2" data-dimension25="$329" href="https://www.amazon.com/Audeze-Maxwell-PlayStation-Low-Latency-Bluetooth/dp/B0G98TB4ZF" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:671px;"><p class="vanilla-image-block" style="padding-top:133.38%;"><img id="YciPJLYFcvwPZmnxbdMQKP" name="Audeze Maxwell 2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YciPJLYFcvwPZmnxbdMQKP.jpg" mos="" align="middle" fullscreen="" width="671" height="895" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Maxwell 2 also wins in the microphone category, and is the only one of he four here that I'd actually recommend for high quality broadcast audio, like streaming.<a class="view-deal button" href="https://www.amazon.com/Audeze-Maxwell-PlayStation-Low-Latency-Bluetooth/dp/B0G98TB4ZF" target="_blank" rel="nofollow" data-dimension112="eb2274de-c3af-4a1a-8faf-72778ffd1e84" data-action="Deal Block" data-label="Maxwell 2" data-dimension48="Maxwell 2" data-dimension25="$329">View Deal</a></p></div><h2 class="article-body__section" id="section-features"><span>Features</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/vVaWm47sgpKVKYnZYdyaA9.jpg" alt="The SteelSeries Arctis Nova Elite with a carry pouch and its cables on a stone surface" /><figcaption>SteelSeries Arctis Nova Elite<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/CjJ7E9NHoWjk6gAKYrzy89.jpg" alt="The SteelSeries Arctis Nova Elite USB hub with a battery poking out" /><figcaption>SteelSeries Arctis Nova Elite USB hub / DAC<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/mspxpKdzzEVmMcgiLYuPdJ.jpg" alt="SteelSeries Arctis Nova Pro Wireless in white on a stone surface with a gentle purple reflection on the headset" /><figcaption>SteelSeries Arctis Nova Pro<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/6sXYjcXE8tzUgTJ2kUezsJ.jpg" alt="SteelSeries Arctis Nova Pro Wireless USB hub" /><figcaption>SteelSeries Arctis Nova Pro USB hub / DAC<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/eCnFs9xrbky8NgGSehbjXJ.jpg" alt="The Fractal Design Scape on a stone surface with a blue background" /><figcaption>Fractal Design Scape wireless charging stand<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/rNDmSbWf9okHyHUaKwdJVJ.jpg" alt="The Fractal Design Scape on a stone surface with a blue background" /><figcaption>Fractal Design Scape USB-A dongle<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Qw7u8DjCQLmk6McMUDHg8i.jpg" alt="Audeze Maxwell 2 against a blue background" /><figcaption>Audeze Maxwell 2<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/ADwxcLXvk2VK6Y5o4K2G4i.jpg" alt="Audeze Maxwell 2 dongle on a stone surface" /><figcaption>Audeze Maxwell 2 USB-C dongle<small role="credit">Future</small></figcaption></figure></figure><p>The Maxwell 2 is the weakest in this regard, with little in the way of additional features except for its microphone noise cancellation, 2.4GHz dongle and companion app (which hosts the equalizer).</p><p>The Fractal Design Scape has some very interesting features, including a stand/charging dock that doubles as a pass-through port for the 2.4GHz dongle. There’s also a companion app with a 5-band parametric equalizer, and microphone noise cancellation (via the app).</p><p>On the features front, there’s no doubt that the two SteelSeries headsets offer the most. Both feature ANC and MNC; each comes with a USB hub/DAC for 2.4GHz connection, high-res audio streaming, device control and spare battery charging; and each pairs with both the SteelSeries GG/Sonar desktop app and the SteelSeries Arctis smartphone app.</p><p>The Nova Elite comes out on top, though, as its USB hub offers more connectivity than the Pro, with 3x Wi-Fi channels (2x PC + 1x console/PC)  in addition to the headset’s Bluetooth channel. The Nova Pro, meanwhile, offers only 2x Wi-Fi channels (1x PC + 1x console/PC) and a Bluetooth channel. Again, if that’s worth $220, fair enough, otherwise the Arctis Nova Pro will suit you just fine.</p><h4 id="winner-steelseries-arctis-nova-elite-pro">Winner: SteelSeries Arctis Nova Elite / Pro</h4><div class="product"><a data-dimension112="e19d658e-6e3d-4981-a097-d6806d063861" data-action="Deal Block" data-label="Arctis Nova Elite" data-dimension48="Arctis Nova Elite" data-dimension25="$599.99" href="https://www.amazon.com/SteelSeries-Arctis-Nova-Elite-Multi-Source-PlayStation/dp/B0FQXPXRJQ" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1105px;"><p class="vanilla-image-block" style="padding-top:135.75%;"><img id="AgbzFmgauopx5t8jPQV9zn" name="SteelSeries Arctis Nova Elite" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/AgbzFmgauopx5t8jPQV9zn.jpg" mos="" align="middle" fullscreen="" width="1105" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The SteelSeries Arctis Nova Elite simply offers the most features of any headset on the market. It's USB hub / DAC is the standout feature, though, allowing multiple device hookup over 2.4G and on-the-fly channel mixing.<a class="view-deal button" href="https://www.amazon.com/SteelSeries-Arctis-Nova-Elite-Multi-Source-PlayStation/dp/B0FQXPXRJQ" target="_blank" rel="nofollow" data-dimension112="e19d658e-6e3d-4981-a097-d6806d063861" data-action="Deal Block" data-label="Arctis Nova Elite" data-dimension48="Arctis Nova Elite" data-dimension25="$599.99">View Deal</a></p></div><h2 class="article-body__section" id="section-styling-build-quality"><span>Styling & build quality</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/sLVUiZTV3gnQfJYBXBW6eJ.jpg" alt="The Fractal Design Scape on a stone surface with a blue background" /><figcaption>Fractal Design Scape<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/kmCd9PRxtqWBSSE2LVTKcJ.jpg" alt="SteelSeries Arctis Nova Pro Wireless in white on a stone surface with a gentle purple reflection on the headset" /><figcaption>SteelSeries Arctis Nova Pro<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/i5ZTEGEP4xVCeCSvgz2b79.jpg" alt="The SteelSeries Arctis Nova Elite leaning on a stone plinth with a blue background" /><figcaption>SteelSeries Arctis Nova Elite<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/yv77WEaZoKz7HPeY3AaB9i.jpg" alt="Audeze Maxwell 2 against a blue background" /><figcaption>Audeze Maxwell 2<small role="credit">Future</small></figcaption></figure></figure><p>All four of these headsets offer sublime build quality, using high quality materials and premium finishes. You shouldn’t have a problem with any of them in this department. The only let down is the SteelSeries Arctis Nova Pro, whose dials are the same cheap plasticky components found on the $199 <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-7-gen-2-review">SteelSeries Arctis Nova 7 Gen 2</a> — they don’t befit a $199 headset, let alone a $379 one. The Arctis Nova Elite, by contrast, features milled metal dials which are much nicer in look and feel (and I’d bloody hope so, given it costs $599). </p><p>The Fractal Design Scape easily takes home the victory here, though. The Scandi-style design looks gorgeous and is complemented by subtle, diffused RGB (which is customizable in the web-based companion software). The materials are super high quality, too, like the metal volume dial on the left earcup. On its charging dock, it just looks so good slotted into place on my desk — it’s a sure fire upgrade to any setup.</p><h4 id="winner-fractal-design-scape-2">Winner: Fractal Design Scape</h4><div class="product"><a data-dimension112="296c7642-68c2-47d6-afe4-91f618b69668" data-action="Deal Block" data-label="Scape" data-dimension48="Scape" data-dimension25="$199.99" href="https://www.amazon.com/Fractal-Design-Scape-Flip-Mute/dp/B0D5HGK3C2" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1419px;"><p class="vanilla-image-block" style="padding-top:105.71%;"><img id="hZtZy3hWfNHwhMwe6dGbXN" name="Fractal Design Scape" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/hZtZy3hWfNHwhMwe6dGbXN.jpg" mos="" align="middle" fullscreen="" width="1419" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>As I mentioned above, not only is the Fractal Design Scape arguably the prettiest headset on the market, it's also phenomenally well put together.<a class="view-deal button" href="https://www.amazon.com/Fractal-Design-Scape-Flip-Mute/dp/B0D5HGK3C2" target="_blank" rel="nofollow" data-dimension112="296c7642-68c2-47d6-afe4-91f618b69668" data-action="Deal Block" data-label="Scape" data-dimension48="Scape" data-dimension25="$199.99">View Deal</a></p></div><h2 class="article-body__section" id="section-battery-life"><span>Battery life</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/RVcdcnjNA5Hiu6t6pRHbAi.jpg" alt="Audeze Maxwell 2 against a blue background" /><figcaption>Audeze Maxwell 2<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/6azfXuWU2fWm8fvarVhf69.jpg" alt="The SteelSeries Arctis Nova Elite with its battery showing" /><figcaption>SteelSeries Arctis Nova Elite<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/eFWZftiC4YveXYn2ponXnJ.jpg" alt="SteelSeries Arctis Nova Pro Wireless in white on a stone surface " /><figcaption>SteelSeries Arctis Nova Pro<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/QCaMD3XoaXWosqky6fP2eJ.jpg" alt="The Fractal Design Scape on a stone surface with a blue background" /><figcaption>Fractal Design Scape<small role="credit">Future</small></figcaption></figure></figure><p>This is another tricky one, because it depends on how we define battery life. Do we mean the hours of play we get from a single charge; or do we mean how much life we get before we're forced into downtime for charging? Both Arctis Nova headsets come with a spare battery that charges in the USB hub while you play, so when one dies you simply switch out and you’re back to playing — no downtime, despite comparatively weak battery life on paper.</p><p>I’m going to judge this section on pure battery life, full to flat. In reality, most people game at home near a power source and don’t play for +18 hours at a time (the weakest of these headset batteries lasts 18 hours — the Nova Pro). As long as a headset lasts 8-16 hours, you won’t run out during even the longest sessions and can simply charge up when you go to bed. The Fractal Design Scape’s wireless charging stand makes that especially easy. </p><p>However, battery life matters most, in my opinion, if you’re gaming on the move — when traveling, for instance. In that case, it’s all about pure runtime. The Scape’s battery lasts 40 hours with RGB off (20 with it on); the Nova Elite’s batteries last 30 hours each, 60 in total; while the Nova Pro’s batteries last around 36-44 hours total, according to SteelSeries, although, in my testing, it’s definitely on the low side (I was literally watching the battery life go down on the SteelSeries GG app, and after 3 hours of mixed use had lost 25%). </p><p>The Audeze Maxwell 2, by contrast, has them all well and truly beat, offering 80 hours — it was actually a challenge to drain the headset in my battery testing.</p><h4 id="winner-audeze-maxwell-2-3">Winner: Audeze Maxwell 2</h4><div class="product"><a data-dimension112="f853f01b-165e-4e20-992e-aabafd93daf2" data-action="Deal Block" data-label="Maxwell 2" data-dimension48="Maxwell 2" data-dimension25="$329" href="https://www.amazon.com/Audeze-Maxwell-PlayStation-Low-Latency-Bluetooth/dp/B0G98TB4ZF" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:671px;"><p class="vanilla-image-block" style="padding-top:133.38%;"><img id="YciPJLYFcvwPZmnxbdMQKP" name="Audeze Maxwell 2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YciPJLYFcvwPZmnxbdMQKP.jpg" mos="" align="middle" fullscreen="" width="671" height="895" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>It's another win for the Maxwell 2 thanks to the phenomenal 80 hour battery life from its 1,800mAh battery. <a class="view-deal button" href="https://www.amazon.com/Audeze-Maxwell-PlayStation-Low-Latency-Bluetooth/dp/B0G98TB4ZF" target="_blank" rel="nofollow" data-dimension112="f853f01b-165e-4e20-992e-aabafd93daf2" data-action="Deal Block" data-label="Maxwell 2" data-dimension48="Maxwell 2" data-dimension25="$329">View Deal</a></p></div><h2 class="article-body__section" id="section-reddit-s-favorite-premium-gaming-headsets-result"><span>Reddit’s favorite premium gaming headsets: Result</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PrNS74jzbQyyBvW3Dqmx2i" name="Audeze_Maxwell2_ 1.JPG" alt="Audeze Maxwell 2 against a blue background" src="https://cdn.mos.cms.futurecdn.net/PrNS74jzbQyyBvW3Dqmx2i.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><h4 id="victor-audeze-maxwell-2">Victor: Audeze Maxwell 2</h4><p>We have a winner! The Audeze Maxwell 2 comes out on top with three wins versus two for the Fractal Design Scape, two for the Arctis Nova Pro and one for the Arctis Nova Elite. I honestly went into this thinking the Nova Pro would clinch it — it costs a similar amount of money as the Maxwell 2 but has that super useful USB hub and excellent sound quality.</p><p>Of course, I seriously doubt you’d have many complaints about the Nova Pro, as it’s fantastic. The Scape is also excellent for the money, with crystal clear sound and that handy charging stand, but is slightly let down by its outdated headband design and crappy mic.</p><p>The only headset I wouldn’t recommend you buy over the others is the Nova Elite. Yes, it has the most features. Yes, it sounds great. Yes, it’s very comfortable. But is any of that worth nearly $600? Not if you ask me.</p><p>The Audeze Maxwell 2’s victory is well-deserved. Sound quality is, for many, the most important aspect of a headset, and the Maxwell’s planar magnetic drivers really deliver here. Its mic is fantastic, it’s comfortable, and (although this is kinda crazy) it’s the second cheapest on this roundup. As I pointed out in my Maxwell 2 review, if you already own the OG Maxwell, there’s no need to upgrade. Otherwise, the Maxwell 2 is the best of the high-end bunch.</p><p><em>Disagree with me? Let me know your thoughts in the comments. Or, if you have any other headsets you'd like me to compare, I'd love to hear about those too! You can find full reviews of these headsets linked below.</em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WVA9qe"></div>                            </div>                            <script src="https://kwizly.com/embed/WVA9qe.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/gaming/gaming-peripherals/audeze-maxwell-2-review">The Audeze Maxwell 2 just ruined every other gaming headset for me — here’s why</a></li><li><a href="https://www.tomsguide.com/gaming/gaming-peripherals/audeze-maxwell-review">Audeze Maxwell (OG) review: the audiophile’s gaming headset</a></li><li><a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-elite-review">I spent a month with the most expensive gaming headset on the market — here’s what happened</a></li><li><a href="https://www.tomsguide.com/gaming/gaming-peripherals/fractal-design-scape-review">Fractal Design Scape review: Is this the prettiest gaming headset ever made?</a></li><li><a href="https://www.tomsguide.com/reviews/steelseries-arctis-nova-pro-wireless">SteelSeries Arctis Nova Pro Wireless review</a></li></ul><div data-widget-type="multimodelreview" data-model-name="Audeze Maxwell 2,SteelSeries Arctis Nova Elite,SteelSeries Arctis Nova Pro,Fractal Design Scape,Audeze Maxwell" data-widget-title="Today's best high-end gaming headset deals"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Fractal Design Scape review: Is this the prettiest gaming headset ever made? ]]></title>
                                                                                                <dc:content><![CDATA[ <p>If we judged the <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">best gaming headsets</a> on looks alone, the Fractal Design Scape would’ve won the pageant, taken the money and sped off into the moonlight with one or more of the judges’ spouses. Just look at it. Pure Scandinavian grace.</p><p>It isn’t just a looker, either. It’s built beautifully and sounds great, with detailed, spacious audio and a wide soundstage. There’s a parametric EQ to play around with via the handy companion software. But the <em>pièce de résistance</em> is the included dock, which keeps your desk uncluttered and charges the headset wirelessly between use.</p><p>There are some caveats to those pros. Chief among the Scape’s drawbacks is its microphone, which sounds pretty tinny. Battery life is fairly poor versus the competition, although the charging dock is a major (but not total) antidote to this. And I found the headset a <em>little</em> uncomfortable after a couple of hours.</p><p>But could this headset be the one for you? Find out in my full Fractal Design Scape review.</p><h2 class="article-body__section" id="section-fractal-design-scape-review-cheat-sheet"><span>Fractal Design Scape review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>A gorgeous-to-behold mid-range gaming headset from Fractal</li><li><strong>Who is it for? </strong>Gamers wanting great sound quality and a sleek addition to their desk</li><li><strong>What does it cost?</strong> <a href="https://www.amazon.com/Fractal-Design-Scape-Flip-Mute/dp/B0D5HGK3C2/" target="_blank" rel="nofollow">$199</a> / <a href="https://www.amazon.co.uk/Fractal-Design-FD-HS-SCA1-01-Scape-Dark/dp/B0D5HGK3C2" target="_blank" rel="nofollow">£177</a></li><li><strong>What’s good? </strong>The sound quality, companion app, styling and wireless charging stand</li><li><strong>What’s not?</strong> The mic is crappy, it’s a little uncomfortable and battery life is weak with RGB enabled</li></ul><h2 class="article-body__section" id="section-fractal-design-scape-review-specs"><span>Fractal Design Scape review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/Fractal-Design-Scape-Flip-Mute/dp/B0D5HGK3C2/" target="_blank" rel="nofollow"><u>$199</u></a> / <a href="https://www.amazon.co.uk/Fractal-Design-FD-HS-SCA1-01-Scape-Dark/dp/B0D5HGK3C2" target="_blank" rel="nofollow"><u>£177</u></a></p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Black; White</p></td></tr><tr><td class="firstcol " ><p><strong>Platforms</strong></p></td><td  ><p>PC, Mac, PS5, Switch, iOS, Android</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Wired, 2.4Ghz, Bluetooth</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>Wireless rechargeable</p></td></tr><tr><td class="firstcol " ><p><strong>Battery life</strong></p></td><td  ><p>Up to 40 hours (RGB off); 20 hours (RGB on)</p></td></tr><tr><td class="firstcol " ><p><strong>Frequency response</strong></p></td><td  ><p>20-20,000Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Drivers</strong></p></td><td  ><p>Dynamic</p></td></tr><tr><td class="firstcol " ><p><strong>Multipoint connectivity</strong></p></td><td  ><p>Yes</p></td></tr><tr><td class="firstcol " ><p><strong>Paired devices max</strong></p></td><td  ><p>2x</p></td></tr><tr><td class="firstcol " ><p><strong>Microphone</strong></p></td><td  ><p>1x boom mic</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>12 ounces</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-fractal-design-scape-review-the-ups"><span>Fractal Design Scape review: The ups</span></h2><p>Strong audio quality, gorgeous styling, easy-to-use companion software and a super handy charging dock. There’s a lot about the Scape I love.</p><h2 id="strong-sound-quality">Strong sound quality</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="FCMyXfWhZ5PmLuWuWy3UaJ" name="Fractal_Scape-7.JPG" alt="The Fractal Design Scape on a stone surface with a blue background" src="https://cdn.mos.cms.futurecdn.net/FCMyXfWhZ5PmLuWuWy3UaJ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Obviously, the most important aspect a gaming headset needs to nail is sound quality. And the Scape has that covered.</p><p>Frequency response isn’t the widest at 20-20,000Hz, so it can’t replicate super low 10-20Hz frequencies. I missed the skull-shaking rumbles of artillery and tanks in Hell Let Loose, which you’ll get (or rather, feel) from headsets with the 10-20Hz range covered. The <a href="https://www.tomsguide.com/gaming/gaming-peripherals/audeze-maxwell-2-review">Audeze Maxwell 2</a>, <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-elite-review">SteelSeries Arctis Nova Elite</a> and <a href="https://www.tomsguide.com/reviews/steelseries-arctis-nova-pro-wireless">SteelSeries Arctis Nova Pro</a> all go down to 10Hz, while the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-blackshark-v3-pro-review">Razer BlackShark V3 Pro</a> goes down to 12Hz. That said, 20Hz is still plenty low and allows for most deep sub bass.</p><p>Up top, 20,000Hz is around the maximum frequency the human ear can perceive, meaning the Scape can provide strong clarity and detail in the treble. The Maxwell 2 (50,000Hz), Arctis Nova Pro / Elite (40,000Hz) and BlackShark V3 Pro (28,000Hz) ostensibly have the upper hand here, covering far beyond the range of human hearing. But you can’t hear what you can’t hear, so anything over 20,000Hz is kind of redundant.</p><p>Just like the Maxwell 2 and Nova Elite, the Scape supports (via its 2.4G dongle) wireless streaming in 24-bit/96kHz — that high resolution audio. The <a href="https://www.tomsguide.com/reviews/ps5">PS5</a> can only output in CD-quality 44kHz/16-bit, though, so PC gamers are the primary beneficiaries 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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rNDmSbWf9okHyHUaKwdJVJ" name="Fractal_Scape-3.JPG" alt="The Fractal Design Scape on a stone surface with a blue background" src="https://cdn.mos.cms.futurecdn.net/rNDmSbWf9okHyHUaKwdJVJ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The audio itself is very spacious, demonstrated particularly well in <a href="https://www.tomsguide.com/gaming/kingdom-come-deliverance-2-review">Kingdom Come Deliverance 2</a> (KCD2). Wide dining halls felt truly expansive, with the clattering of cutlery and the hubbub of feasts in the background. Cellars and tunnels sounded cavernous, with the echoes of water and vocals ricocheting off dank masonry. All rather immersive. </p><p>There’s lots of detail in the treble, plus a wide soundstage (which gives three-dimensional sound), making the Scape great for competitive gameplay. Using the Scape’s “Clarity” EQ present on Counter-Strike 2 and in Sniper Elite: Resistance, I could easily detect enemy sound cues, footsteps and reloading sounds, and pinpoint where they were coming from.</p><p>Bass is nice and meaty, especially using the parametric EQ (which I’ll discuss later) to add some extra power to those 60-250Hz frequencies. Again, while it wasn’t skull-shakingly deep, there was still a nice punch to the sounds of artillery in Hell Let Loose and Isonzo.</p><h4 id="music-2">Music</h4><p>The Scape is a highly competent headset for music, too. That super crisp treble and punchy bass is perfect for electronic music, and worked wonders for the snappy percussion and powerful driving bassline of Sub Focus’s <em>Miracle</em>. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8ZnXibY5JUGmTNtojhdwdJ" name="Fractal_Scape-6.JPG" alt="The Fractal Design Scape on a stone surface with a blue background" src="https://cdn.mos.cms.futurecdn.net/8ZnXibY5JUGmTNtojhdwdJ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The airy treble and spacious sound work particularly well in lighter or atmospheric songs, like the surreal, disparate elements of Mk.Gee’s <em>Dream Police</em>, all of which sounded three-dimensional and well-defined. Likewise, it’s often easy for the ethereal vocals of Burn Water’s <em>Ikigai</em> to get buried behind the sound’s huge bassline. Not so on the Scape, although I missed a few of the subtler vocal echoes that I could so easily pick out on the Maxwell 2 with its exceptional top-end clarity.</p><p>Again, bass is mostly very good, although intensely sub-heavy tracks like Skream’s <em>Sub Island</em> felt a little thin at the lower end, and I noticed the occasional hint of distortion on the most powerful bass thrums of Foreign Concept’s <em>Breaking Again</em>. </p><p>Instrument separation is decent, too, and the mid-range is nice and clean. The two distorted guitar riffs of Melvins’ <em>Honey Bucket</em> — a tricky test for mid separation — didn’t get muddied by one another's sludge. I often have to mess around with mids and treble in EQ for this song's riffs to shake free of the bass, and of one another, but the Scape's Balance EQ was perfect from the off. Overall, a strong display befitting <a href="https://www.amazon.com/Fractal-Design-Scape-Flip-Mute/dp/B0D5HGK3C2/" target="_blank" rel="nofollow"><u>$199</u></a>.</p><h2 id="parametric-custom-eq">Parametric custom EQ</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kCra2QngY6Wz2aHQzzpWyH" name="Fractal Scape Adjust Pro Screenshots - 3" alt="The Fractal Design Pro Adjust app being used to adjust headset EQ" src="https://cdn.mos.cms.futurecdn.net/kCra2QngY6Wz2aHQzzpWyH.png" mos="" align="middle" fullscreen="1" width="3200" height="1800" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/kCra2QngY6Wz2aHQzzpWyH.png' 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: Fractal Design / Future)</span></figcaption></figure><p>The Fractal Design Scape’s companion software (covered below) gives you access to a five-band parametric equalizer, which allows you to precisely shape your EQ curve. There are three presents (Depth, Balanced, Clarity), which are all adjustable. You can also switch between these on the fly using a dedicated button on the headset, which I love.</p><p>I got on just fine with the base presets. Depth provided a nice boost to bass frequencies and more immersion in louder war games like Hell Let Loose. Balanced suited wider soundstages and musical scores better, in games like KCD2. And Clarity worked well for boosting footsteps in competitive FPS games. Still, I enjoyed dialling in some extra volume to low frequencies on the Balanced EQ, for some extra fatness to the bass. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bEQWYYfRf8rcgFTF5iTUyH" name="Fractal Scape Adjust Pro Screenshots - 2" alt="The Fractal Design Adjust Pro app being used to adjust custom EQ" src="https://cdn.mos.cms.futurecdn.net/bEQWYYfRf8rcgFTF5iTUyH.png" mos="" align="middle" fullscreen="1" width="3200" height="1800" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/bEQWYYfRf8rcgFTF5iTUyH.png' 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: Fractal Design / Future)</span></figcaption></figure><p>I called my new custom EQ "Balance+" and saved it as a new custom EQ profile, so it didn't overwrite any of the original three presets (but you can always reset those with a single click). You can then select from the base or your own saved presets ad apply them to slots 1-3, which correspond to a physical button on the headset that cycles through EQ profiles (with an LED to tell you which you're using). This is super handy, and lets you quickly flick between your favorite EQs while gaming, without needing to switch applications.</p><h2 id="browser-based-software">Browser-based software</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="gR8YnwuWHiPwCQVKx9FGNJ" name="Fractal Scape Adjust Pro Screenshots - 1" alt="The Fractal Design Adjust Pro app in use to adjust headset lighting" src="https://cdn.mos.cms.futurecdn.net/gR8YnwuWHiPwCQVKx9FGNJ.png" mos="" align="middle" fullscreen="1" width="3200" height="1800" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/gR8YnwuWHiPwCQVKx9FGNJ.png' 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: Fractal Design / Future)</span></figcaption></figure><p>The Scape is adjusted via Fractal’s <a href="https://adjust.fractal-design.com/" target="_blank" rel="nofollow">Adjust Pro</a> web app, which I like a lot. Firstly, I’m a big fan of browser-based software to begin with, at least in theory. Browser software naturally means you needn’t install any software on your device, plus it lets you tweak your hardware from any computer. It’s just quicker, slicker and more versatile.</p><p>Adjust Pro is pretty good, too. You can update the headset or dongle, tweak the RGB lighting and, of course, adjust EQ. It isn’t anywhere near as comprehensive as SteelSeries’ GG app, with its exhaustive array of EQ presets and multi-channel mixer. But hell, I don’t <em>really</em> need all that. A solid EQ and a way to update the thing, wrapped in a quick-to-open and easy-to-use package? You had me at “a solid EQ”.</p><h2 id="gorgeous-design">Gorgeous design</h2><p>I love having this thing on my desk. It’s probably the best-looking headset I’ve seen, let alone tested, with the only competition being the Razer BlackShark V3 Pro. Even still, the Razer can’t match the Scape’s sheer Scandi sophistication.</p><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="sLVUiZTV3gnQfJYBXBW6eJ" name="Fractal_Scape-4.JPG" alt="The Fractal Design Scape on a stone surface with a blue background" src="https://cdn.mos.cms.futurecdn.net/sLVUiZTV3gnQfJYBXBW6eJ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>It’s available in black or white and looks just as good in either. That’s saying something, as white is an easy color with which to make a headset look gaudy — looking at you, <a href="https://www.tomsguide.com/gaming/gaming-peripherals/alienware-pro-wireless-gaming-headset-review">Alienware Pro</a> and SteelSeries Arctis Nova <em>[insert any model here]</em>. I prefer the black, but I wouldn’t turn down the white variant either. </p><p>There are RGB lights in each of the earcups, but these are fairly small and inoffensive. It’d have been easy to ruin the look with tacky RGB, but Fractal has implemented the lighting with restraint and employed a diffuser. The result is that the soft glow of the LEDs enhances rather than spoils the headset’s sleek aesthetic.</p><p>Build quality is exquisite, too, helping justify the <a href="https://www.amazon.com/Fractal-Design-Scape-Flip-Mute/dp/B0D5HGK3C2/" target="_blank" rel="nofollow"><u>$199</u></a> price tag. The earcups are highly padded and made from high-quality fabric, allowing breathability. The headset feels very sturdy and uses high-quality plastics for the earcups and headband, with lightweight aluminum for the adjustment mechanisms. I love the digital crown for volume on the left earcup. It’s aluminum, feels lovely and has a pleasing level of resistance to stop you turning it accidentally. A far cry from the cheap dials of the similarly-priced <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-7-gen-2-review">SteelSeries Arctis Nova 7 Gen 2</a> I reviewed immediately before the Scape.</p><h2 id="charging-dock">Charging dock</h2><p>I test a lot of headsets, and storing them is a perennial headache. They don’t sit well unless on a stand, which very few manufacturers supply by default. So kudos to Fractal for supplying a stand to begin with, wireless charging or not. Third-party stands are often shaky and fragile thanks to their thin, upright nature, but the Scape’s stand supports it all magnetically from the bottom. That means a low center of gravity and a very sturdy stand. </p><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="NEArxwQNQevMWawnqhhGZJ" name="Fractal_Scape-1.JPG" alt="The Fractal Design Scape on a stone surface with a blue background" src="https://cdn.mos.cms.futurecdn.net/NEArxwQNQevMWawnqhhGZJ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Given how good the Scape looks, I’ve chosen to keep it on my desk (instead of my shelf of loose headsets), where it tucks conveniently into a gap between my monitor and speakers. It’s always at hand when I want it, and always charged…</p><p>See, the dock’s magnetic attachment points feature wireless charging pads, so the headset is always at 100% when I pick it up. I’ll cover the comparatively weak 20-hour battery life in more detail below, but the dock is essentially a complete antidote to that. Let’s be real: I don’t know anyone who games for 20 hours straight. But if you do, you shouldn’t. So when gaming at home, you’ll always have a charged headset when you start playing.</p><p>The dock plugs into your PC via USB-A and also serves as a pass-through hub for the 2.4G dongle, which slots into the underside of the base. Another small feature that helps keep your desk and laptop/motherboard slots tidy.</p><h2 class="article-body__section" id="section-fractal-design-scape-review-the-downs"><span>Fractal Design Scape review: The downs</span></h2><p>While I love the Scape, it isn’t perfect. The tinny microphone is its main flaw, although I had some minor comfort issues, and battery life isn’t the best, which could hamper gaming on the move.</p><h2 id="tinny-microphone">Tinny microphone</h2><p>Unfortunately, the Scape’s microphone is very poor. On day one of testing, I used a work meeting to put the headset through a conference call test. This specific call was a particular toughie, including the entirety of the Tom’s Guide TV/AV and reviews teams.</p><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="JT6NdYrJt7q2xVkvHA9sdJ" name="Fractal_Scape-8.JPG" alt="The Fractal Design Scape on a stone surface with a blue background" src="https://cdn.mos.cms.futurecdn.net/JT6NdYrJt7q2xVkvHA9sdJ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I entered the call and informed my colleagues I was testing the mic, only to find myself staring at a screen full of scowls. “Tinny,” “quiet,” “distorted,” “Yuck.” And that was the polite stuff. Their feedback was mirrored in my recording tests afterwards. You can hear from the audio clip below that it isn’t a strong show. <br></p><audio src="https://cdn.mos.cms.futurecdn.net/mjr9a5Vug5P3S43xJVyfGE/Fractal%20Design%20Scape%20Mic%20Test.mp3"  controls="controls" preload="none"></audio><p><br>This is obviously disappointing on a <a href="https://www.amazon.com/Fractal-Design-Scape-Flip-Mute/dp/B0D5HGK3C2/" target="_blank" rel="nofollow"><u>$199</u></a> headset, but admittedly, it isn’t uncommon. The SteelSeries Arctis Nova 7 Gen 2, also $199, features a similarly tinny mic. In fact, most gaming headset mics are designed to be fine for in-game chat and nothing more.</p><p>If you want to (or already) stream, opt for the Audeze Maxwell 2, whose mic is excellent, or invest in a proper streaming mic like the <a href="https://www.tomsguide.com/audio/microphones/shure-mv6-microphone-review">Shure MV6</a>.</p><h2 id="minor-comfort-issues">Minor comfort issues</h2><p>I’ve seen online reports that the Scape’s headband is quite tight, resulting in temple pressure and headaches. This’ll depend on your head shape, but I can see where they’re coming from. I initially found the headband a little tight, but the larger earcups gave me the leeway to drop the cans down a little and resolve the problem.</p><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="JS4RmXyZpXnabvNcMJqpdJ" name="Fractal_Scape-9.JPG" alt="The Fractal Design Scape on a stone surface with a blue background" src="https://cdn.mos.cms.futurecdn.net/JS4RmXyZpXnabvNcMJqpdJ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The headband padding is also a little too thin at the front, so the headband itself can dig into your scalp at certain angles. After a few hours, this started to get a little uncomfortable, although a quick reposition solved it. Again, everyone’s head is different, so what’s uncomfortable for me may be fine for you. </p><p>I wish Fractal had used a suspended inner headband design, though. I just don’t see why any manufacturer would go for a single padded outer band — an outdated design now. Suspended inner bands are much more comfortable, relieve pressure and should last better too, as there’s no padding to go flat over time. </p><p>A few worthy alternatives with suspended bands are the SteelSeries Arctis Nova Pro, Audeze Maxwell 2 and <a href="https://www.tomsguide.com/gaming/gaming-peripherals/asus-rog-pelta-gaming-headset-review">Asus ROG Pelta</a>.</p><h2 id="relatively-weak-battery-life">Relatively weak battery life</h2><p>This is a very soft con, but I can see it being problematic for certain users, so it’s made the list nonetheless. The Scape has a rated battery life of 40 hours with RGB off and 20 hours with it on. And those figures are on point. Each hour I gamed with RGB on, the Scape dropped around 5% of charge.</p><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="QCaMD3XoaXWosqky6fP2eJ" name="Fractal_Scape-5.JPG" alt="The Fractal Design Scape on a stone surface with a blue background" src="https://cdn.mos.cms.futurecdn.net/QCaMD3XoaXWosqky6fP2eJ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Compared to other headsets, 20 hours is fairly paltry. The Maxwell 2 boasts 80 hours, while the Alienware Pro and BlackShark V3 Pro can both last 70. The thing is, how often do you play past 20 hours? If you’re doing that regularly, you shouldn’t. </p><p>Otherwise, realistically, you’ll never reach the furthest extent of the Scape’s lowest rating before you can charge it. And it’ll live in its dock when not in use, so it’s not like you’ll have to make an effort to plug it in. </p><p>Where I <em>can</em> see this being a problem is gaming on the move. If you’re travelling with your <a href="https://www.tomsguide.com/gaming/nintendo/nintendo-switch-2-console-review">Switch 2</a> or <a href="https://www.tomsguide.com/reviews/steam-deck-review-the-nintendo-switch-for-adults">Steam Deck</a>, you’ll need as much battery life as possible. Even the 40-hour RGB-off figure is still half of rivals. The fact remains that less is less, and here, that’s what you’re getting. </p><h2 id="not-for-xbox-owners">Not for Xbox owners</h2><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="eCnFs9xrbky8NgGSehbjXJ" name="Fractal_Scape-2.JPG" alt="The Fractal Design Scape on a stone surface with a blue background" src="https://cdn.mos.cms.futurecdn.net/eCnFs9xrbky8NgGSehbjXJ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Unfortunately, the Fractal Design Scape is not compatible with Xbox. According to Fractal Design, this is because “Xbox has its proprietary Xbox Wireless protocol that requires certain hardware to be installed for full compatibility. Since we do not have that proprietary hardware, our Scape headset will not be able to connect to an Xbox console.”</p><p>So basically, for whatever reason, Fractal Design couldn’t or chose not to license the hardware required for Xbox compatibility. That’ll be frustrating for Xbox users, no doubt. From a tech reviewer’s perspective, we see plenty of console exclusive hardware here, so I’m not holding a grudge against Fractal for this. If you want a premium headset for Xbox gaming, though, check out the Razer BlackShark V3 Pro.</p><h2 class="article-body__section" id="section-fractal-design-scape-review-verdict"><span>Fractal Design Scape review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="fjiVTtLd7rSKPqbgin8jYJ" name="Fractal_Scape-10.JPG" alt="The Fractal Design Scape on a stone surface with a blue background" src="https://cdn.mos.cms.futurecdn.net/fjiVTtLd7rSKPqbgin8jYJ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I really, really like the Fractal Design Scape. Aside from the tinny mic (which should only really impact people wanting to stream), most of its flaws are fairly forgivable. I had some very minor issues on the comfort front and battery life isn’t the best, but with the dock, you won’t be running out of juice unless you game in +20-hour stints anyway. The elephant in the room is the lack of Xbox compatibility, but that’s more of a pre-purchase consideration in my mind — we test plenty of console exclusive gear here, so it’s not a huge deal for me.</p><p>Anyway, the Scape’s design is gorgeous, and the inclusion of the wireless charging dock is extremely handy, keeping your desk neat and ensuring the headset stays charged. Most importantly, the sound quality is very strong, making this an excellent all-rounder for gaming and music. And come on… just look at it.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/fractal-design-scape-review</link>
                                                                            <description>
                            <![CDATA[ The sophisticated Fractal Design Scape is more than just a looker. It sounds great and comes with a useful charging dock, although the mic is quite tinny. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">TX6tf8EBsvpExfgSD5C7Z4</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/fjiVTtLd7rSKPqbgin8jYJ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 19 Feb 2026 14:16:38 +0000</pubDate>                                                                                                                                <updated>Thu, 26 Mar 2026 10:31:32 +0000</updated>
                                                                                                                                            <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                <author><![CDATA[ peter.wolinski@futurenet.com (Peter Wolinski) ]]></author>                    <dc:creator><![CDATA[ Peter Wolinski ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/stgPfXWY7ukw8J8rfC7vjg.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Peter is a Senior Editor at Tom&#039;s Guide, heading up the site&#039;s Reviews team and Cameras section. Having built gaming PCs since he was 10 (that&#039;s a while ago now) he&#039;s a bit of a nerd about components and hardware. He&#039;s also been an iPhone user since the classic iPhone 4, and a Mac user for well over a decade. Experienced in using and testing all kinds of technology — from phones through to tablets, computers, games consoles, cameras and smart home tech — helping people find the best tech for them (at the best prices) is what Peter does best. A photographer since he bought his first camera (a Fujifilm) in 2015, Peter was previously an Editor for Canon-Europe.com. He then edited the Cameras and How To sections of Tom&#039;s Guide. When he&#039;s not crafting helpful, in-depth reviews, Peter can usually be found out and about honing his architectural photography skills, riding his motorcycle around Welsh mountain roads, telling everyone about his two greyhounds, squeezing a few extra FPS out of PC games or perfecting his espresso shots.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/fjiVTtLd7rSKPqbgin8jYJ-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Fractal Design Scape on a stone surface with a blue background]]></media:description>                                                            <media:text><![CDATA[The Fractal Design Scape on a stone surface with a blue background]]></media:text>
                                <media:title type="plain"><![CDATA[The Fractal Design Scape on a stone surface with a blue background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/fjiVTtLd7rSKPqbgin8jYJ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If we judged the <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">best gaming headsets</a> on looks alone, the Fractal Design Scape would’ve won the pageant, taken the money and sped off into the moonlight with one or more of the judges’ spouses. Just look at it. Pure Scandinavian grace.</p><p>It isn’t just a looker, either. It’s built beautifully and sounds great, with detailed, spacious audio and a wide soundstage. There’s a parametric EQ to play around with via the handy companion software. But the <em>pièce de résistance</em> is the included dock, which keeps your desk uncluttered and charges the headset wirelessly between use.</p><p>There are some caveats to those pros. Chief among the Scape’s drawbacks is its microphone, which sounds pretty tinny. Battery life is fairly poor versus the competition, although the charging dock is a major (but not total) antidote to this. And I found the headset a <em>little</em> uncomfortable after a couple of hours.</p><p>But could this headset be the one for you? Find out in my full Fractal Design Scape review.</p><h2 class="article-body__section" id="section-fractal-design-scape-review-cheat-sheet"><span>Fractal Design Scape review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>A gorgeous-to-behold mid-range gaming headset from Fractal</li><li><strong>Who is it for? </strong>Gamers wanting great sound quality and a sleek addition to their desk</li><li><strong>What does it cost?</strong> <a href="https://www.amazon.com/Fractal-Design-Scape-Flip-Mute/dp/B0D5HGK3C2/" target="_blank" rel="nofollow">$199</a> / <a href="https://www.amazon.co.uk/Fractal-Design-FD-HS-SCA1-01-Scape-Dark/dp/B0D5HGK3C2" target="_blank" rel="nofollow">£177</a></li><li><strong>What’s good? </strong>The sound quality, companion app, styling and wireless charging stand</li><li><strong>What’s not?</strong> The mic is crappy, it’s a little uncomfortable and battery life is weak with RGB enabled</li></ul><h2 class="article-body__section" id="section-fractal-design-scape-review-specs"><span>Fractal Design Scape review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/Fractal-Design-Scape-Flip-Mute/dp/B0D5HGK3C2/" target="_blank" rel="nofollow"><u>$199</u></a> / <a href="https://www.amazon.co.uk/Fractal-Design-FD-HS-SCA1-01-Scape-Dark/dp/B0D5HGK3C2" target="_blank" rel="nofollow"><u>£177</u></a></p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Black; White</p></td></tr><tr><td class="firstcol " ><p><strong>Platforms</strong></p></td><td  ><p>PC, Mac, PS5, Switch, iOS, Android</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Wired, 2.4Ghz, Bluetooth</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>Wireless rechargeable</p></td></tr><tr><td class="firstcol " ><p><strong>Battery life</strong></p></td><td  ><p>Up to 40 hours (RGB off); 20 hours (RGB on)</p></td></tr><tr><td class="firstcol " ><p><strong>Frequency response</strong></p></td><td  ><p>20-20,000Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Drivers</strong></p></td><td  ><p>Dynamic</p></td></tr><tr><td class="firstcol " ><p><strong>Multipoint connectivity</strong></p></td><td  ><p>Yes</p></td></tr><tr><td class="firstcol " ><p><strong>Paired devices max</strong></p></td><td  ><p>2x</p></td></tr><tr><td class="firstcol " ><p><strong>Microphone</strong></p></td><td  ><p>1x boom mic</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>12 ounces</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-fractal-design-scape-review-the-ups"><span>Fractal Design Scape review: The ups</span></h2><p>Strong audio quality, gorgeous styling, easy-to-use companion software and a super handy charging dock. There’s a lot about the Scape I love.</p><h2 id="strong-sound-quality">Strong sound quality</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="FCMyXfWhZ5PmLuWuWy3UaJ" name="Fractal_Scape-7.JPG" alt="The Fractal Design Scape on a stone surface with a blue background" src="https://cdn.mos.cms.futurecdn.net/FCMyXfWhZ5PmLuWuWy3UaJ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Obviously, the most important aspect a gaming headset needs to nail is sound quality. And the Scape has that covered.</p><p>Frequency response isn’t the widest at 20-20,000Hz, so it can’t replicate super low 10-20Hz frequencies. I missed the skull-shaking rumbles of artillery and tanks in Hell Let Loose, which you’ll get (or rather, feel) from headsets with the 10-20Hz range covered. The <a href="https://www.tomsguide.com/gaming/gaming-peripherals/audeze-maxwell-2-review">Audeze Maxwell 2</a>, <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-elite-review">SteelSeries Arctis Nova Elite</a> and <a href="https://www.tomsguide.com/reviews/steelseries-arctis-nova-pro-wireless">SteelSeries Arctis Nova Pro</a> all go down to 10Hz, while the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-blackshark-v3-pro-review">Razer BlackShark V3 Pro</a> goes down to 12Hz. That said, 20Hz is still plenty low and allows for most deep sub bass.</p><p>Up top, 20,000Hz is around the maximum frequency the human ear can perceive, meaning the Scape can provide strong clarity and detail in the treble. The Maxwell 2 (50,000Hz), Arctis Nova Pro / Elite (40,000Hz) and BlackShark V3 Pro (28,000Hz) ostensibly have the upper hand here, covering far beyond the range of human hearing. But you can’t hear what you can’t hear, so anything over 20,000Hz is kind of redundant.</p><p>Just like the Maxwell 2 and Nova Elite, the Scape supports (via its 2.4G dongle) wireless streaming in 24-bit/96kHz — that high resolution audio. The <a href="https://www.tomsguide.com/reviews/ps5">PS5</a> can only output in CD-quality 44kHz/16-bit, though, so PC gamers are the primary beneficiaries 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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rNDmSbWf9okHyHUaKwdJVJ" name="Fractal_Scape-3.JPG" alt="The Fractal Design Scape on a stone surface with a blue background" src="https://cdn.mos.cms.futurecdn.net/rNDmSbWf9okHyHUaKwdJVJ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The audio itself is very spacious, demonstrated particularly well in <a href="https://www.tomsguide.com/gaming/kingdom-come-deliverance-2-review">Kingdom Come Deliverance 2</a> (KCD2). Wide dining halls felt truly expansive, with the clattering of cutlery and the hubbub of feasts in the background. Cellars and tunnels sounded cavernous, with the echoes of water and vocals ricocheting off dank masonry. All rather immersive. </p><p>There’s lots of detail in the treble, plus a wide soundstage (which gives three-dimensional sound), making the Scape great for competitive gameplay. Using the Scape’s “Clarity” EQ present on Counter-Strike 2 and in Sniper Elite: Resistance, I could easily detect enemy sound cues, footsteps and reloading sounds, and pinpoint where they were coming from.</p><p>Bass is nice and meaty, especially using the parametric EQ (which I’ll discuss later) to add some extra power to those 60-250Hz frequencies. Again, while it wasn’t skull-shakingly deep, there was still a nice punch to the sounds of artillery in Hell Let Loose and Isonzo.</p><h4 id="music-2">Music</h4><p>The Scape is a highly competent headset for music, too. That super crisp treble and punchy bass is perfect for electronic music, and worked wonders for the snappy percussion and powerful driving bassline of Sub Focus’s <em>Miracle</em>. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8ZnXibY5JUGmTNtojhdwdJ" name="Fractal_Scape-6.JPG" alt="The Fractal Design Scape on a stone surface with a blue background" src="https://cdn.mos.cms.futurecdn.net/8ZnXibY5JUGmTNtojhdwdJ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The airy treble and spacious sound work particularly well in lighter or atmospheric songs, like the surreal, disparate elements of Mk.Gee’s <em>Dream Police</em>, all of which sounded three-dimensional and well-defined. Likewise, it’s often easy for the ethereal vocals of Burn Water’s <em>Ikigai</em> to get buried behind the sound’s huge bassline. Not so on the Scape, although I missed a few of the subtler vocal echoes that I could so easily pick out on the Maxwell 2 with its exceptional top-end clarity.</p><p>Again, bass is mostly very good, although intensely sub-heavy tracks like Skream’s <em>Sub Island</em> felt a little thin at the lower end, and I noticed the occasional hint of distortion on the most powerful bass thrums of Foreign Concept’s <em>Breaking Again</em>. </p><p>Instrument separation is decent, too, and the mid-range is nice and clean. The two distorted guitar riffs of Melvins’ <em>Honey Bucket</em> — a tricky test for mid separation — didn’t get muddied by one another's sludge. I often have to mess around with mids and treble in EQ for this song's riffs to shake free of the bass, and of one another, but the Scape's Balance EQ was perfect from the off. Overall, a strong display befitting <a href="https://www.amazon.com/Fractal-Design-Scape-Flip-Mute/dp/B0D5HGK3C2/" target="_blank" rel="nofollow"><u>$199</u></a>.</p><h2 id="parametric-custom-eq">Parametric custom EQ</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kCra2QngY6Wz2aHQzzpWyH" name="Fractal Scape Adjust Pro Screenshots - 3" alt="The Fractal Design Pro Adjust app being used to adjust headset EQ" src="https://cdn.mos.cms.futurecdn.net/kCra2QngY6Wz2aHQzzpWyH.png" mos="" align="middle" fullscreen="1" width="3200" height="1800" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/kCra2QngY6Wz2aHQzzpWyH.png' 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: Fractal Design / Future)</span></figcaption></figure><p>The Fractal Design Scape’s companion software (covered below) gives you access to a five-band parametric equalizer, which allows you to precisely shape your EQ curve. There are three presents (Depth, Balanced, Clarity), which are all adjustable. You can also switch between these on the fly using a dedicated button on the headset, which I love.</p><p>I got on just fine with the base presets. Depth provided a nice boost to bass frequencies and more immersion in louder war games like Hell Let Loose. Balanced suited wider soundstages and musical scores better, in games like KCD2. And Clarity worked well for boosting footsteps in competitive FPS games. Still, I enjoyed dialling in some extra volume to low frequencies on the Balanced EQ, for some extra fatness to the bass. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bEQWYYfRf8rcgFTF5iTUyH" name="Fractal Scape Adjust Pro Screenshots - 2" alt="The Fractal Design Adjust Pro app being used to adjust custom EQ" src="https://cdn.mos.cms.futurecdn.net/bEQWYYfRf8rcgFTF5iTUyH.png" mos="" align="middle" fullscreen="1" width="3200" height="1800" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/bEQWYYfRf8rcgFTF5iTUyH.png' 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: Fractal Design / Future)</span></figcaption></figure><p>I called my new custom EQ "Balance+" and saved it as a new custom EQ profile, so it didn't overwrite any of the original three presets (but you can always reset those with a single click). You can then select from the base or your own saved presets ad apply them to slots 1-3, which correspond to a physical button on the headset that cycles through EQ profiles (with an LED to tell you which you're using). This is super handy, and lets you quickly flick between your favorite EQs while gaming, without needing to switch applications.</p><h2 id="browser-based-software">Browser-based software</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="gR8YnwuWHiPwCQVKx9FGNJ" name="Fractal Scape Adjust Pro Screenshots - 1" alt="The Fractal Design Adjust Pro app in use to adjust headset lighting" src="https://cdn.mos.cms.futurecdn.net/gR8YnwuWHiPwCQVKx9FGNJ.png" mos="" align="middle" fullscreen="1" width="3200" height="1800" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/gR8YnwuWHiPwCQVKx9FGNJ.png' 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: Fractal Design / Future)</span></figcaption></figure><p>The Scape is adjusted via Fractal’s <a href="https://adjust.fractal-design.com/" target="_blank" rel="nofollow">Adjust Pro</a> web app, which I like a lot. Firstly, I’m a big fan of browser-based software to begin with, at least in theory. Browser software naturally means you needn’t install any software on your device, plus it lets you tweak your hardware from any computer. It’s just quicker, slicker and more versatile.</p><p>Adjust Pro is pretty good, too. You can update the headset or dongle, tweak the RGB lighting and, of course, adjust EQ. It isn’t anywhere near as comprehensive as SteelSeries’ GG app, with its exhaustive array of EQ presets and multi-channel mixer. But hell, I don’t <em>really</em> need all that. A solid EQ and a way to update the thing, wrapped in a quick-to-open and easy-to-use package? You had me at “a solid EQ”.</p><h2 id="gorgeous-design">Gorgeous design</h2><p>I love having this thing on my desk. It’s probably the best-looking headset I’ve seen, let alone tested, with the only competition being the Razer BlackShark V3 Pro. Even still, the Razer can’t match the Scape’s sheer Scandi sophistication.</p><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="sLVUiZTV3gnQfJYBXBW6eJ" name="Fractal_Scape-4.JPG" alt="The Fractal Design Scape on a stone surface with a blue background" src="https://cdn.mos.cms.futurecdn.net/sLVUiZTV3gnQfJYBXBW6eJ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>It’s available in black or white and looks just as good in either. That’s saying something, as white is an easy color with which to make a headset look gaudy — looking at you, <a href="https://www.tomsguide.com/gaming/gaming-peripherals/alienware-pro-wireless-gaming-headset-review">Alienware Pro</a> and SteelSeries Arctis Nova <em>[insert any model here]</em>. I prefer the black, but I wouldn’t turn down the white variant either. </p><p>There are RGB lights in each of the earcups, but these are fairly small and inoffensive. It’d have been easy to ruin the look with tacky RGB, but Fractal has implemented the lighting with restraint and employed a diffuser. The result is that the soft glow of the LEDs enhances rather than spoils the headset’s sleek aesthetic.</p><p>Build quality is exquisite, too, helping justify the <a href="https://www.amazon.com/Fractal-Design-Scape-Flip-Mute/dp/B0D5HGK3C2/" target="_blank" rel="nofollow"><u>$199</u></a> price tag. The earcups are highly padded and made from high-quality fabric, allowing breathability. The headset feels very sturdy and uses high-quality plastics for the earcups and headband, with lightweight aluminum for the adjustment mechanisms. I love the digital crown for volume on the left earcup. It’s aluminum, feels lovely and has a pleasing level of resistance to stop you turning it accidentally. A far cry from the cheap dials of the similarly-priced <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-7-gen-2-review">SteelSeries Arctis Nova 7 Gen 2</a> I reviewed immediately before the Scape.</p><h2 id="charging-dock">Charging dock</h2><p>I test a lot of headsets, and storing them is a perennial headache. They don’t sit well unless on a stand, which very few manufacturers supply by default. So kudos to Fractal for supplying a stand to begin with, wireless charging or not. Third-party stands are often shaky and fragile thanks to their thin, upright nature, but the Scape’s stand supports it all magnetically from the bottom. That means a low center of gravity and a very sturdy stand. </p><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="NEArxwQNQevMWawnqhhGZJ" name="Fractal_Scape-1.JPG" alt="The Fractal Design Scape on a stone surface with a blue background" src="https://cdn.mos.cms.futurecdn.net/NEArxwQNQevMWawnqhhGZJ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Given how good the Scape looks, I’ve chosen to keep it on my desk (instead of my shelf of loose headsets), where it tucks conveniently into a gap between my monitor and speakers. It’s always at hand when I want it, and always charged…</p><p>See, the dock’s magnetic attachment points feature wireless charging pads, so the headset is always at 100% when I pick it up. I’ll cover the comparatively weak 20-hour battery life in more detail below, but the dock is essentially a complete antidote to that. Let’s be real: I don’t know anyone who games for 20 hours straight. But if you do, you shouldn’t. So when gaming at home, you’ll always have a charged headset when you start playing.</p><p>The dock plugs into your PC via USB-A and also serves as a pass-through hub for the 2.4G dongle, which slots into the underside of the base. Another small feature that helps keep your desk and laptop/motherboard slots tidy.</p><h2 class="article-body__section" id="section-fractal-design-scape-review-the-downs"><span>Fractal Design Scape review: The downs</span></h2><p>While I love the Scape, it isn’t perfect. The tinny microphone is its main flaw, although I had some minor comfort issues, and battery life isn’t the best, which could hamper gaming on the move.</p><h2 id="tinny-microphone">Tinny microphone</h2><p>Unfortunately, the Scape’s microphone is very poor. On day one of testing, I used a work meeting to put the headset through a conference call test. This specific call was a particular toughie, including the entirety of the Tom’s Guide TV/AV and reviews teams.</p><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="JT6NdYrJt7q2xVkvHA9sdJ" name="Fractal_Scape-8.JPG" alt="The Fractal Design Scape on a stone surface with a blue background" src="https://cdn.mos.cms.futurecdn.net/JT6NdYrJt7q2xVkvHA9sdJ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I entered the call and informed my colleagues I was testing the mic, only to find myself staring at a screen full of scowls. “Tinny,” “quiet,” “distorted,” “Yuck.” And that was the polite stuff. Their feedback was mirrored in my recording tests afterwards. You can hear from the audio clip below that it isn’t a strong show. <br></p><audio src="https://cdn.mos.cms.futurecdn.net/mjr9a5Vug5P3S43xJVyfGE/Fractal%20Design%20Scape%20Mic%20Test.mp3"  controls="controls" preload="none"></audio><p><br>This is obviously disappointing on a <a href="https://www.amazon.com/Fractal-Design-Scape-Flip-Mute/dp/B0D5HGK3C2/" target="_blank" rel="nofollow"><u>$199</u></a> headset, but admittedly, it isn’t uncommon. The SteelSeries Arctis Nova 7 Gen 2, also $199, features a similarly tinny mic. In fact, most gaming headset mics are designed to be fine for in-game chat and nothing more.</p><p>If you want to (or already) stream, opt for the Audeze Maxwell 2, whose mic is excellent, or invest in a proper streaming mic like the <a href="https://www.tomsguide.com/audio/microphones/shure-mv6-microphone-review">Shure MV6</a>.</p><h2 id="minor-comfort-issues">Minor comfort issues</h2><p>I’ve seen online reports that the Scape’s headband is quite tight, resulting in temple pressure and headaches. This’ll depend on your head shape, but I can see where they’re coming from. I initially found the headband a little tight, but the larger earcups gave me the leeway to drop the cans down a little and resolve the problem.</p><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="JS4RmXyZpXnabvNcMJqpdJ" name="Fractal_Scape-9.JPG" alt="The Fractal Design Scape on a stone surface with a blue background" src="https://cdn.mos.cms.futurecdn.net/JS4RmXyZpXnabvNcMJqpdJ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The headband padding is also a little too thin at the front, so the headband itself can dig into your scalp at certain angles. After a few hours, this started to get a little uncomfortable, although a quick reposition solved it. Again, everyone’s head is different, so what’s uncomfortable for me may be fine for you. </p><p>I wish Fractal had used a suspended inner headband design, though. I just don’t see why any manufacturer would go for a single padded outer band — an outdated design now. Suspended inner bands are much more comfortable, relieve pressure and should last better too, as there’s no padding to go flat over time. </p><p>A few worthy alternatives with suspended bands are the SteelSeries Arctis Nova Pro, Audeze Maxwell 2 and <a href="https://www.tomsguide.com/gaming/gaming-peripherals/asus-rog-pelta-gaming-headset-review">Asus ROG Pelta</a>.</p><h2 id="relatively-weak-battery-life">Relatively weak battery life</h2><p>This is a very soft con, but I can see it being problematic for certain users, so it’s made the list nonetheless. The Scape has a rated battery life of 40 hours with RGB off and 20 hours with it on. And those figures are on point. Each hour I gamed with RGB on, the Scape dropped around 5% of charge.</p><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="QCaMD3XoaXWosqky6fP2eJ" name="Fractal_Scape-5.JPG" alt="The Fractal Design Scape on a stone surface with a blue background" src="https://cdn.mos.cms.futurecdn.net/QCaMD3XoaXWosqky6fP2eJ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Compared to other headsets, 20 hours is fairly paltry. The Maxwell 2 boasts 80 hours, while the Alienware Pro and BlackShark V3 Pro can both last 70. The thing is, how often do you play past 20 hours? If you’re doing that regularly, you shouldn’t. </p><p>Otherwise, realistically, you’ll never reach the furthest extent of the Scape’s lowest rating before you can charge it. And it’ll live in its dock when not in use, so it’s not like you’ll have to make an effort to plug it in. </p><p>Where I <em>can</em> see this being a problem is gaming on the move. If you’re travelling with your <a href="https://www.tomsguide.com/gaming/nintendo/nintendo-switch-2-console-review">Switch 2</a> or <a href="https://www.tomsguide.com/reviews/steam-deck-review-the-nintendo-switch-for-adults">Steam Deck</a>, you’ll need as much battery life as possible. Even the 40-hour RGB-off figure is still half of rivals. The fact remains that less is less, and here, that’s what you’re getting. </p><h2 id="not-for-xbox-owners">Not for Xbox owners</h2><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="eCnFs9xrbky8NgGSehbjXJ" name="Fractal_Scape-2.JPG" alt="The Fractal Design Scape on a stone surface with a blue background" src="https://cdn.mos.cms.futurecdn.net/eCnFs9xrbky8NgGSehbjXJ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Unfortunately, the Fractal Design Scape is not compatible with Xbox. According to Fractal Design, this is because “Xbox has its proprietary Xbox Wireless protocol that requires certain hardware to be installed for full compatibility. Since we do not have that proprietary hardware, our Scape headset will not be able to connect to an Xbox console.”</p><p>So basically, for whatever reason, Fractal Design couldn’t or chose not to license the hardware required for Xbox compatibility. That’ll be frustrating for Xbox users, no doubt. From a tech reviewer’s perspective, we see plenty of console exclusive hardware here, so I’m not holding a grudge against Fractal for this. If you want a premium headset for Xbox gaming, though, check out the Razer BlackShark V3 Pro.</p><h2 class="article-body__section" id="section-fractal-design-scape-review-verdict"><span>Fractal Design Scape review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="fjiVTtLd7rSKPqbgin8jYJ" name="Fractal_Scape-10.JPG" alt="The Fractal Design Scape on a stone surface with a blue background" src="https://cdn.mos.cms.futurecdn.net/fjiVTtLd7rSKPqbgin8jYJ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I really, really like the Fractal Design Scape. Aside from the tinny mic (which should only really impact people wanting to stream), most of its flaws are fairly forgivable. I had some very minor issues on the comfort front and battery life isn’t the best, but with the dock, you won’t be running out of juice unless you game in +20-hour stints anyway. The elephant in the room is the lack of Xbox compatibility, but that’s more of a pre-purchase consideration in my mind — we test plenty of console exclusive gear here, so it’s not a huge deal for me.</p><p>Anyway, the Scape’s design is gorgeous, and the inclusion of the wireless charging dock is extremely handy, keeping your desk neat and ensuring the headset stays charged. Most importantly, the sound quality is very strong, making this an excellent all-rounder for gaming and music. And come on… just look at it.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
            </channel>
</rss>