<?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/microsoft" rel="self" type="application/rss+xml" />
                            <title><![CDATA[ Latest from Tom's Guide in Microsoft ]]></title>
                <link>https://www.tomsguide.com/tag/microsoft</link>
        <description><![CDATA[ All the latest microsoft content from the Tom's Guide team ]]></description>
                                    <lastBuildDate>Mon, 07 Sep 2026 08:00:00 +0000</lastBuildDate>
                            <language>en</language>
                                <item>
                                                            <title><![CDATA[ I spoke to the Microsoft PM rebuilding Windows 11 for Nvidia RTX Spark: The radical reinvention building the first true MacBook Pro threat ]]></title>
                                                                                                <dc:content><![CDATA[ <p>For eight grueling months leading up to the end of last year, engineers from Microsoft and Nvidia worked side by side from the silicon bootstrap level upward. And the goal? Making Windows 11 play nice with an unprecedented architectural shift: an Arm-based CPU sharing massive unified memory with a desktop-class Nvidia RTX GPU.</p><p>And then, the first <a href="https://www.tomsguide.com/computing/laptops/nvidias-rtx-spark-n1x-drops-this-october-why-apple-silicon-should-be-terrified-and-our-price-predictions">RTX Spark</a> machine finally booted. The red LED lit up, and as Microsoft's Principal Product Manager, Peter Dawoud, recalls it: “half of Santa Clara was jumping.” This was a huge undertaking, but now the real work begins: fine-tuning everything.</p><p>RTX Spark isn’t just another laptop sticker; it pushed Microsoft to fundamentally overhaul five foundational subsystems inside Windows 11 to bridge the gap between low-power Arm efficiency, top-tier AAA gaming, and local agentic AI.</p><p>I spoke to Dawoud about the software underpinning Team Green’s hardware because, as he said, “Windows kind of had to get all these subsystems right all at the same time, so that you can enjoy an RTX Spark device and take the most advantage out of it.”</p><h2 id="a-prism-emulator-overhaul">A Prism Emulator overhaul</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="oWfTLRd5NPjKy6jDQeEsq4" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/oWfTLRd5NPjKy6jDQeEsq4.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Take it from someone who has watched the many attempts to run Windows on ARM chips (and covered the Snapdragon X Elite launch): emulation has always had an Achilles’ heel when it comes to gaming: micro-stuttering and frame pacing.</p><p>“When you're playing video games, it's not just about your average FPS. 1% lows, stuttering is really critical, and your CPU actually plays a very big role in stuttering control,” Dawoud explained.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VPJcvprGffc9FfD2cHiytJ" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/VPJcvprGffc9FfD2cHiytJ.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>While average frame rates look acceptable, CPU timing can get erratic when you try to emulate a game and play it at the same time, which can make fast-paced gaming feel jerky. When somebody buys an Nvidia laptop in October, the chances are likely that they will want to play games on it — it’s an RTX GPU after all.</p><p>So work needed to be done, and Microsoft has overhauled the Prism emulation layer for RTX Spark’s pipelines. By shoring up how tasks are assigned to each of the CPU’s threads, frame rates are much more stable in my testing, and the improvement over past versions is night and day.</p><h2 id="ui-polish-amp-the-agentic-future">UI polish & the agentic future</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2570px;"><p class="vanilla-image-block" style="padding-top:66.65%;"><img id="4fF35LQYkV4jpZNrPUKxZg" name="win11improvedsearchg" alt="Windows 11 Improved Search in action" src="https://cdn.mos.cms.futurecdn.net/4fF35LQYkV4jpZNrPUKxZg.jpg" mos="" align="middle" fullscreen="" width="2570" height="1713" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>If you’re going to make what I believe could be a MacBook Pro killer, you need to make sure the UI is ready for power users as well as casual users. And the mission in Dawoud’s mind to do this is clear: “make the OS kind of get out of the way, for you to do the work that you want to do.”</p><p>Microsoft is cleaning up Windows 11 for this kind of user: native taskbar customization, customizable notifications, killing unwanted widgets, and remembering displays you connect to—to preserve specific screen layout settings.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kANGCbHE3KTdGdR5xZVvD4" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/kANGCbHE3KTdGdR5xZVvD4.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Then we turn our attention to the “reinvent the PC” part of the RTX Spark, which comes down to local agentic AI. I saw a demo of Hermes Agent connected to a user’s Google account that acted like his personal chief of staff: setting an agenda for the day, drafting email responses in Gmail, and updating a project tracker in Google Docs. And it all happened on-device without a single bit of cloud AI.</p><p>But without guardrails, this could get scary. “Having an agent that you can't control is probably the thing you don't want,” he stated. So the answer is Microsoft Extension Containers (MXC) — isolated sandboxes for your local models to act across your desktop securely without sensitive system control leaking.</p><h2 id="killing-oem-bloatware">Killing OEM bloatware</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mcY3VEDiPviihsNtyMMVY4" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/mcY3VEDiPviihsNtyMMVY4.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>It’s always been a dream of mine to have a laptop that doesn’t come packed with OEM-specific power management software or an antivirus scanner. While this may not fix the latter, it goes a long way toward killing the need for the former.</p><p>Dawoud emphasized the need to eliminate the clunky tug-of-war between Windows and external software. Currently, there are several ways to tweak power management across different apps, but RTX Spark uses the open-source Modern Power and Thermal Framework—letting Windows natively control all thermal and power tuning.</p><p>“Users, when they want to set the best performance, they can do it in Windows, and they'll know that the OEM's tuning for best performance has now been set,” he said. “They don't need to go to another app and be like, 'Okay, is that app saying good performance and Windows is saying good performance at the same time?'”</p><p>This also helps these laptops maintain the same performance on and off the charger.</p><h2 id="the-uma-secret">The UMA secret</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="WudXrWFBDRvTr4BfJPKW3T" name="RTX Spark" alt="RTX Spark" src="https://cdn.mos.cms.futurecdn.net/WudXrWFBDRvTr4BfJPKW3T.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>On paper, a Unified Memory Architecture (UMA) sounds great — a big pool for both the CPU and monstrous GPU to dip into at leisure, and take however much (or little) they need. But in reality, CPUs and GPUs digest memory completely differently.</p><p>CPUs crave small memory chunks (4-kilobyte pages) to distribute tasks across their many cores. They take a pizza, pull all the ingredients off of it, and share them around. GPUs, however, take that entire pizza, fold it in half, and eat it taco-style. They need massive blocks (up to 2-megabyte pages) to plow through parallel 3D rendering or AI tasks.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rVysSsvNTgqPQr98uY9uY4" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/rVysSsvNTgqPQr98uY9uY4.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>“RTX Spark has a very powerful GPU, so making sure that we give it as much memory as possible when it needs it, but also give it the right page sizes, is really critical,” Dawoud commented.</p><p>So Microsoft's fix is to add variable page sizing directly to the memory manager. This is a bit complex, but it means Windows can dynamically read the pages of data flowing through and send them to the right places—the 2MB to the GPU and 4KB to the CPU simultaneously.</p><p>“Optimizing that is the way you can weaponize the entire stack to get the most performance out of it,” He emphasized.</p><h2 id="taming-nvidia-s-custom-cpu-cores">Taming Nvidia’s custom CPU cores</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NC4Vevw7coKXAFTkqRDdYP" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/NC4Vevw7coKXAFTkqRDdYP.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Unlike Qualcomm’s standardized Snapdragon X chips, Nvidia’s 18- and 20-core Grace CPUs use a proprietary cluster arrangement of performance and efficiency cores to maximize speed while delivering all-day battery life.</p><p>Dawoud explained that Nvidia's core configuration is entirely unique, and “previous Arm cores that have run on Windows are not like that.”</p><p>Now, historically, supporting an exotic CPU layout required rewriting the entire kernel underpinning Windows — a risky move for sure. But Windows 11 has a new profiling stack that can tune itself dynamically on the fly, meaning the scheduler that throws tasks everywhere can adapt to Nvidia’s unique chip here without breaking legacy compatibility.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-e4EgZW"></div>                            </div>                            <script src="https://kwizly.com/embed/e4EgZW.js" async></script><h2 id="the-pc-has-finally-grown-up">The PC has finally grown up</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GVxdiZGjWNreCjxARYdq74" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/GVxdiZGjWNreCjxARYdq74.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The 14-year partnership between Microsoft and Nvidia finally feels like it is paying off. Dawoud pointed out that this wasn't a sudden alliance — the journey started over a decade ago with the Tegra-powered Surface RT.</p><p>But this specific launch represents a fundamental shift in how the two giants collaborate. By letting Microsoft engineers rebuild the OS from the silicon bootstrap level upward, RTX Spark gave Windows the foundation it needed to finally make Arm-based PC gaming a reality.</p><p>Microsoft and Nvidia haven’t just bolted a GPU onto an Arm processor; they’ve rewritten the rulebook beneath the surface. This is a huge moment for both companies, and if Windows on Arm succeeds where previous attempts faltered, it will all be traced back to that one moment Microsoft spent eight agonizing months building the foundation to make it feel effortless.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/laptops/macbook-pro-14-inch-vs-asus-proart-p14-nvidia-rtx-spark">I held the Asus ProArt P14 next to my MacBook Pro 14 — and Apple should be genuinely terrified of Nvidia’s RTX Spark</a></li><li><a href="https://www.tomsguide.com/gaming/handheld-gaming/i-tested-acers-wild-flip-and-swivel-handheld-why-project-dualplay-mini-is-the-ultimate-netbook-love-letter">I tested Acer's wild Project DualPlay Mini — and it's a gaming handheld and laptop in one gadget</a></li><li><a href="https://www.tomsguide.com/gaming/pc-gaming/i-tested-the-real-dlss-5-forget-the-leaked-mods-its-not-an-ai-filter-this-is-nvidias-photorealistic-game-changer">I wanted to hate Nvidia’s DLSS 5 ‘AI filter’ — but the real DLSS 5 is photorealistic black magic</a></li></ul><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=laptops&min_discount_ratio=0.95&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = this.getRowsLimit();          } else {             this.displayLimit += this.getRowsLimit();          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += this.getRowsLimit();                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');               document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/windows-operating-systems/i-spoke-to-the-microsoft-pm-rebuilding-windows-11-for-nvidia-rtx-spark-the-radical-reinvention-building-the-first-true-macbook-pro-threat</link>
                                                                            <description>
                            <![CDATA[ “Half of Santa Clara was jumping.” An exclusive interview with Microsoft on rebuilding Windows 11 from the ground up for Nvidia’s RTX Spark silicon. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">hT9VZpkvYjuDisFYQM8J85</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Zfe8UdFvFggCuPBwkQ8ZZ4-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 07 Sep 2026 08:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Windows Operating Systems]]></category>
                                                    <category><![CDATA[Laptops]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Software]]></category>
                                                    <category><![CDATA[Operating Systems]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jason brings a decade of tech and gaming journalism experience to his role as a Managing Editor of Computing at Tom&#039;s Guide. He has previously written for Laptop Mag, Tom&#039;s Hardware, Kotaku, Stuff and BBC Science Focus. In his spare time, you&#039;ll find Jason looking for good dogs to pet or thinking about eating pizza if he isn&#039;t already.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/Zfe8UdFvFggCuPBwkQ8ZZ4-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Nvidia RTX Spark]]></media:description>                                                            <media:text><![CDATA[Nvidia RTX Spark]]></media:text>
                                <media:title type="plain"><![CDATA[Nvidia RTX Spark]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Zfe8UdFvFggCuPBwkQ8ZZ4-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>For eight grueling months leading up to the end of last year, engineers from Microsoft and Nvidia worked side by side from the silicon bootstrap level upward. And the goal? Making Windows 11 play nice with an unprecedented architectural shift: an Arm-based CPU sharing massive unified memory with a desktop-class Nvidia RTX GPU.</p><p>And then, the first <a href="https://www.tomsguide.com/computing/laptops/nvidias-rtx-spark-n1x-drops-this-october-why-apple-silicon-should-be-terrified-and-our-price-predictions">RTX Spark</a> machine finally booted. The red LED lit up, and as Microsoft's Principal Product Manager, Peter Dawoud, recalls it: “half of Santa Clara was jumping.” This was a huge undertaking, but now the real work begins: fine-tuning everything.</p><p>RTX Spark isn’t just another laptop sticker; it pushed Microsoft to fundamentally overhaul five foundational subsystems inside Windows 11 to bridge the gap between low-power Arm efficiency, top-tier AAA gaming, and local agentic AI.</p><p>I spoke to Dawoud about the software underpinning Team Green’s hardware because, as he said, “Windows kind of had to get all these subsystems right all at the same time, so that you can enjoy an RTX Spark device and take the most advantage out of it.”</p><h2 id="a-prism-emulator-overhaul">A Prism Emulator overhaul</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="oWfTLRd5NPjKy6jDQeEsq4" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/oWfTLRd5NPjKy6jDQeEsq4.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Take it from someone who has watched the many attempts to run Windows on ARM chips (and covered the Snapdragon X Elite launch): emulation has always had an Achilles’ heel when it comes to gaming: micro-stuttering and frame pacing.</p><p>“When you're playing video games, it's not just about your average FPS. 1% lows, stuttering is really critical, and your CPU actually plays a very big role in stuttering control,” Dawoud explained.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VPJcvprGffc9FfD2cHiytJ" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/VPJcvprGffc9FfD2cHiytJ.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>While average frame rates look acceptable, CPU timing can get erratic when you try to emulate a game and play it at the same time, which can make fast-paced gaming feel jerky. When somebody buys an Nvidia laptop in October, the chances are likely that they will want to play games on it — it’s an RTX GPU after all.</p><p>So work needed to be done, and Microsoft has overhauled the Prism emulation layer for RTX Spark’s pipelines. By shoring up how tasks are assigned to each of the CPU’s threads, frame rates are much more stable in my testing, and the improvement over past versions is night and day.</p><h2 id="ui-polish-amp-the-agentic-future">UI polish & the agentic future</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2570px;"><p class="vanilla-image-block" style="padding-top:66.65%;"><img id="4fF35LQYkV4jpZNrPUKxZg" name="win11improvedsearchg" alt="Windows 11 Improved Search in action" src="https://cdn.mos.cms.futurecdn.net/4fF35LQYkV4jpZNrPUKxZg.jpg" mos="" align="middle" fullscreen="" width="2570" height="1713" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>If you’re going to make what I believe could be a MacBook Pro killer, you need to make sure the UI is ready for power users as well as casual users. And the mission in Dawoud’s mind to do this is clear: “make the OS kind of get out of the way, for you to do the work that you want to do.”</p><p>Microsoft is cleaning up Windows 11 for this kind of user: native taskbar customization, customizable notifications, killing unwanted widgets, and remembering displays you connect to—to preserve specific screen layout settings.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kANGCbHE3KTdGdR5xZVvD4" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/kANGCbHE3KTdGdR5xZVvD4.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Then we turn our attention to the “reinvent the PC” part of the RTX Spark, which comes down to local agentic AI. I saw a demo of Hermes Agent connected to a user’s Google account that acted like his personal chief of staff: setting an agenda for the day, drafting email responses in Gmail, and updating a project tracker in Google Docs. And it all happened on-device without a single bit of cloud AI.</p><p>But without guardrails, this could get scary. “Having an agent that you can't control is probably the thing you don't want,” he stated. So the answer is Microsoft Extension Containers (MXC) — isolated sandboxes for your local models to act across your desktop securely without sensitive system control leaking.</p><h2 id="killing-oem-bloatware">Killing OEM bloatware</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mcY3VEDiPviihsNtyMMVY4" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/mcY3VEDiPviihsNtyMMVY4.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>It’s always been a dream of mine to have a laptop that doesn’t come packed with OEM-specific power management software or an antivirus scanner. While this may not fix the latter, it goes a long way toward killing the need for the former.</p><p>Dawoud emphasized the need to eliminate the clunky tug-of-war between Windows and external software. Currently, there are several ways to tweak power management across different apps, but RTX Spark uses the open-source Modern Power and Thermal Framework—letting Windows natively control all thermal and power tuning.</p><p>“Users, when they want to set the best performance, they can do it in Windows, and they'll know that the OEM's tuning for best performance has now been set,” he said. “They don't need to go to another app and be like, 'Okay, is that app saying good performance and Windows is saying good performance at the same time?'”</p><p>This also helps these laptops maintain the same performance on and off the charger.</p><h2 id="the-uma-secret">The UMA secret</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="WudXrWFBDRvTr4BfJPKW3T" name="RTX Spark" alt="RTX Spark" src="https://cdn.mos.cms.futurecdn.net/WudXrWFBDRvTr4BfJPKW3T.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>On paper, a Unified Memory Architecture (UMA) sounds great — a big pool for both the CPU and monstrous GPU to dip into at leisure, and take however much (or little) they need. But in reality, CPUs and GPUs digest memory completely differently.</p><p>CPUs crave small memory chunks (4-kilobyte pages) to distribute tasks across their many cores. They take a pizza, pull all the ingredients off of it, and share them around. GPUs, however, take that entire pizza, fold it in half, and eat it taco-style. They need massive blocks (up to 2-megabyte pages) to plow through parallel 3D rendering or AI tasks.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rVysSsvNTgqPQr98uY9uY4" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/rVysSsvNTgqPQr98uY9uY4.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>“RTX Spark has a very powerful GPU, so making sure that we give it as much memory as possible when it needs it, but also give it the right page sizes, is really critical,” Dawoud commented.</p><p>So Microsoft's fix is to add variable page sizing directly to the memory manager. This is a bit complex, but it means Windows can dynamically read the pages of data flowing through and send them to the right places—the 2MB to the GPU and 4KB to the CPU simultaneously.</p><p>“Optimizing that is the way you can weaponize the entire stack to get the most performance out of it,” He emphasized.</p><h2 id="taming-nvidia-s-custom-cpu-cores">Taming Nvidia’s custom CPU cores</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NC4Vevw7coKXAFTkqRDdYP" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/NC4Vevw7coKXAFTkqRDdYP.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Unlike Qualcomm’s standardized Snapdragon X chips, Nvidia’s 18- and 20-core Grace CPUs use a proprietary cluster arrangement of performance and efficiency cores to maximize speed while delivering all-day battery life.</p><p>Dawoud explained that Nvidia's core configuration is entirely unique, and “previous Arm cores that have run on Windows are not like that.”</p><p>Now, historically, supporting an exotic CPU layout required rewriting the entire kernel underpinning Windows — a risky move for sure. But Windows 11 has a new profiling stack that can tune itself dynamically on the fly, meaning the scheduler that throws tasks everywhere can adapt to Nvidia’s unique chip here without breaking legacy compatibility.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-e4EgZW"></div>                            </div>                            <script src="https://kwizly.com/embed/e4EgZW.js" async></script><h2 id="the-pc-has-finally-grown-up">The PC has finally grown up</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GVxdiZGjWNreCjxARYdq74" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/GVxdiZGjWNreCjxARYdq74.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The 14-year partnership between Microsoft and Nvidia finally feels like it is paying off. Dawoud pointed out that this wasn't a sudden alliance — the journey started over a decade ago with the Tegra-powered Surface RT.</p><p>But this specific launch represents a fundamental shift in how the two giants collaborate. By letting Microsoft engineers rebuild the OS from the silicon bootstrap level upward, RTX Spark gave Windows the foundation it needed to finally make Arm-based PC gaming a reality.</p><p>Microsoft and Nvidia haven’t just bolted a GPU onto an Arm processor; they’ve rewritten the rulebook beneath the surface. This is a huge moment for both companies, and if Windows on Arm succeeds where previous attempts faltered, it will all be traced back to that one moment Microsoft spent eight agonizing months building the foundation to make it feel effortless.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/laptops/macbook-pro-14-inch-vs-asus-proart-p14-nvidia-rtx-spark">I held the Asus ProArt P14 next to my MacBook Pro 14 — and Apple should be genuinely terrified of Nvidia’s RTX Spark</a></li><li><a href="https://www.tomsguide.com/gaming/handheld-gaming/i-tested-acers-wild-flip-and-swivel-handheld-why-project-dualplay-mini-is-the-ultimate-netbook-love-letter">I tested Acer's wild Project DualPlay Mini — and it's a gaming handheld and laptop in one gadget</a></li><li><a href="https://www.tomsguide.com/gaming/pc-gaming/i-tested-the-real-dlss-5-forget-the-leaked-mods-its-not-an-ai-filter-this-is-nvidias-photorealistic-game-changer">I wanted to hate Nvidia’s DLSS 5 ‘AI filter’ — but the real DLSS 5 is photorealistic black magic</a></li></ul><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=laptops&min_discount_ratio=0.95&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = this.getRowsLimit();          } else {             this.displayLimit += this.getRowsLimit();          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += this.getRowsLimit();                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');               document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Xbox Helix will battle PS6 with 'great family of devices' — here's what Microsoft needs to do to win gamers back ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The next Xbox system might not be a single console but a family of devices. That’s not wild speculation, as Xbox CEO Asha Sharma has now hinted at this possibility. </p><p>In an interview with <a href="https://www.youtube.com/watch?v=txuYKwrbq1M" target="_blank">BBC News</a> during Gamescom 2026 (via <a href="https://www.digitaltrends.com/gaming/microsoft-hints-that-its-next-xbox-could-be-more-than-one-console/" target="_blank">Digital Trends</a>), Asha Sharma said that <a href="https://www.tomsguide.com/gaming/xbox/next-xbox-will-play-your-xbox-and-pc-games-new-ceo-promises">Project Helix</a>, which is the codename for the next Xbox console, is a “great family of devices.” Now, you can’t have a family of one, so Sharma’s statement heavily suggests that we could see more than one Helix device.</p><p>We’ve previously reported that <a href="https://www.tomsguide.com/gaming/xbox/microsoft-reveals-new-details-on-its-project-helix-pc-console-hybrid-heres-all-the-latest-on-the-next-xbox">Project Helix could be more akin to a gaming PC</a> than a console, and that Xbox is also reportedly manufacturing its own in-house handheld system. Combine those reports with Sharma’s statement about a family of devices, and we start getting a clearer picture of Microsoft’s potential next-gen plans.</p><h2 id="play-anywhere-the-next-generation">Play anywhere: The next generation</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="gnWdFGjBV35aRhN62rgT5i" name="XboxAppOnSmartTVs_UI_FINAL.jpg" alt="xbox game pass" src="https://cdn.mos.cms.futurecdn.net/gnWdFGjBV35aRhN62rgT5i.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Xbox’s “Play Anywhere” initiative currently lets you buy a digital game once and play it on your Xbox console, Windows PC, and supported handhelds like the <a href="https://www.tomsguide.com/gaming/handheld-gaming/rog-xbox-ally-review">Asus ROG Xbox Ally</a>. If there is a family of Helix devices, then it seems Xbox will bring the existing Play Anywhere initiative to the next generation.</p><p>So what could this “family” of systems consist of? The Project Helix console could provide the traditional living room experience, while an Xbox-developed handheld could let you take your games on the go. That’s something that currently exists if you own an Xbox Series X and Asus’ Xbox-centric handheld, but what if Xbox goes beyond even this?</p><p>Reports suggest the Helix will be more like a PC, but what if that system is a higher-end model for hardcore players with money to spare? That’s speculation on my part, but if we’re talking about a family of devices, I have to imagine there could be more than just two systems. Given how Xbox already caters to console, handheld, and PC gamers, it’s not outlandish to wonder whether the Helix will exist for all of those customers.</p><h2 id="all-digital-future">All-digital future?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ZF4gnKdCy4MpgFD2q3wFyH" name="shutterstock_1860770944.jpg" alt="Xbox Series X on wooden table." src="https://cdn.mos.cms.futurecdn.net/ZF4gnKdCy4MpgFD2q3wFyH.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Alex Van Aken | Shutterstock)</span></figcaption></figure><p>Ever since <a href="https://www.tomsguide.com/gaming/playstation/playstation-is-officially-killing-physical-discs-heres-when-they-disappear-and-what-that-means-for-you">Sony announced it would stop manufacturing physical discs</a> starting in 2028, many have wondered whether Xbox would follow suit with an all-digital initiative. Asha Sharma hasn't directly answered this question, but if Xbox really wanted to stick it to Sony and potentially win over some of Sony’s disgruntled customers who want physical media, adding a disc drive to the Helix would be a savvy move.</p><p><a href="https://news.xbox.com/en-us/2026/08/26/your-discs-now-also-digital/" target="_blank">Xbox recently launched its disc-to-digital program</a>, which lets you convert eligible physical game discs into permanent digital licenses linked to your Microsoft account. If the company wants to continue this beyond Xbox Series X systems, it would make sense for Helix to either include a disc drive or for Xbox to release a detachable disc drive similar to the one for PS5 Pro.</p><p>It’s still anyone’s guess whether Project Helix will be an all-digital system. Microsoft is still largely a software company, so going all-digital seems logical. That said, if it plans to keep releasing gaming hardware, it would be smart for Helix to support discs in some fashion.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XZqAkO"></div>                            </div>                            <script src="https://kwizly.com/embed/XZqAkO.js" async></script><h2 id="outlook">Outlook</h2><p>Naturally, we don’t have firm details about what Project Helix will be, so we’ll have to hold tight until Sharma or anyone else from the Xbox camp decides to share more. Regardless, it seems Xbox could be trying something relatively unusual and potentially game-changing for its next major console launch.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/gaming-desktops/hp-omen-max-45l-review">I just tested the HP Omen Max 45L and it's a seriously powerful gaming PC</a></li><li><a href="https://www.tomsguide.com/gaming/playstation/playstation-27-gaming-monitor-review">PlayStation’s 27-inch gaming monitor is perfect for PS5 and PC gamers</a></li><li><a href="https://www.tomsguide.com/computing/android-tablets/the-gargantuan-speaker-on-this-android-tablet-isnt-a-gimmick-i-cant-believe-how-good-it-sounds">The gargantuan speaker on this Android tablet isn’t a gimmick</a></li></ul><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=gaming&brands=Xbox&min_discount_ratio=0.95&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = this.getRowsLimit();          } else {             this.displayLimit += this.getRowsLimit();          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += this.getRowsLimit();                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');               document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/xbox/xbox-helix-will-battle-ps6-with-great-family-of-devices-heres-what-microsoft-needs-to-do-to-win-gamers-back</link>
                                                                            <description>
                            <![CDATA[ In an interview during Gamescom 2026, Xbox CEO Asha Sharma said that Project Helix will be a "great family of devices." Here's what that could mean. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">LoaooXRvX7LP6k6rNTMmYf</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/stWxmxQxthCyMxKosjKikc-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 01 Sep 2026 05:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Xbox]]></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/stWxmxQxthCyMxKosjKikc-1280-80.jpg">
                                                            <media:credit><![CDATA[Phil Barker/Future Publishing via Getty Images]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Xbox Series X  console]]></media:description>                                                            <media:text><![CDATA[Xbox Series X  console]]></media:text>
                                <media:title type="plain"><![CDATA[Xbox Series X  console]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/stWxmxQxthCyMxKosjKikc-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The next Xbox system might not be a single console but a family of devices. That’s not wild speculation, as Xbox CEO Asha Sharma has now hinted at this possibility. </p><p>In an interview with <a href="https://www.youtube.com/watch?v=txuYKwrbq1M" target="_blank">BBC News</a> during Gamescom 2026 (via <a href="https://www.digitaltrends.com/gaming/microsoft-hints-that-its-next-xbox-could-be-more-than-one-console/" target="_blank">Digital Trends</a>), Asha Sharma said that <a href="https://www.tomsguide.com/gaming/xbox/next-xbox-will-play-your-xbox-and-pc-games-new-ceo-promises">Project Helix</a>, which is the codename for the next Xbox console, is a “great family of devices.” Now, you can’t have a family of one, so Sharma’s statement heavily suggests that we could see more than one Helix device.</p><p>We’ve previously reported that <a href="https://www.tomsguide.com/gaming/xbox/microsoft-reveals-new-details-on-its-project-helix-pc-console-hybrid-heres-all-the-latest-on-the-next-xbox">Project Helix could be more akin to a gaming PC</a> than a console, and that Xbox is also reportedly manufacturing its own in-house handheld system. Combine those reports with Sharma’s statement about a family of devices, and we start getting a clearer picture of Microsoft’s potential next-gen plans.</p><h2 id="play-anywhere-the-next-generation">Play anywhere: The next generation</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="gnWdFGjBV35aRhN62rgT5i" name="XboxAppOnSmartTVs_UI_FINAL.jpg" alt="xbox game pass" src="https://cdn.mos.cms.futurecdn.net/gnWdFGjBV35aRhN62rgT5i.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Xbox’s “Play Anywhere” initiative currently lets you buy a digital game once and play it on your Xbox console, Windows PC, and supported handhelds like the <a href="https://www.tomsguide.com/gaming/handheld-gaming/rog-xbox-ally-review">Asus ROG Xbox Ally</a>. If there is a family of Helix devices, then it seems Xbox will bring the existing Play Anywhere initiative to the next generation.</p><p>So what could this “family” of systems consist of? The Project Helix console could provide the traditional living room experience, while an Xbox-developed handheld could let you take your games on the go. That’s something that currently exists if you own an Xbox Series X and Asus’ Xbox-centric handheld, but what if Xbox goes beyond even this?</p><p>Reports suggest the Helix will be more like a PC, but what if that system is a higher-end model for hardcore players with money to spare? That’s speculation on my part, but if we’re talking about a family of devices, I have to imagine there could be more than just two systems. Given how Xbox already caters to console, handheld, and PC gamers, it’s not outlandish to wonder whether the Helix will exist for all of those customers.</p><h2 id="all-digital-future">All-digital future?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ZF4gnKdCy4MpgFD2q3wFyH" name="shutterstock_1860770944.jpg" alt="Xbox Series X on wooden table." src="https://cdn.mos.cms.futurecdn.net/ZF4gnKdCy4MpgFD2q3wFyH.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Alex Van Aken | Shutterstock)</span></figcaption></figure><p>Ever since <a href="https://www.tomsguide.com/gaming/playstation/playstation-is-officially-killing-physical-discs-heres-when-they-disappear-and-what-that-means-for-you">Sony announced it would stop manufacturing physical discs</a> starting in 2028, many have wondered whether Xbox would follow suit with an all-digital initiative. Asha Sharma hasn't directly answered this question, but if Xbox really wanted to stick it to Sony and potentially win over some of Sony’s disgruntled customers who want physical media, adding a disc drive to the Helix would be a savvy move.</p><p><a href="https://news.xbox.com/en-us/2026/08/26/your-discs-now-also-digital/" target="_blank">Xbox recently launched its disc-to-digital program</a>, which lets you convert eligible physical game discs into permanent digital licenses linked to your Microsoft account. If the company wants to continue this beyond Xbox Series X systems, it would make sense for Helix to either include a disc drive or for Xbox to release a detachable disc drive similar to the one for PS5 Pro.</p><p>It’s still anyone’s guess whether Project Helix will be an all-digital system. Microsoft is still largely a software company, so going all-digital seems logical. That said, if it plans to keep releasing gaming hardware, it would be smart for Helix to support discs in some fashion.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XZqAkO"></div>                            </div>                            <script src="https://kwizly.com/embed/XZqAkO.js" async></script><h2 id="outlook">Outlook</h2><p>Naturally, we don’t have firm details about what Project Helix will be, so we’ll have to hold tight until Sharma or anyone else from the Xbox camp decides to share more. Regardless, it seems Xbox could be trying something relatively unusual and potentially game-changing for its next major console launch.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/gaming-desktops/hp-omen-max-45l-review">I just tested the HP Omen Max 45L and it's a seriously powerful gaming PC</a></li><li><a href="https://www.tomsguide.com/gaming/playstation/playstation-27-gaming-monitor-review">PlayStation’s 27-inch gaming monitor is perfect for PS5 and PC gamers</a></li><li><a href="https://www.tomsguide.com/computing/android-tablets/the-gargantuan-speaker-on-this-android-tablet-isnt-a-gimmick-i-cant-believe-how-good-it-sounds">The gargantuan speaker on this Android tablet isn’t a gimmick</a></li></ul><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=gaming&brands=Xbox&min_discount_ratio=0.95&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = this.getRowsLimit();          } else {             this.displayLimit += this.getRowsLimit();          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += this.getRowsLimit();                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');               document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Microsoft Outlook was down? Live tracking multi-hour email outage ]]></title>
                                                                                                <dc:content><![CDATA[ <div class="live-content"><p>Microsoft Outlook may be suffering an outage. Reports about the email platform started popping up on the outage-tracking site <a href="https://downdetector.com/status/outlook/" target="_blank">Down Detector</a> starting around 8:30 am Pacific. </p><p>It peaked around 9:30 am around 6,000 reports. The outage appears to be affecting access to mailboxes, delays in sending emails or failure to send. </p><p>Outlook stayed down for nearly 12 hours, last until about 8:30 pm Pacific. A fix was implemented around 6 pm that seemed to get people back online but it didn't completely work and some functions like search didn't work properly for two more hours.</p><p>According to the Microsoft 365 status page, the outage was caused by "an issue within a core authentication configuration used by multiple Microsoft 365 services is resulting in impact."</p><p>We did not see any more specific information beyond that. </p><p>Here's what we know:</p></div><div class="live-content"><time datetime="2026-08-31T18:26:22+00:00">August 31, 2026 – 2:26 PM</time><h2 id="multi-hour-outage">Multi-hour outage</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:673px;"><p class="vanilla-image-block" style="padding-top:42.79%;"><img id="E8exMaQWWNsgzYsLnRiQnN" name="Screenshot 2026-08-31 112543" alt="Microsoft Outlook outage Aug 31, 2026" src="https://cdn.mos.cms.futurecdn.net/E8exMaQWWNsgzYsLnRiQnN.png" mos="" align="middle" fullscreen="" width="673" height="288" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Down Detector)</span></figcaption></figure><p>Reports starting appearing on Down Detector around 8:30 am Pacific but didn't peak until an hour later. </p><p>As of this posting, there are more than 5,000 reports on the outage tracker and no sign of decline.</p></div><div class="live-content"><time datetime="2026-08-31T18:28:54+00:00">August 31, 2026 – 2:28 PM</time><h2 id="microsoft-says-all-systems-quot-operational-quot">Microsoft says all systems "operational"</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LFP6P5nzNFP8AkCLiWJSvG" name="Microsoft" alt="Microsoft 365 becomes Microsoft 364" src="https://cdn.mos.cms.futurecdn.net/LFP6P5nzNFP8AkCLiWJSvG.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Paolo Bona / Shutterstock.com / Microsoft / Future)</span></figcaption></figure><p>I've checked the Microsoft 365 <a href="https://status.cloud.microsoft/m365/referrer=serviceStatusRedirect" target="_blank">status page</a>, and according to that page every Microsoft product is operational.</p></div><div class="live-content"><time datetime="2026-08-31T18:31:03+00:00">August 31, 2026 – 2:31 PM</time><h2 id="m365-twitter-account-acknowledges-problem">M365 Twitter account acknowledges problem</h2><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2094465993007378744"><p lang="en" dir="ltr">We've confirmed that users may experience degraded functionality with various Exchange Online functionalities. We're reviewing service telemetry and diagnostic data to isolate the source of the issue. For more information, please see EX1464935 in the admin center.<a href="https://twitter.com/cantworkitout/status/2094465993007378744">August 31, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>While the Microsoft 365 status page isn't showing any issues, the official <a href="https://x.com/MSFT365Status/status/2094465993007378744" target="_blank">Microsoft 365 Status X account</a> did acknowledge the issue.</p><p>"We've confirmed that users may experience degraded functionality with various Exchange Online functionalities. We're reviewing service telemetry and diagnostic data to isolate the source of the issue. For more information, please see EX1464935 in the admin center," the post reads. </p></div><div class="live-content"><time datetime="2026-08-31T18:34:28+00:00">August 31, 2026 – 2:34 PM</time><h2 id="what-issues-are-we-seeing">What issues are we seeing?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:853px;"><p class="vanilla-image-block" style="padding-top:60.96%;"><img id="77h7giWwLQ9NhbRWTtqwSd" name="outlook-iphone-shst.jpg" alt="Microsoft Outlook" src="https://cdn.mos.cms.futurecdn.net/77h7giWwLQ9NhbRWTtqwSd.jpg" mos="" align="middle" fullscreen="" width="853" height="520" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Based on comments from Down Detector and X, the most common issue appears to be a failure to actually send and receive emails for those who can get in.</p><p>I've seen several comments saying that the app won't even open on their computers. </p><p>"Not receiving emails since about 10:45 am, then went downhill, replies stopped coming through, then emails came to a halt, and then, besides Outlook constantly freezing, now my shared work folder is no longer showing me emails and gives an error," one said.</p><p>For those in businesses, it appears they can't even send messages between connected emails.</p></div><div class="live-content"><time datetime="2026-08-31T18:40:54+00:00">August 31, 2026 – 2:40 PM</time><h2 id="users-quot-may-experience-a-variety-of-symptoms-quot">Users "may experience a variety of symptoms"</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1981px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="QcDNYDHLZWSjpMdgzpVJQG" name="Outlook.shutterstock_2384091865.jpg" alt="Outlook on a laptop" src="https://cdn.mos.cms.futurecdn.net/QcDNYDHLZWSjpMdgzpVJQG.jpg" mos="" align="middle" fullscreen="" width="1981" height="1114" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>If you can get in the 365 Admin Center, this is the message you should see:</p><p>"Users may be unable to connect to, or experience degraded functionality with Exchange Online</p><p>Users may experience a variety of symptoms related to this event, including but not limited to:<br>- Delays, failures, or incomplete results when searching for content within Exchange Online mailboxes.<br>- Delays or failures when sending or receiving email messages.<br>- Authentication-related errors when accessing Exchange Online services.<br>- Difficulties accessing or performing actions within Exchange administration experiences.<br>- Intermittent failures affecting mailbox operations and message delivery workflows."</p></div><div class="live-content"><time datetime="2026-08-31T18:51:20+00:00">August 31, 2026 – 2:51 PM</time><h2 id="slow-decline">Slow decline</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:675px;"><p class="vanilla-image-block" style="padding-top:45.63%;"><img id="LCj29zbxdQbXSkRrDP5HXk" name="Screenshot 2026-08-31 114803" alt="Microsoft Outlook outage 8/31/26" src="https://cdn.mos.cms.futurecdn.net/LCj29zbxdQbXSkRrDP5HXk.png" mos="" align="middle" fullscreen="" width="675" height="308" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Down Detector)</span></figcaption></figure><p>Over on Down Detector, reports have started to decline. </p><p>The peak around 9:30 a.m. was around 6,000 reports. As of 11:45 a.m. Pacific, reports are closer to 4,500. </p><p>I've seen some people in offices say that portions of their teams are able to access the email platform, but some of the team is still down.</p></div><div class="live-content"><time datetime="2026-08-31T19:09:19+00:00">August 31, 2026 – 3:09 PM</time><h2 id="no-updates-from-microsoft">No updates from Microsoft</h2><p>Other than the couple tweets and the Admin Center update, we haven't seen any other updates from Microsoft. </p><p>It's not clear what work is being done to resolve the outage.</p></div><div class="live-content"><time datetime="2026-08-31T19:26:40+00:00">August 31, 2026 – 3:26 PM</time><h2 id="is-outlook-down-for-you">Is Outlook down for you?</h2><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W5E2wW"></div>                            </div>                            <script src="https://kwizly.com/embed/W5E2wW.js" async></script><p>Let us know in the comments what issues you're experiencing. </p></div><div class="live-content"><time datetime="2026-08-31T19:44:03+00:00">August 31, 2026 – 3:44 PM</time><h2 id="outage-has-last-4-hours">Outage has last 4 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ytx7gsKrfFbWNQV8E7E9NB" name="MicrosoftOutlook.jpg" alt="The Microsoft Outlook app open on a phone" src="https://cdn.mos.cms.futurecdn.net/ytx7gsKrfFbWNQV8E7E9NB.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>With no updates from Microsoft, today's Outlook outage has lasted for more than four hours.</p><p>As of this posting, despite declining reports it's not clear when the outage might end.</p></div><div class="live-content"><time datetime="2026-08-31T19:52:00+00:00">August 31, 2026 – 3:52 PM</time><h2 id="update-from-microsoft">Update from Microsoft</h2><p>On the <a href="https://status.cloud.microsoft/m365/referrer=serviceStatusRedirect" target="_blank">M365 status page</a>, a new update just popped up. </p><p>Here it is: </p><p>OneDrive for Business and SharePoint Online: Users may be unable to load or refresh portions of OneDrive and SharePoint, including account and storage information, search results, Favorites, Followed and Shared With Me content, recent files, lists, and news. Some users may also experience delayed or failed file opening, Office policy-label retrieval, OneDrive synchronization, mobile camera upload, and video playback. Users may see partial page failures, missing or stale content, repeated retries, and operation timeouts rather than a complete platform outage.</p><p>Exchange Online: Users may be unable to connect to, or experience degraded functionality, with Exchange Online. All connection methods are affected. </p><p>Microsoft Teams: Users may experience issues with calendar functionality and search. Users’ presence may be stale and not update automatically or through manual adjustment. User location adjustment may fail. </p><p>Microsoft Purview: Users may face intermittent authorization failures across solutions in Purview. Purview admins can’t access the portal. Additionally, in Microsoft Purview Communication Compliance, users may see errors when loading Communication Compliance policies and Data Loss Prevention (DLP) policies. Communication Compliance policy creation and evaluation may be delayed. </p><p>Microsoft Defender XDR: Users may experience intermittent authorization failures across solutions in Defender. </p><p><strong>Current status: </strong>We're continuing to perform comprehensive tests to ensure our mitigation strategy effectively resolves the issue without introducing additional impact. In parallel, we're exploring alternative remediation avenues to minimize impact in the interim. </p><p><strong>Scope of impact: </strong>Users attempting to perform any of the outlined impact scenarios may be affected by this event. </p><p><strong>Preliminary root cause: </strong>An issue within a core authentication configuration used by multiple Microsoft 365 services is resulting in impact. </p></div><div class="live-content"><time datetime="2026-08-31T20:14:23+00:00">August 31, 2026 – 4:14 PM</time><h2 id="snail-mail">Snail mail</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="gWoW8UhSG7R78YpMZFCbYT" name="GettyImages-78486862edit.jpg" alt="Letter posted through the letterbox" src="https://cdn.mos.cms.futurecdn.net/gWoW8UhSG7R78YpMZFCbYT.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Getty Images)</span></figcaption></figure><p>Not much new to share with you but this message from a frustrated user on Down Detector gave me a chuckle.</p><p>"Now distributing stamps & envelopes to our team. Printer is working overtime."</p></div><div class="live-content"><time datetime="2026-08-31T20:39:57+00:00">August 31, 2026 – 4:39 PM</time><h2 id="outage-appears-international">Outage appears international</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="SvzWgUkw8ivTUYcraTxj4n" name="TG-worldle-lede-shutterstock.jpg" alt="An image of the globe on a blue background. The globe has a green question mark formed from land." src="https://cdn.mos.cms.futurecdn.net/SvzWgUkw8ivTUYcraTxj4n.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Users reporting in on Down Detector are claiming to be from all over the country including New York, Las Vegas, Kentucky, Indianapolis and more.</p><p>I'm also seeing some reports from other countries including Guatamala City, Montevideo, Uruguay and Argentina.</p></div><div class="live-content"><time datetime="2026-08-31T21:23:00+00:00">August 31, 2026 – 5:23 PM</time><h2 id="where-we-stand-after-6-hours">Where we stand after 6 hours</h2><p>Unfortunately, pretty much the same. </p><p>The M365 status page had a recent update that shows Microsoft's engineers are working on the issue but it doesn't appear relief is coming any time soon.</p><p>"Current status: We're reexamining recent changes made to the service to determine why the authentication components aren't being deployed as expected. Additionally, we are exploring every avenue to safely restore the components, including reverting an update the affected infrastructure recently received. We're performing additional tests to determine whether this will provide relief."</p><p>Reports on Down Detector have declined but I think that's more because people on the East Coast are starting to log off for the day.</p></div><div class="live-content"><time datetime="2026-08-31T22:07:39+00:00">August 31, 2026 – 6:07 PM</time><h2 id="slow-decline-but-still-thousands-of-reports">Slow decline but still thousands of reports</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:675px;"><p class="vanilla-image-block" style="padding-top:45.48%;"><img id="B4chNaKBrbEUxpGwKJcqZn" name="Screenshot 2026-08-31 150353" alt="Microsoft Outlook outage 8/31/26" src="https://cdn.mos.cms.futurecdn.net/B4chNaKBrbEUxpGwKJcqZn.png" mos="" align="middle" fullscreen="" width="675" height="307" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Down Detector)</span></figcaption></figure><p>As mentioned in my last post, the reports on Down Detector have been in a steady decline, but there are still thousands of reports. Currently, it's sitting around 3,100. </p><p>There are certainly people using Outlook for personal reasons, but I think reports will decline as people across the US start to log off from work. </p></div><div class="live-content"><time datetime="2026-08-31T22:41:53+00:00">August 31, 2026 – 6:41 PM</time><h2 id="a-different-update-from-microsoft">A different update from Microsoft</h2><p>A user on Down Detector shared an alleged update from Microsoft.</p><p>Here's what it says: </p><p>We're continuing our targeted review of affected infrastructure and recent changes made to the service to definitively confirm the cause of impact. We're additionally continuing to test and implement various mitigation strategies to apply the necessary authentication component, which have so far yielded positive results. We're monitoring these tests and mitigative actions closely and will provide an estimated time to resolution as soon as one is available.</p><p>We understand the impact that events like these can have for your organization and we appreciate your patience as we work to mitigate this issue with the highest priority.</p></div><div class="live-content"><time datetime="2026-08-31T23:19:32+00:00">August 31, 2026 – 7:19 PM</time><h2 id="fixes-may-be-in-the-works">Fixes may be in the works</h2><p>It finally seems that Microsoft may have mitigations in place. Though the company has not yet provided an estimated time for a return to normal service.</p><p>"<em>We're continuing to implement a targeted mitigation to re-apply core authentication components, and we're expanding this action more widely across the affected environments as we closely track the recovery of affected downstream scenarios. Users may notice gradual recovery to the scenarios identified in the "More info" section as our mitigation action takes effect in their corresponding sections of infrastructure, and we're continuing to review whether any additional actions may be required to achieve withstanding recovery across all affected scenarios. We'll provide an estimated time to resolution as soon as one is available."</em></p></div><div class="live-content"><time datetime="2026-08-31T23:45:49+00:00">August 31, 2026 – 7:45 PM</time><h2 id="reports-continue-to-decline">Reports continue to decline</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:674px;"><p class="vanilla-image-block" style="padding-top:45.99%;"><img id="6pLQZLUvZ6om6asAdqsHWX" name="Screenshot 2026-09-01 084149" alt="Microsoft Outlook outage 8/31/26" src="https://cdn.mos.cms.futurecdn.net/6pLQZLUvZ6om6asAdqsHWX.png" mos="" align="middle" fullscreen="" width="674" height="310" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: New York Times)</span></figcaption></figure><p>Reports on Down Detector continue their steady decline but we are hewing closer to 5 pm on the West Coast, where it's likely people are starting to logoff there and I expect reports will take a nosedive over the next hour. </p><p>Microsoft still hasn't provided an ETA for a return to normal service. </p></div><div class="live-content"><time datetime="2026-09-01T00:23:36+00:00">August 31, 2026 – 8:23 PM</time><h2 id="microsoft-response">Microsoft response</h2><p>I reached out to Microsoft to see if they could provide an ETA or any kind of update. Unfortunately, I received neither. </p><p>Here's what I was told by a Microsoft spokesperson:</p><p><em>"We're aware of an issue affecting access to Exchange Online and some other services. We know this is disruptive for customers and we appreciate their patience while we work to restore services as quickly as possible. Updates are available on the </em><a href="https://uk01.l.antigena.com/l/1UXr5cGKjjp0o2OL9xWNCMQk8F5sezohurKMdWGBF~rOWnnC0ieSs5x3_ixEJl-9fBhzYDp399RfJgJtHCUKNYeHbfKpi8t8l2IxjOeb5OqEtC_rwHfjSOAJQYNdzGxW0U1Crn-~JZJDGQG9bg6ykf_Hni7Ylhx_mcFjEwBA2R" target="_blank"><u><em>Microsoft service health status page</em></u></a><em> and </em><a href="https://x.com/MSFT365Status/status/2094455556454920701" target="_blank"><em>@MSFT365Status</em></a><em>."</em><em><strong> </strong></em></p></div><div class="live-content"><time datetime="2026-09-01T00:37:28+00:00">August 31, 2026 – 8:37 PM</time><h2 id="latest-update-from-status-page">Latest update from status page</h2><p>Here's the latest update from the Microsoft status page: </p><p><em>We're progressively restarting targeted sections of affected infrastructure to ensure the re-applied authentication components are effectively implemented across affected services. We expect this will aid the recovery of affected scenarios. Users should expect delayed delivery of backlogged messages and residual impact across downstream scenarios as these actions are continuing. We'll provide an expected recovery time as soon as one becomes available to us.</em></p><p>Still no ETA, but you might start seeing some recovery. </p></div><div class="live-content"><time datetime="2026-09-01T01:05:15+00:00">August 31, 2026 – 9:05 PM</time><h2 id="taking-a-break">Taking a break </h2><p>This is Scott. Reports on DD have fallen below 1,000 since before 8 am Pacific. However, based on the Microsoft site its not over.</p><p>I'm taking a brief dinner break. I'll be back soon with more updates.</p></div><div class="live-content"><time datetime="2026-09-01T02:08:53+00:00">August 31, 2026 – 10:08 PM</time><h2 id="email-should-be-recovered">Email should be recovered</h2><p>The most recent update from Microsoft indicates that your email should have returned to normal. Though the status says that some parts of the system aren't recovering properly so you may have issues with things ilke search.</p><p><em>"Users can expect to see continued recovery to email delivery, while users may see residual impact to downstream and dependent scenarios, including search, across affected services. "</em></p></div><div class="live-content"><time datetime="2026-09-01T02:40:43+00:00">August 31, 2026 – 10:40 PM</time><h2 id="reports-are-under-500">Reports are under 500</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:674px;"><p class="vanilla-image-block" style="padding-top:45.70%;"><img id="ou88vSP5rovPjXBiyya52Q" name="Screenshot 2026-08-31 193838" alt="Microsoft outlook outage 8-31-26" src="https://cdn.mos.cms.futurecdn.net/ou88vSP5rovPjXBiyya52Q.png" mos="" align="middle" fullscreen="" width="674" height="308" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Down Detector)</span></figcaption></figure><p>With some recovery in effect, reports are under 500 on Down Detector and I'm seeing a several comments from people who have regained access to their accounts. </p><p>However, I am also still seeing some comments from people who can't sign in or aren't getting emails.</p><p>There is still not ETA for a full recovery and as mentioned earlier, some aspects, like search, aren't working properly. </p></div><div class="live-content"><time datetime="2026-09-01T03:55:44+00:00">August 31, 2026 – 11:55 PM</time><h2 id="calling-it">Calling it</h2><p>Well folks, I'm going to call this outage. </p><p>The reports are under 200, and the status page just updated with this notice:</p><p><em>"We're observing widespread recovery to Exchange Online mail connectivity, though the draining of backlogged mail queues may take longer for some organizations due to the volume of previously queued messages. Our recovery efforts are now focused on re-applying our targeted authentication component fix and restarting certain instances of infrastructure correlated with search functionality to ensure the full restoration of the associated scenarios."</em></p><p>With that settled, this outage appears to finally be over.<br></p></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/news/live/microsoft-outlook-outage-august-31-2026</link>
                                                                            <description>
                            <![CDATA[ Microsoft Outlook appears to be suffering from an outage. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">6jx9qj3S7K2XCpnEnUQyWd</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/KPG47747aX2DtH8NaaLvK-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 31 Aug 2026 18:24:37 +0000</pubDate>                                                                                                                                <updated>Tue, 01 Sep 2026 03:58:57 +0000</updated>
                                                                                                                                            <category><![CDATA[Email]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Internet]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;br&gt;Send secure tips on Signal: scyo1.55.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/KPG47747aX2DtH8NaaLvK-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Outlook]]></media:description>                                                            <media:text><![CDATA[Outlook]]></media:text>
                                <media:title type="plain"><![CDATA[Outlook]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/KPG47747aX2DtH8NaaLvK-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div class="live-content"><p>Microsoft Outlook may be suffering an outage. Reports about the email platform started popping up on the outage-tracking site <a href="https://downdetector.com/status/outlook/" target="_blank">Down Detector</a> starting around 8:30 am Pacific. </p><p>It peaked around 9:30 am around 6,000 reports. The outage appears to be affecting access to mailboxes, delays in sending emails or failure to send. </p><p>Outlook stayed down for nearly 12 hours, last until about 8:30 pm Pacific. A fix was implemented around 6 pm that seemed to get people back online but it didn't completely work and some functions like search didn't work properly for two more hours.</p><p>According to the Microsoft 365 status page, the outage was caused by "an issue within a core authentication configuration used by multiple Microsoft 365 services is resulting in impact."</p><p>We did not see any more specific information beyond that. </p><p>Here's what we know:</p></div><div class="live-content"><time datetime="2026-08-31T18:26:22+00:00">August 31, 2026 – 2:26 PM</time><h2 id="multi-hour-outage">Multi-hour outage</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:673px;"><p class="vanilla-image-block" style="padding-top:42.79%;"><img id="E8exMaQWWNsgzYsLnRiQnN" name="Screenshot 2026-08-31 112543" alt="Microsoft Outlook outage Aug 31, 2026" src="https://cdn.mos.cms.futurecdn.net/E8exMaQWWNsgzYsLnRiQnN.png" mos="" align="middle" fullscreen="" width="673" height="288" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Down Detector)</span></figcaption></figure><p>Reports starting appearing on Down Detector around 8:30 am Pacific but didn't peak until an hour later. </p><p>As of this posting, there are more than 5,000 reports on the outage tracker and no sign of decline.</p></div><div class="live-content"><time datetime="2026-08-31T18:28:54+00:00">August 31, 2026 – 2:28 PM</time><h2 id="microsoft-says-all-systems-quot-operational-quot">Microsoft says all systems "operational"</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LFP6P5nzNFP8AkCLiWJSvG" name="Microsoft" alt="Microsoft 365 becomes Microsoft 364" src="https://cdn.mos.cms.futurecdn.net/LFP6P5nzNFP8AkCLiWJSvG.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Paolo Bona / Shutterstock.com / Microsoft / Future)</span></figcaption></figure><p>I've checked the Microsoft 365 <a href="https://status.cloud.microsoft/m365/referrer=serviceStatusRedirect" target="_blank">status page</a>, and according to that page every Microsoft product is operational.</p></div><div class="live-content"><time datetime="2026-08-31T18:31:03+00:00">August 31, 2026 – 2:31 PM</time><h2 id="m365-twitter-account-acknowledges-problem">M365 Twitter account acknowledges problem</h2><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2094465993007378744"><p lang="en" dir="ltr">We've confirmed that users may experience degraded functionality with various Exchange Online functionalities. We're reviewing service telemetry and diagnostic data to isolate the source of the issue. For more information, please see EX1464935 in the admin center.<a href="https://twitter.com/cantworkitout/status/2094465993007378744">August 31, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>While the Microsoft 365 status page isn't showing any issues, the official <a href="https://x.com/MSFT365Status/status/2094465993007378744" target="_blank">Microsoft 365 Status X account</a> did acknowledge the issue.</p><p>"We've confirmed that users may experience degraded functionality with various Exchange Online functionalities. We're reviewing service telemetry and diagnostic data to isolate the source of the issue. For more information, please see EX1464935 in the admin center," the post reads. </p></div><div class="live-content"><time datetime="2026-08-31T18:34:28+00:00">August 31, 2026 – 2:34 PM</time><h2 id="what-issues-are-we-seeing">What issues are we seeing?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:853px;"><p class="vanilla-image-block" style="padding-top:60.96%;"><img id="77h7giWwLQ9NhbRWTtqwSd" name="outlook-iphone-shst.jpg" alt="Microsoft Outlook" src="https://cdn.mos.cms.futurecdn.net/77h7giWwLQ9NhbRWTtqwSd.jpg" mos="" align="middle" fullscreen="" width="853" height="520" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Based on comments from Down Detector and X, the most common issue appears to be a failure to actually send and receive emails for those who can get in.</p><p>I've seen several comments saying that the app won't even open on their computers. </p><p>"Not receiving emails since about 10:45 am, then went downhill, replies stopped coming through, then emails came to a halt, and then, besides Outlook constantly freezing, now my shared work folder is no longer showing me emails and gives an error," one said.</p><p>For those in businesses, it appears they can't even send messages between connected emails.</p></div><div class="live-content"><time datetime="2026-08-31T18:40:54+00:00">August 31, 2026 – 2:40 PM</time><h2 id="users-quot-may-experience-a-variety-of-symptoms-quot">Users "may experience a variety of symptoms"</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1981px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="QcDNYDHLZWSjpMdgzpVJQG" name="Outlook.shutterstock_2384091865.jpg" alt="Outlook on a laptop" src="https://cdn.mos.cms.futurecdn.net/QcDNYDHLZWSjpMdgzpVJQG.jpg" mos="" align="middle" fullscreen="" width="1981" height="1114" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>If you can get in the 365 Admin Center, this is the message you should see:</p><p>"Users may be unable to connect to, or experience degraded functionality with Exchange Online</p><p>Users may experience a variety of symptoms related to this event, including but not limited to:<br>- Delays, failures, or incomplete results when searching for content within Exchange Online mailboxes.<br>- Delays or failures when sending or receiving email messages.<br>- Authentication-related errors when accessing Exchange Online services.<br>- Difficulties accessing or performing actions within Exchange administration experiences.<br>- Intermittent failures affecting mailbox operations and message delivery workflows."</p></div><div class="live-content"><time datetime="2026-08-31T18:51:20+00:00">August 31, 2026 – 2:51 PM</time><h2 id="slow-decline">Slow decline</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:675px;"><p class="vanilla-image-block" style="padding-top:45.63%;"><img id="LCj29zbxdQbXSkRrDP5HXk" name="Screenshot 2026-08-31 114803" alt="Microsoft Outlook outage 8/31/26" src="https://cdn.mos.cms.futurecdn.net/LCj29zbxdQbXSkRrDP5HXk.png" mos="" align="middle" fullscreen="" width="675" height="308" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Down Detector)</span></figcaption></figure><p>Over on Down Detector, reports have started to decline. </p><p>The peak around 9:30 a.m. was around 6,000 reports. As of 11:45 a.m. Pacific, reports are closer to 4,500. </p><p>I've seen some people in offices say that portions of their teams are able to access the email platform, but some of the team is still down.</p></div><div class="live-content"><time datetime="2026-08-31T19:09:19+00:00">August 31, 2026 – 3:09 PM</time><h2 id="no-updates-from-microsoft">No updates from Microsoft</h2><p>Other than the couple tweets and the Admin Center update, we haven't seen any other updates from Microsoft. </p><p>It's not clear what work is being done to resolve the outage.</p></div><div class="live-content"><time datetime="2026-08-31T19:26:40+00:00">August 31, 2026 – 3:26 PM</time><h2 id="is-outlook-down-for-you">Is Outlook down for you?</h2><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W5E2wW"></div>                            </div>                            <script src="https://kwizly.com/embed/W5E2wW.js" async></script><p>Let us know in the comments what issues you're experiencing. </p></div><div class="live-content"><time datetime="2026-08-31T19:44:03+00:00">August 31, 2026 – 3:44 PM</time><h2 id="outage-has-last-4-hours">Outage has last 4 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ytx7gsKrfFbWNQV8E7E9NB" name="MicrosoftOutlook.jpg" alt="The Microsoft Outlook app open on a phone" src="https://cdn.mos.cms.futurecdn.net/ytx7gsKrfFbWNQV8E7E9NB.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>With no updates from Microsoft, today's Outlook outage has lasted for more than four hours.</p><p>As of this posting, despite declining reports it's not clear when the outage might end.</p></div><div class="live-content"><time datetime="2026-08-31T19:52:00+00:00">August 31, 2026 – 3:52 PM</time><h2 id="update-from-microsoft">Update from Microsoft</h2><p>On the <a href="https://status.cloud.microsoft/m365/referrer=serviceStatusRedirect" target="_blank">M365 status page</a>, a new update just popped up. </p><p>Here it is: </p><p>OneDrive for Business and SharePoint Online: Users may be unable to load or refresh portions of OneDrive and SharePoint, including account and storage information, search results, Favorites, Followed and Shared With Me content, recent files, lists, and news. Some users may also experience delayed or failed file opening, Office policy-label retrieval, OneDrive synchronization, mobile camera upload, and video playback. Users may see partial page failures, missing or stale content, repeated retries, and operation timeouts rather than a complete platform outage.</p><p>Exchange Online: Users may be unable to connect to, or experience degraded functionality, with Exchange Online. All connection methods are affected. </p><p>Microsoft Teams: Users may experience issues with calendar functionality and search. Users’ presence may be stale and not update automatically or through manual adjustment. User location adjustment may fail. </p><p>Microsoft Purview: Users may face intermittent authorization failures across solutions in Purview. Purview admins can’t access the portal. Additionally, in Microsoft Purview Communication Compliance, users may see errors when loading Communication Compliance policies and Data Loss Prevention (DLP) policies. Communication Compliance policy creation and evaluation may be delayed. </p><p>Microsoft Defender XDR: Users may experience intermittent authorization failures across solutions in Defender. </p><p><strong>Current status: </strong>We're continuing to perform comprehensive tests to ensure our mitigation strategy effectively resolves the issue without introducing additional impact. In parallel, we're exploring alternative remediation avenues to minimize impact in the interim. </p><p><strong>Scope of impact: </strong>Users attempting to perform any of the outlined impact scenarios may be affected by this event. </p><p><strong>Preliminary root cause: </strong>An issue within a core authentication configuration used by multiple Microsoft 365 services is resulting in impact. </p></div><div class="live-content"><time datetime="2026-08-31T20:14:23+00:00">August 31, 2026 – 4:14 PM</time><h2 id="snail-mail">Snail mail</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="gWoW8UhSG7R78YpMZFCbYT" name="GettyImages-78486862edit.jpg" alt="Letter posted through the letterbox" src="https://cdn.mos.cms.futurecdn.net/gWoW8UhSG7R78YpMZFCbYT.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Getty Images)</span></figcaption></figure><p>Not much new to share with you but this message from a frustrated user on Down Detector gave me a chuckle.</p><p>"Now distributing stamps & envelopes to our team. Printer is working overtime."</p></div><div class="live-content"><time datetime="2026-08-31T20:39:57+00:00">August 31, 2026 – 4:39 PM</time><h2 id="outage-appears-international">Outage appears international</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="SvzWgUkw8ivTUYcraTxj4n" name="TG-worldle-lede-shutterstock.jpg" alt="An image of the globe on a blue background. The globe has a green question mark formed from land." src="https://cdn.mos.cms.futurecdn.net/SvzWgUkw8ivTUYcraTxj4n.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Users reporting in on Down Detector are claiming to be from all over the country including New York, Las Vegas, Kentucky, Indianapolis and more.</p><p>I'm also seeing some reports from other countries including Guatamala City, Montevideo, Uruguay and Argentina.</p></div><div class="live-content"><time datetime="2026-08-31T21:23:00+00:00">August 31, 2026 – 5:23 PM</time><h2 id="where-we-stand-after-6-hours">Where we stand after 6 hours</h2><p>Unfortunately, pretty much the same. </p><p>The M365 status page had a recent update that shows Microsoft's engineers are working on the issue but it doesn't appear relief is coming any time soon.</p><p>"Current status: We're reexamining recent changes made to the service to determine why the authentication components aren't being deployed as expected. Additionally, we are exploring every avenue to safely restore the components, including reverting an update the affected infrastructure recently received. We're performing additional tests to determine whether this will provide relief."</p><p>Reports on Down Detector have declined but I think that's more because people on the East Coast are starting to log off for the day.</p></div><div class="live-content"><time datetime="2026-08-31T22:07:39+00:00">August 31, 2026 – 6:07 PM</time><h2 id="slow-decline-but-still-thousands-of-reports">Slow decline but still thousands of reports</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:675px;"><p class="vanilla-image-block" style="padding-top:45.48%;"><img id="B4chNaKBrbEUxpGwKJcqZn" name="Screenshot 2026-08-31 150353" alt="Microsoft Outlook outage 8/31/26" src="https://cdn.mos.cms.futurecdn.net/B4chNaKBrbEUxpGwKJcqZn.png" mos="" align="middle" fullscreen="" width="675" height="307" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Down Detector)</span></figcaption></figure><p>As mentioned in my last post, the reports on Down Detector have been in a steady decline, but there are still thousands of reports. Currently, it's sitting around 3,100. </p><p>There are certainly people using Outlook for personal reasons, but I think reports will decline as people across the US start to log off from work. </p></div><div class="live-content"><time datetime="2026-08-31T22:41:53+00:00">August 31, 2026 – 6:41 PM</time><h2 id="a-different-update-from-microsoft">A different update from Microsoft</h2><p>A user on Down Detector shared an alleged update from Microsoft.</p><p>Here's what it says: </p><p>We're continuing our targeted review of affected infrastructure and recent changes made to the service to definitively confirm the cause of impact. We're additionally continuing to test and implement various mitigation strategies to apply the necessary authentication component, which have so far yielded positive results. We're monitoring these tests and mitigative actions closely and will provide an estimated time to resolution as soon as one is available.</p><p>We understand the impact that events like these can have for your organization and we appreciate your patience as we work to mitigate this issue with the highest priority.</p></div><div class="live-content"><time datetime="2026-08-31T23:19:32+00:00">August 31, 2026 – 7:19 PM</time><h2 id="fixes-may-be-in-the-works">Fixes may be in the works</h2><p>It finally seems that Microsoft may have mitigations in place. Though the company has not yet provided an estimated time for a return to normal service.</p><p>"<em>We're continuing to implement a targeted mitigation to re-apply core authentication components, and we're expanding this action more widely across the affected environments as we closely track the recovery of affected downstream scenarios. Users may notice gradual recovery to the scenarios identified in the "More info" section as our mitigation action takes effect in their corresponding sections of infrastructure, and we're continuing to review whether any additional actions may be required to achieve withstanding recovery across all affected scenarios. We'll provide an estimated time to resolution as soon as one is available."</em></p></div><div class="live-content"><time datetime="2026-08-31T23:45:49+00:00">August 31, 2026 – 7:45 PM</time><h2 id="reports-continue-to-decline">Reports continue to decline</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:674px;"><p class="vanilla-image-block" style="padding-top:45.99%;"><img id="6pLQZLUvZ6om6asAdqsHWX" name="Screenshot 2026-09-01 084149" alt="Microsoft Outlook outage 8/31/26" src="https://cdn.mos.cms.futurecdn.net/6pLQZLUvZ6om6asAdqsHWX.png" mos="" align="middle" fullscreen="" width="674" height="310" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: New York Times)</span></figcaption></figure><p>Reports on Down Detector continue their steady decline but we are hewing closer to 5 pm on the West Coast, where it's likely people are starting to logoff there and I expect reports will take a nosedive over the next hour. </p><p>Microsoft still hasn't provided an ETA for a return to normal service. </p></div><div class="live-content"><time datetime="2026-09-01T00:23:36+00:00">August 31, 2026 – 8:23 PM</time><h2 id="microsoft-response">Microsoft response</h2><p>I reached out to Microsoft to see if they could provide an ETA or any kind of update. Unfortunately, I received neither. </p><p>Here's what I was told by a Microsoft spokesperson:</p><p><em>"We're aware of an issue affecting access to Exchange Online and some other services. We know this is disruptive for customers and we appreciate their patience while we work to restore services as quickly as possible. Updates are available on the </em><a href="https://uk01.l.antigena.com/l/1UXr5cGKjjp0o2OL9xWNCMQk8F5sezohurKMdWGBF~rOWnnC0ieSs5x3_ixEJl-9fBhzYDp399RfJgJtHCUKNYeHbfKpi8t8l2IxjOeb5OqEtC_rwHfjSOAJQYNdzGxW0U1Crn-~JZJDGQG9bg6ykf_Hni7Ylhx_mcFjEwBA2R" target="_blank"><u><em>Microsoft service health status page</em></u></a><em> and </em><a href="https://x.com/MSFT365Status/status/2094455556454920701" target="_blank"><em>@MSFT365Status</em></a><em>."</em><em><strong> </strong></em></p></div><div class="live-content"><time datetime="2026-09-01T00:37:28+00:00">August 31, 2026 – 8:37 PM</time><h2 id="latest-update-from-status-page">Latest update from status page</h2><p>Here's the latest update from the Microsoft status page: </p><p><em>We're progressively restarting targeted sections of affected infrastructure to ensure the re-applied authentication components are effectively implemented across affected services. We expect this will aid the recovery of affected scenarios. Users should expect delayed delivery of backlogged messages and residual impact across downstream scenarios as these actions are continuing. We'll provide an expected recovery time as soon as one becomes available to us.</em></p><p>Still no ETA, but you might start seeing some recovery. </p></div><div class="live-content"><time datetime="2026-09-01T01:05:15+00:00">August 31, 2026 – 9:05 PM</time><h2 id="taking-a-break">Taking a break </h2><p>This is Scott. Reports on DD have fallen below 1,000 since before 8 am Pacific. However, based on the Microsoft site its not over.</p><p>I'm taking a brief dinner break. I'll be back soon with more updates.</p></div><div class="live-content"><time datetime="2026-09-01T02:08:53+00:00">August 31, 2026 – 10:08 PM</time><h2 id="email-should-be-recovered">Email should be recovered</h2><p>The most recent update from Microsoft indicates that your email should have returned to normal. Though the status says that some parts of the system aren't recovering properly so you may have issues with things ilke search.</p><p><em>"Users can expect to see continued recovery to email delivery, while users may see residual impact to downstream and dependent scenarios, including search, across affected services. "</em></p></div><div class="live-content"><time datetime="2026-09-01T02:40:43+00:00">August 31, 2026 – 10:40 PM</time><h2 id="reports-are-under-500">Reports are under 500</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:674px;"><p class="vanilla-image-block" style="padding-top:45.70%;"><img id="ou88vSP5rovPjXBiyya52Q" name="Screenshot 2026-08-31 193838" alt="Microsoft outlook outage 8-31-26" src="https://cdn.mos.cms.futurecdn.net/ou88vSP5rovPjXBiyya52Q.png" mos="" align="middle" fullscreen="" width="674" height="308" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Down Detector)</span></figcaption></figure><p>With some recovery in effect, reports are under 500 on Down Detector and I'm seeing a several comments from people who have regained access to their accounts. </p><p>However, I am also still seeing some comments from people who can't sign in or aren't getting emails.</p><p>There is still not ETA for a full recovery and as mentioned earlier, some aspects, like search, aren't working properly. </p></div><div class="live-content"><time datetime="2026-09-01T03:55:44+00:00">August 31, 2026 – 11:55 PM</time><h2 id="calling-it">Calling it</h2><p>Well folks, I'm going to call this outage. </p><p>The reports are under 200, and the status page just updated with this notice:</p><p><em>"We're observing widespread recovery to Exchange Online mail connectivity, though the draining of backlogged mail queues may take longer for some organizations due to the volume of previously queued messages. Our recovery efforts are now focused on re-applying our targeted authentication component fix and restarting certain instances of infrastructure correlated with search functionality to ensure the full restoration of the associated scenarios."</em></p><p>With that settled, this outage appears to finally be over.<br></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tested 6 RTX Spark laptops for gaming — and the winner completely shocked me ]]></title>
                                                                                                <dc:content><![CDATA[ <p>For years, my ultimate computing friction point has been the two-device compromise: I buy a thin and light MacBook for productivity, and keep a massive gaming rig at home for play. But after going hands-on with six <a href="https://www.tomsguide.com/computing/laptops/nvidia-rtx-spark-hands-on-review">Nvidia RTX Spark</a> laptops launching later this year, I can confidently say that era is over.</p><p>Put simply, this is shaping up to be a game-changer. Packing 6,144 CUDA cores into thin and light notebooks like these, it’s bridging the gap between serious productivity and high-end gaming. And crucially, game developers are already jumping on board to support it — ensuring vital anti-cheat software compatibility is ready to go.</p><p>But packing a powerful GPU into a sleek chassis doesn’t automatically make it a great gaming machine. Other factors are just as vital like how the keyboard feels, how loud the fans are and display quality. </p><p>I spent extensive time playing on six different models, and here’s my definitive RTX Spark gaming tier list, ranked from worst to best.</p><h2 id="a-dream-for-gamers">A dream for 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:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VPJcvprGffc9FfD2cHiytJ" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/VPJcvprGffc9FfD2cHiytJ.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Before I get there, though, this isn’t my <a href="https://www.tomsguide.com/computing/laptops/nvidia-rtx-spark-hands-on-review">first rodeo with Spark</a>. I did get to try the chip out at Computex this year (on my Birthday of all days). And since that was a much earlier version of what I saw here at Gamescom, here are some general updates:</p><ul><li><strong>More laptops, more fun: </strong>At Computex, only the <a href="https://www.tomsguide.com/computing/laptops/microsoft-surface-laptop-ultra-rtx-spark-hands-on-review">Surface Laptop Ultra</a> was turned on and usable. However, this time around they were all active and usable.</li><li><strong>Backing up their claims: </strong>Nvidia is touting 1440p gaming at over 100 FPS. Of course, with no visible FPS counter, I can’t confirm that specifically, but to the eye, all the games were running significantly over 60 FPS — settings at a range of medium to high (depending on the title) and DLSS turned on.</li><li><strong>So many developers on board: </strong>Turns out if you’re Nvidia, you have a fair bit of influence to get publishers on board. Windows on Arm is getting a shot in the arm thanks to anti-cheat support and a massive number of studios jumping on board to work on Arm-native versions of their games.</li><li><strong>Emulation looks much better: </strong>The fact Pragmata was even running through the Windows Prism emulation layer to make it play nice on an Arm chip was quite the achievement at Computex. But there definitely was a little bit of fuzziness to the gameplay looking back. Now, with four games including 007 First Light all emulated, they’re all crystal clear and playing great with no discernible latency.</li></ul><p>Put simply, things have definitely moved on since June, and anything with that RTX Spark sticker on the body is going to be a mighty tasty machine to get, come this fall. That being said, I’m here to talk about how some of these specific laptops fare for gaming on a build level — not a chip level.</p><h2 class="article-body__section" id="section-rtx-spark-laptop-for-gaming-tier-list-specs"><span>RTX Spark laptop (for gaming) tier list: Specs</span></h2><div ><table><thead><tr><th class="firstcol " ><p>Laptop</p></th><th  ><p>Form Factor</p></th><th  ><p>Display</p></th><th  ><p>Key Strength</p></th><th  ><p>Gaming Tier</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>HP OmniBook Ultra 16</strong></p></td><td  ><p>16-inch Clamshell</p></td><td  ><p>OLED (High-Refresh)</p></td><td  ><p>Near-mechanical keyboard tactility & stealth chassis</p></td><td  ><p><strong>S-Tier</strong></p></td></tr><tr><td class="firstcol " ><p><strong>MSI Prestige N16 Flip AI+</strong></p></td><td  ><p>16-inch 2-in-1</p></td><td  ><p>OLED Panel</p></td><td  ><p>Convertible tent-mode gaming with controller</p></td><td  ><p><strong>A-Tier</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Lenovo Yoga Pro 9n</strong></p></td><td  ><p>15-inch Clamshell</p></td><td  ><p>OLED Panel</p></td><td  ><p>Superb keyboard ergonomics & premium build</p></td><td  ><p><strong>A-Tier</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Asus ProArt P14</strong></p></td><td  ><p>14-inch Clamshell</p></td><td  ><p>3K OLED</p></td><td  ><p>MacBook Pro build quality (loud under load)</p></td><td  ><p><strong>B-Tier</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Surface Laptop Ultra</strong></p></td><td  ><p>15-inch Clamshell</p></td><td  ><p>Mini-LED PixelSense (3:2)</p></td><td  ><p>Stunning display, but sharp wrist-rest edges</p></td><td  ><p><strong>B-Tier</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Dell XPS 16</strong></p></td><td  ><p>16-inch Clamshell</p></td><td  ><p>Tandem OLED</p></td><td  ><p>Gorgeous design, but zero-gap keys falter in gaming</p></td><td  ><p><strong>C-Tier</strong></p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-c-tier-a-laptop-wearing-a-suit"><span>C-tier: A laptop wearing a suit</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/2kzHp5q252NWjL5RQTYj6K.jpg" alt="Nvidia RTX Spark" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/GxuwvNgRn4xiPWpMe3zm5K.jpg" alt="Nvidia RTX Spark" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>Now don’t get me wrong, the <strong>Dell XPS 16</strong> is an undeniably good-looking laptop that will easily elicit an “oh that’s a cool thing” reaction when you pull it out in a meeting. The utilitarian body is sleek and that Tandem OLED display is super vivid.</p><p>But is this a safe space? Because that keyboard is problematic for gaming to put it mildly. It’s a flat chiclet board with zero gaps between the keys. Doom: The Dark Ages exposed the gaming flaws of a keyboard like this, as the lack of key definition had me panickedly looking down mid-battle to ensure I was on the WASD. </p><p>Like I said earlier this year, with a little time you can get used to this for productivity. But for gaming, it's not quite there.</p><h2 class="article-body__section" id="section-b-tier-productivity-first-gaming-second"><span>B-Tier: Productivity first, gaming second</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wyCtSGaYPD8Lec4znM2TpJ" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/wyCtSGaYPD8Lec4znM2TpJ.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>These two are quite a bit better for gaming on an ergonomic level, but aren’t all the way there compared to some superior tactility further up this list.</p><p>First up is the <strong>Microsoft Surface Laptop Ultra: </strong>packing a delicious 15-inch mini-LED PixelSense Ultra touchscreen display with 3:2 aspect ratio. That taller screen may be more productivity-focused, but it’s gonna be great for RTS games too.</p><p>But again, the keyboard falters here slightly. Not that it’s <em>bad</em>, it’s a great-feeling tactile set of keys for productivity for sure. But for gaming, the dish of each key is far too subtle and the sharpness of those edges do cut into your wrists. So it firmly sits in the “it’s okay” category for 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:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="QGFSy32iWf8p6fxvjiwcxJ" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/QGFSy32iWf8p6fxvjiwcxJ.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>Slightly better for play is my original personal favorite from Computex — the <strong>Asus ProArt P14. </strong>Basically, Asus understood the assignment and gave me a Windows equivalent of a MacBook Pro in its design and ergonomics. The keyboard’s better here for demanding gameplay too, and that 3K OLED display is mesmerizing.</p><p>But what do you get when you cram this much power into a small body? Loud fans to get all the heat out. To my ears at least, this was the loudest laptop in the testing room. It’s a great hybrid machine, but make sure you get a good gaming headset to drown out that fan noise.</p><h2 class="article-body__section" id="section-a-tier-great-all-rounders"><span>A-Tier: Great all-rounders</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cHFDiUgx9F3jX98eyxbtsJ" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/cHFDiUgx9F3jX98eyxbtsJ.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>Now we’re moving closer to the elite if gaming is a priority for your RTX Spark machine. The <strong>Lenovo Yoga Pro 9n </strong>boasts a great premium design with another vivid OLED display. </p><p>For gameplay, there are very few genuine downsides here — capped off by Lenovo’s trademark excellent keyboard ergonomics. The only reason it’s here in the A-tier is because one company has pulled a blinder with its board (more on that in a moment).</p><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="HJHDguXZ5CYkeDPeheeupJ" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/HJHDguXZ5CYkeDPeheeupJ.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>Then there’s the <strong>MSI Prestige N16 Flip AI+</strong>. Yes, the keyboard is a little too heavy on the RGB lighting for my personal taste, but it feels good to tap away on, the OLED screen is a lovely flash flood of color, and it’s a 2-in-1 form factor that allows for tent mode gaming with a controller. That’s something none of these other options can do.</p><h2 class="article-body__section" id="section-s-tier-the-unexpected-champion"><span>S-Tier: The unexpected champion</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/ZacrHEyMkoy6ygfnoXviFK.jpg" alt="Nvidia RTX Spark" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/V529XqE9o2HXukhBbZX2zJ.jpg" alt="Nvidia RTX Spark" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>Which leaves one: the <strong>HP OmniBook Ultra 16. </strong>When I first saw this laptop at Computex, it looked like a decidedly “just fine” device. I expected it to just be another laptop more suited to work over play. I couldn’t have been more wrong.</p><p>There’s of course a crispy and gorgeous OLED panel here that moves fluidly, but that’s not the real champion feature here. That belongs to the keyboard, which elevated this machine to the top of the list. It’s a chiclet board, but the well defined keys and travel make it feel almost mechanical-like. It feels fantastic during gameplay, and with slick stylings to the chassis, it’s the ultimate stealth gaming laptop.</p><h2 class="article-body__section" id="section-plenty-to-look-forward-to"><span>Plenty to look forward to</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RewkLciiWWu8fmzQZn4nUP" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/RewkLciiWWu8fmzQZn4nUP.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 RTX Spark lineup proves that the days of compromising between a sleek daily driver and a capable gaming machine are finally coming to a close. These six distinct options will hit the market soon, and while I can scrutinize them from a gaming perspective, they’re meant for so much more.</p><p>As <a href="https://www.tomsguide.com/computing/i-spoke-to-nvidia-ceo-jensen-huang-about-rtx-spark-he-is-willing-to-work-on-an-rtx-gaming-handheld-n2x-and-n3x-are-already-planned-and-the-chip-is-more-like-r2d2-than-a-laptop-cpu">CEO Jensen Huang said himself</a> when I got the chance to talk to him: “we’re focused on reinventing the PC.” There’s going to be something for everyone in this range. So I have to ask — if you’ve got the budget for one of these notebooks, which one would you spend your money on?</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/toms-guide-computing-awards-2026-22-game-changing-laptops-desktops-and-peripherals"><strong>Tom’s Guide Computing Awards 2026: 22 game-changing laptops, desktops and peripherals</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/gaming/playstation/as-a-pc-snob-i-wanted-to-catch-gta-6-making-console-compromises-instead-im-in-awe-of-the-trickery"><strong>As a PC snob, I wanted to catch GTA 6 making console compromises. Instead, I’m in awe of the trickery</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/computing/gpus/i-tested-nvidias-new-dlss-4-5-ray-reconstruction-it-finally-fixes-path-tracings-biggest-flaw-but-heres-the-reality-check"><strong>I tested NVIDIA’s new DLSS 4.5 Ray Reconstruction — it finally fixes path tracing’s biggest flaw, but here’s the reality check</strong></a><strong></strong></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/gaming-laptops/i-tested-6-rtx-spark-laptops-for-gaming-and-the-winner-completely-shocked-me</link>
                                                                            <description>
                            <![CDATA[ I just played games on 6 Nvidia RTX Spark laptops. From the Dell XPS 16 to the HP OmniBook Ultra 16, here is our definitive gaming tier list. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">qMNhNCq7WRHfhSGandcSqW</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/myJ3m3LbFK9Ly6WTKEsafK-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 31 Aug 2026 11:00:00 +0000</pubDate>                                                                                                                                <updated>Mon, 31 Aug 2026 11:30:15 +0000</updated>
                                                                                                                                            <category><![CDATA[Gaming Laptops]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Laptops]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6.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/myJ3m3LbFK9Ly6WTKEsafK-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Nvidia RTX Spark]]></media:description>                                                            <media:text><![CDATA[Nvidia RTX Spark]]></media:text>
                                <media:title type="plain"><![CDATA[Nvidia RTX Spark]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/myJ3m3LbFK9Ly6WTKEsafK-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>For years, my ultimate computing friction point has been the two-device compromise: I buy a thin and light MacBook for productivity, and keep a massive gaming rig at home for play. But after going hands-on with six <a href="https://www.tomsguide.com/computing/laptops/nvidia-rtx-spark-hands-on-review">Nvidia RTX Spark</a> laptops launching later this year, I can confidently say that era is over.</p><p>Put simply, this is shaping up to be a game-changer. Packing 6,144 CUDA cores into thin and light notebooks like these, it’s bridging the gap between serious productivity and high-end gaming. And crucially, game developers are already jumping on board to support it — ensuring vital anti-cheat software compatibility is ready to go.</p><p>But packing a powerful GPU into a sleek chassis doesn’t automatically make it a great gaming machine. Other factors are just as vital like how the keyboard feels, how loud the fans are and display quality. </p><p>I spent extensive time playing on six different models, and here’s my definitive RTX Spark gaming tier list, ranked from worst to best.</p><h2 id="a-dream-for-gamers">A dream for 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:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VPJcvprGffc9FfD2cHiytJ" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/VPJcvprGffc9FfD2cHiytJ.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Before I get there, though, this isn’t my <a href="https://www.tomsguide.com/computing/laptops/nvidia-rtx-spark-hands-on-review">first rodeo with Spark</a>. I did get to try the chip out at Computex this year (on my Birthday of all days). And since that was a much earlier version of what I saw here at Gamescom, here are some general updates:</p><ul><li><strong>More laptops, more fun: </strong>At Computex, only the <a href="https://www.tomsguide.com/computing/laptops/microsoft-surface-laptop-ultra-rtx-spark-hands-on-review">Surface Laptop Ultra</a> was turned on and usable. However, this time around they were all active and usable.</li><li><strong>Backing up their claims: </strong>Nvidia is touting 1440p gaming at over 100 FPS. Of course, with no visible FPS counter, I can’t confirm that specifically, but to the eye, all the games were running significantly over 60 FPS — settings at a range of medium to high (depending on the title) and DLSS turned on.</li><li><strong>So many developers on board: </strong>Turns out if you’re Nvidia, you have a fair bit of influence to get publishers on board. Windows on Arm is getting a shot in the arm thanks to anti-cheat support and a massive number of studios jumping on board to work on Arm-native versions of their games.</li><li><strong>Emulation looks much better: </strong>The fact Pragmata was even running through the Windows Prism emulation layer to make it play nice on an Arm chip was quite the achievement at Computex. But there definitely was a little bit of fuzziness to the gameplay looking back. Now, with four games including 007 First Light all emulated, they’re all crystal clear and playing great with no discernible latency.</li></ul><p>Put simply, things have definitely moved on since June, and anything with that RTX Spark sticker on the body is going to be a mighty tasty machine to get, come this fall. That being said, I’m here to talk about how some of these specific laptops fare for gaming on a build level — not a chip level.</p><h2 class="article-body__section" id="section-rtx-spark-laptop-for-gaming-tier-list-specs"><span>RTX Spark laptop (for gaming) tier list: Specs</span></h2><div ><table><thead><tr><th class="firstcol " ><p>Laptop</p></th><th  ><p>Form Factor</p></th><th  ><p>Display</p></th><th  ><p>Key Strength</p></th><th  ><p>Gaming Tier</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>HP OmniBook Ultra 16</strong></p></td><td  ><p>16-inch Clamshell</p></td><td  ><p>OLED (High-Refresh)</p></td><td  ><p>Near-mechanical keyboard tactility & stealth chassis</p></td><td  ><p><strong>S-Tier</strong></p></td></tr><tr><td class="firstcol " ><p><strong>MSI Prestige N16 Flip AI+</strong></p></td><td  ><p>16-inch 2-in-1</p></td><td  ><p>OLED Panel</p></td><td  ><p>Convertible tent-mode gaming with controller</p></td><td  ><p><strong>A-Tier</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Lenovo Yoga Pro 9n</strong></p></td><td  ><p>15-inch Clamshell</p></td><td  ><p>OLED Panel</p></td><td  ><p>Superb keyboard ergonomics & premium build</p></td><td  ><p><strong>A-Tier</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Asus ProArt P14</strong></p></td><td  ><p>14-inch Clamshell</p></td><td  ><p>3K OLED</p></td><td  ><p>MacBook Pro build quality (loud under load)</p></td><td  ><p><strong>B-Tier</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Surface Laptop Ultra</strong></p></td><td  ><p>15-inch Clamshell</p></td><td  ><p>Mini-LED PixelSense (3:2)</p></td><td  ><p>Stunning display, but sharp wrist-rest edges</p></td><td  ><p><strong>B-Tier</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Dell XPS 16</strong></p></td><td  ><p>16-inch Clamshell</p></td><td  ><p>Tandem OLED</p></td><td  ><p>Gorgeous design, but zero-gap keys falter in gaming</p></td><td  ><p><strong>C-Tier</strong></p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-c-tier-a-laptop-wearing-a-suit"><span>C-tier: A laptop wearing a suit</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/2kzHp5q252NWjL5RQTYj6K.jpg" alt="Nvidia RTX Spark" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/GxuwvNgRn4xiPWpMe3zm5K.jpg" alt="Nvidia RTX Spark" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>Now don’t get me wrong, the <strong>Dell XPS 16</strong> is an undeniably good-looking laptop that will easily elicit an “oh that’s a cool thing” reaction when you pull it out in a meeting. The utilitarian body is sleek and that Tandem OLED display is super vivid.</p><p>But is this a safe space? Because that keyboard is problematic for gaming to put it mildly. It’s a flat chiclet board with zero gaps between the keys. Doom: The Dark Ages exposed the gaming flaws of a keyboard like this, as the lack of key definition had me panickedly looking down mid-battle to ensure I was on the WASD. </p><p>Like I said earlier this year, with a little time you can get used to this for productivity. But for gaming, it's not quite there.</p><h2 class="article-body__section" id="section-b-tier-productivity-first-gaming-second"><span>B-Tier: Productivity first, gaming second</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wyCtSGaYPD8Lec4znM2TpJ" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/wyCtSGaYPD8Lec4znM2TpJ.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>These two are quite a bit better for gaming on an ergonomic level, but aren’t all the way there compared to some superior tactility further up this list.</p><p>First up is the <strong>Microsoft Surface Laptop Ultra: </strong>packing a delicious 15-inch mini-LED PixelSense Ultra touchscreen display with 3:2 aspect ratio. That taller screen may be more productivity-focused, but it’s gonna be great for RTS games too.</p><p>But again, the keyboard falters here slightly. Not that it’s <em>bad</em>, it’s a great-feeling tactile set of keys for productivity for sure. But for gaming, the dish of each key is far too subtle and the sharpness of those edges do cut into your wrists. So it firmly sits in the “it’s okay” category for 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:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="QGFSy32iWf8p6fxvjiwcxJ" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/QGFSy32iWf8p6fxvjiwcxJ.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>Slightly better for play is my original personal favorite from Computex — the <strong>Asus ProArt P14. </strong>Basically, Asus understood the assignment and gave me a Windows equivalent of a MacBook Pro in its design and ergonomics. The keyboard’s better here for demanding gameplay too, and that 3K OLED display is mesmerizing.</p><p>But what do you get when you cram this much power into a small body? Loud fans to get all the heat out. To my ears at least, this was the loudest laptop in the testing room. It’s a great hybrid machine, but make sure you get a good gaming headset to drown out that fan noise.</p><h2 class="article-body__section" id="section-a-tier-great-all-rounders"><span>A-Tier: Great all-rounders</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cHFDiUgx9F3jX98eyxbtsJ" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/cHFDiUgx9F3jX98eyxbtsJ.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>Now we’re moving closer to the elite if gaming is a priority for your RTX Spark machine. The <strong>Lenovo Yoga Pro 9n </strong>boasts a great premium design with another vivid OLED display. </p><p>For gameplay, there are very few genuine downsides here — capped off by Lenovo’s trademark excellent keyboard ergonomics. The only reason it’s here in the A-tier is because one company has pulled a blinder with its board (more on that in a moment).</p><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="HJHDguXZ5CYkeDPeheeupJ" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/HJHDguXZ5CYkeDPeheeupJ.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>Then there’s the <strong>MSI Prestige N16 Flip AI+</strong>. Yes, the keyboard is a little too heavy on the RGB lighting for my personal taste, but it feels good to tap away on, the OLED screen is a lovely flash flood of color, and it’s a 2-in-1 form factor that allows for tent mode gaming with a controller. That’s something none of these other options can do.</p><h2 class="article-body__section" id="section-s-tier-the-unexpected-champion"><span>S-Tier: The unexpected champion</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/ZacrHEyMkoy6ygfnoXviFK.jpg" alt="Nvidia RTX Spark" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/V529XqE9o2HXukhBbZX2zJ.jpg" alt="Nvidia RTX Spark" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>Which leaves one: the <strong>HP OmniBook Ultra 16. </strong>When I first saw this laptop at Computex, it looked like a decidedly “just fine” device. I expected it to just be another laptop more suited to work over play. I couldn’t have been more wrong.</p><p>There’s of course a crispy and gorgeous OLED panel here that moves fluidly, but that’s not the real champion feature here. That belongs to the keyboard, which elevated this machine to the top of the list. It’s a chiclet board, but the well defined keys and travel make it feel almost mechanical-like. It feels fantastic during gameplay, and with slick stylings to the chassis, it’s the ultimate stealth gaming laptop.</p><h2 class="article-body__section" id="section-plenty-to-look-forward-to"><span>Plenty to look forward to</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RewkLciiWWu8fmzQZn4nUP" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/RewkLciiWWu8fmzQZn4nUP.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 RTX Spark lineup proves that the days of compromising between a sleek daily driver and a capable gaming machine are finally coming to a close. These six distinct options will hit the market soon, and while I can scrutinize them from a gaming perspective, they’re meant for so much more.</p><p>As <a href="https://www.tomsguide.com/computing/i-spoke-to-nvidia-ceo-jensen-huang-about-rtx-spark-he-is-willing-to-work-on-an-rtx-gaming-handheld-n2x-and-n3x-are-already-planned-and-the-chip-is-more-like-r2d2-than-a-laptop-cpu">CEO Jensen Huang said himself</a> when I got the chance to talk to him: “we’re focused on reinventing the PC.” There’s going to be something for everyone in this range. So I have to ask — if you’ve got the budget for one of these notebooks, which one would you spend your money on?</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/toms-guide-computing-awards-2026-22-game-changing-laptops-desktops-and-peripherals"><strong>Tom’s Guide Computing Awards 2026: 22 game-changing laptops, desktops and peripherals</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/gaming/playstation/as-a-pc-snob-i-wanted-to-catch-gta-6-making-console-compromises-instead-im-in-awe-of-the-trickery"><strong>As a PC snob, I wanted to catch GTA 6 making console compromises. Instead, I’m in awe of the trickery</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/computing/gpus/i-tested-nvidias-new-dlss-4-5-ray-reconstruction-it-finally-fixes-path-tracings-biggest-flaw-but-heres-the-reality-check"><strong>I tested NVIDIA’s new DLSS 4.5 Ray Reconstruction — it finally fixes path tracing’s biggest flaw, but here’s the reality check</strong></a><strong></strong></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 'Human Reserved’: Bill Gates says some jobs should be off-limits to AI ]]></title>
                                                                                                <dc:content><![CDATA[ <p>In a new <a href="https://www.gatesnotes.com/a-turbulent-ai-era-and-critical-choices-to-make" target="_blank">essay published Tuesday</a>, Bill Gates argues that society needs to start making some difficult decisions about artificial intelligence now, rather than waiting until the technology is capable of doing substantially more of our work.</p><p>One of his most interesting suggestions is something he calls “Human Reserved.” The idea is essentially that certain jobs or activities would remain in human hands, even if AI eventually becomes perfectly capable of doing them.</p><p>“We should designate some jobs as Human Reserved,” Gates writes.</p><p>It's an interesting concept considering much of the conversation about AI and jobs has focused on<a href="https://www.tomsguide.com/ai/bill-gates-says-only-four-jobs-are-safe-from-ai-but-here-are-7-other-predictions-hes-made-that-didnt-age-well"> what AI <em>can</em> replace</a>. Gates is asking a different question: <em>What shouldn't we allow it to replace and what should we maintain as human?</em></p><h2 id="some-jobs-may-be-worth-keeping-human">Some jobs may be worth keeping human</h2><p>In his essay, Gates compares the idea to setting aside land as a nature reserve. We don't preserve a forest because humans are incapable of building on it. We preserve it because we've decided there's value in leaving it alone.</p><p>He argues we may eventually need to make similar decisions about work.</p><p>Child care is one example Gates has raised. Even if AI and robotics eventually reach a point where machines can safely look after children, parents may still decide that caring for kids is something humans should do.</p><p>Jury service is another. Those examples make “Human Reserved” sound relatively straightforward, but the idea gets considerably more complicated when you start applying it to professions that AI is already entering.</p><p>Education and <a href="https://www.tomsguide.com/ai/ai-could-transform-healthcare-for-the-better-but-this-doctor-says-theres-one-thing-it-should-never-do">health care</a>, for example, could use AI while still keeping people at the center. A teacher might use AI to create personalized lessons or identify where a student is struggling without handing the entire classroom over to an AI tutor. A doctor could use an AI system to analyze medical information while remaining responsible for the patient's care.</p><p>In other words, reserving something for humans doesn't necessarily mean banning AI from it. It could mean deciding where AI remains a tool rather than becoming the worker.</p><h2 id="gates-doesn-39-t-think-retraining-everyone-will-be-enough">Gates doesn't think retraining everyone will be enough</h2><p>Gates' argument goes beyond the <a href="https://www.tomsguide.com/ai/half-of-ai-job-cuts-will-be-reversed-by-2027-and-it-reveals-the-biggest-mistake-companies-are-making">prediction that AI will eliminate some jobs while creating others</a>.</p><p>For years, one of the most reassuring responses to fears about automation has been that workers can simply retrain for whatever jobs come next. Gates isn't convinced that will be enough this time.</p><p>If AI systems and robots eventually become capable of performing an enormous range of physical and cognitive work, there may not always be another economically necessary human job waiting on the other side of retraining.</p><p>That's a much bigger problem than learning how to use ChatGPT to do your job better. As Gates argues, governments may eventually need to intervene in other ways, including potentially taxing AI tokens or robots. The idea would be to change some of the economic incentives around replacing workers while generating money that could help people affected by automation.</p><p>Those proposals are a long way from becoming policy, and Gates isn't presenting “Human Reserved” as a fully formed regulatory framework.</p><h2 id="the-takeaway">The takeaway</h2><p>AI capability shouldn't be the only test of where the future of work is headed. We've become accustomed to judging AI by capability such as <a href="https://www.tomsguide.com/ai/im-a-published-author-and-i-tested-claude-3-7-sonnet-vs-grok-3-at-creative-writing-heres-my-verdict">can it write this?</a> or<a href="https://www.tomsguide.com/ai/chatgpt-congratulated-me-for-being-pregnant-it-was-dead-wrong"> can it diagnose that?</a> And while every improvement gives us another demonstration of something AI can now do, the capability doesn't automatically answer whether we <em>want</em> AI doing it.</p><p>That's what makes Gates' “Human Reserved” idea interesting to me. It introduces a second test. We need to start asking do we want AI to do this for us? Frankly,  believe those two questions have very different answers. </p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/perplexitys-new-local-first-ai-runs-on-your-pc-and-asks-before-using-the-cloud"><strong>Perplexity’s new local-first AI runs on your PC — and asks before using the cloud</strong></a></li><li><a href="https://www.tomsguide.com/ai/chatgpt/chatgpt-can-learn-your-repetitive-tasks-by-watching-you-here-are-7-prompts-to-try"><strong>ChatGPT can learn your repetitive tasks by watching you — here are 7 prompts to try</strong></a></li><li><a href="https://www.tomsguide.com/ai/chatgpt/the-best-way-to-use-chatgpt-for-writing-isnt-writing-7-prompts-i-use-to-make-it-my-creative-partner"><strong>The best way to use ChatGPT for writing isn't writing — 7 prompts I use to make it my creative partner</strong></a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/ai/human-reserved-bill-gates-says-some-jobs-should-be-off-limits-to-ai</link>
                                                                            <description>
                            <![CDATA[ Bill Gates says some jobs should be “Human Reserved” as AI advances. Here’s what he means and why he thinks we need to decide now. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">C5U5MBkLKETa82WGPsdB2H</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/MeoxtgfY72wiRFYxXTrryZ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 26 Aug 2026 17:49:51 +0000</pubDate>                                                                                                                                <updated>Wed, 26 Aug 2026 18:16:18 +0000</updated>
                                                                                                                                            <category><![CDATA[AI]]></category>
                                                                                                <author><![CDATA[ amanda.caswell@futurenet.com (Amanda Caswell) ]]></author>                    <dc:creator><![CDATA[ Amanda Caswell ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/zYjevim2q7FjQiefqpjZRB.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/MeoxtgfY72wiRFYxXTrryZ-1280-80.jpg">
                                                            <media:credit><![CDATA[Mike Cohen/Getty Images for The New York Times]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Bill Gates in 2019]]></media:description>                                                            <media:text><![CDATA[Bill Gates in 2019]]></media:text>
                                <media:title type="plain"><![CDATA[Bill Gates in 2019]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/MeoxtgfY72wiRFYxXTrryZ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>In a new <a href="https://www.gatesnotes.com/a-turbulent-ai-era-and-critical-choices-to-make" target="_blank">essay published Tuesday</a>, Bill Gates argues that society needs to start making some difficult decisions about artificial intelligence now, rather than waiting until the technology is capable of doing substantially more of our work.</p><p>One of his most interesting suggestions is something he calls “Human Reserved.” The idea is essentially that certain jobs or activities would remain in human hands, even if AI eventually becomes perfectly capable of doing them.</p><p>“We should designate some jobs as Human Reserved,” Gates writes.</p><p>It's an interesting concept considering much of the conversation about AI and jobs has focused on<a href="https://www.tomsguide.com/ai/bill-gates-says-only-four-jobs-are-safe-from-ai-but-here-are-7-other-predictions-hes-made-that-didnt-age-well"> what AI <em>can</em> replace</a>. Gates is asking a different question: <em>What shouldn't we allow it to replace and what should we maintain as human?</em></p><h2 id="some-jobs-may-be-worth-keeping-human">Some jobs may be worth keeping human</h2><p>In his essay, Gates compares the idea to setting aside land as a nature reserve. We don't preserve a forest because humans are incapable of building on it. We preserve it because we've decided there's value in leaving it alone.</p><p>He argues we may eventually need to make similar decisions about work.</p><p>Child care is one example Gates has raised. Even if AI and robotics eventually reach a point where machines can safely look after children, parents may still decide that caring for kids is something humans should do.</p><p>Jury service is another. Those examples make “Human Reserved” sound relatively straightforward, but the idea gets considerably more complicated when you start applying it to professions that AI is already entering.</p><p>Education and <a href="https://www.tomsguide.com/ai/ai-could-transform-healthcare-for-the-better-but-this-doctor-says-theres-one-thing-it-should-never-do">health care</a>, for example, could use AI while still keeping people at the center. A teacher might use AI to create personalized lessons or identify where a student is struggling without handing the entire classroom over to an AI tutor. A doctor could use an AI system to analyze medical information while remaining responsible for the patient's care.</p><p>In other words, reserving something for humans doesn't necessarily mean banning AI from it. It could mean deciding where AI remains a tool rather than becoming the worker.</p><h2 id="gates-doesn-39-t-think-retraining-everyone-will-be-enough">Gates doesn't think retraining everyone will be enough</h2><p>Gates' argument goes beyond the <a href="https://www.tomsguide.com/ai/half-of-ai-job-cuts-will-be-reversed-by-2027-and-it-reveals-the-biggest-mistake-companies-are-making">prediction that AI will eliminate some jobs while creating others</a>.</p><p>For years, one of the most reassuring responses to fears about automation has been that workers can simply retrain for whatever jobs come next. Gates isn't convinced that will be enough this time.</p><p>If AI systems and robots eventually become capable of performing an enormous range of physical and cognitive work, there may not always be another economically necessary human job waiting on the other side of retraining.</p><p>That's a much bigger problem than learning how to use ChatGPT to do your job better. As Gates argues, governments may eventually need to intervene in other ways, including potentially taxing AI tokens or robots. The idea would be to change some of the economic incentives around replacing workers while generating money that could help people affected by automation.</p><p>Those proposals are a long way from becoming policy, and Gates isn't presenting “Human Reserved” as a fully formed regulatory framework.</p><h2 id="the-takeaway">The takeaway</h2><p>AI capability shouldn't be the only test of where the future of work is headed. We've become accustomed to judging AI by capability such as <a href="https://www.tomsguide.com/ai/im-a-published-author-and-i-tested-claude-3-7-sonnet-vs-grok-3-at-creative-writing-heres-my-verdict">can it write this?</a> or<a href="https://www.tomsguide.com/ai/chatgpt-congratulated-me-for-being-pregnant-it-was-dead-wrong"> can it diagnose that?</a> And while every improvement gives us another demonstration of something AI can now do, the capability doesn't automatically answer whether we <em>want</em> AI doing it.</p><p>That's what makes Gates' “Human Reserved” idea interesting to me. It introduces a second test. We need to start asking do we want AI to do this for us? Frankly,  believe those two questions have very different answers. </p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/perplexitys-new-local-first-ai-runs-on-your-pc-and-asks-before-using-the-cloud"><strong>Perplexity’s new local-first AI runs on your PC — and asks before using the cloud</strong></a></li><li><a href="https://www.tomsguide.com/ai/chatgpt/chatgpt-can-learn-your-repetitive-tasks-by-watching-you-here-are-7-prompts-to-try"><strong>ChatGPT can learn your repetitive tasks by watching you — here are 7 prompts to try</strong></a></li><li><a href="https://www.tomsguide.com/ai/chatgpt/the-best-way-to-use-chatgpt-for-writing-isnt-writing-7-prompts-i-use-to-make-it-my-creative-partner"><strong>The best way to use ChatGPT for writing isn't writing — 7 prompts I use to make it my creative partner</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ New Windows zero-day flaw could give hackers deep access to your PC — how to stay safe ]]></title>
                                                                                                <dc:content><![CDATA[ <p>This week two different <a href="https://www.tomsguide.com/computing/online-security/over-1-billion-windows-users-at-risk-after-disgruntled-security-researcher-leaks-defender-zero-days">Windows vulnerabilities</a> were revealed that attack your PC from different angles. However, there is one unfortunate thread that connects them; both are capable of allowing a malicious actor to gain system privileges on your Windows device, and neither has been patched yet.</p><p>The flaws are a <a href="https://www.tomsguide.com/computing/online-security/do-you-use-microsoft-exchange-hackers-are-actively-exploiting-a-new-zero-day-flaw">zero-day vulnerability</a> that can circumnavigate a previous RoguePlanet and a new "Plug and Pwn" attack that emulates USB devices.</p><p>Read on to find out what each attack can do and how to potentially stay safe until they get patched. </p><h2 id="shieldbreak-zero-day">Shieldbreak Zero-Day</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JU27PbrhCr9X35AbQFzAdR" name="virtual vpn" alt="Hands typing on a laptop with a digital shield and lock icon, symbolizing cybersecurity. Surrounded by binary code and glowing elements." src="https://cdn.mos.cms.futurecdn.net/JU27PbrhCr9X35AbQFzAdR.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: TU IS (via Getty Images))</span></figcaption></figure><p>The zero-day vulnerability was found by Nightmare Eclipse, a bug hunter who reportedly has major beef with Microsoft and no qualms sharing the latest vulnerabilities they've discovered before a patch has released.</p><p>The latest, dubbed <a href="https://github.com/MSNightmare/ShieldBreak" target="_blank">ShieldBreak</a>, can apparently get around the RoguePlanet patch and allows attackers to gain system privileges on patched Windows 10, Windows 11 and Windows Server system.</p><p>Per <a href="https://www.theregister.com/cyber-crime/2026/08/12/microsoft-vendetta-hacker-has-a-new-zero-day-that-gives-system-privileges-on-fully-patched-windows/5286889" target="_blank">The Register</a>, the exploit has been tested by other security researchers and confirmed.</p><p>ShieldBreak apparently uses a "user-mode callback hook" to change file contents during a Defender cloud-hydration scan via cfapi (Cloud Filter API)," according to security researcher <a href="https://cyberplace.social/@GossiTheDog/117082629057300721" target="_blank">Kevin Beaumont</a>.</p><p>Basically, it uses <a href="https://www.tomsguide.com/computing/antivirus/microsoft-defender-review">Microsoft Defender</a>, if enabled, when it runs a scan. Then the flaw can be exploited to gain System privileges. Another researcher, <a href="https://infosec.exchange/@wdormann/117079587486018149" target="_blank">Will Dormann</a>, says that Defender has to be active for the exploit to work.</p><h2 id="how-to-stay-safe-from-shieldbreak">How to stay safe from Shieldbreak</h2><p>Until Microsoft patches this vulnerability, one way to stay safe is to disable Microsoft Defender. </p><p>If you think your system might be vulnerable, Kevin Beaumont did <a href="https://cyberplace.social/@GossiTheDog/117082629057300721" target="_blank">publish three detections </a>that are supposed to be able to catch Shieldbreak in action. If you have the knowledge, you could try running them.</p><h2 id="plug-and-pwn">Plug and Pwn</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jDguSN4dyAxkcNZQD5iamP" name="USB-A.jpg" alt="USB-A" src="https://cdn.mos.cms.futurecdn.net/jDguSN4dyAxkcNZQD5iamP.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>The other flaw is a new "plug and pwn" disclosed by security researchers <a href="https://x.com/0xedh" target="_blank">Alejandro Hernando</a> and <a href="https://x.com/Qm9yamFN" target="_blank">Borja Martinez </a>(via <a href="https://www.bleepingcomputer.com/news/security/plug-and-pwn-attack-uses-fake-usb-devices-for-windows-system-access/" target="_blank">Bleeping Computer</a>) during the recent DEF CON 34 hacking conference. This vulnerability exploits how Windows identifies and automatically connects USB hardware, finds matching driver packages and then installs software as the Authority/System account.</p><p>Simply, the flaw emulates USB devices and can be used to force Windows to install vendor packages with exploitable components that can be used to gain system privileges on a Windows device.</p><p>Apparently, in some attacks, they didn't even require user interaction or physical USB hardware to gain access. This is enabled because Windows uses something called a co-installer, which automatically downloads and installs software and drivers when a new USB device is inserted in the computer.</p><p>This specific version is different from previous ones because it follows the Windows installation path and not something from a specific vendor. Notably, the remote attacks only seem to work on systems where USB redirection is enabled, which Alejandro Hernando said is common with virtual desktop environments.</p><p>Bleeping Computer gets far more granular if you're interested in how Hernando and Martinez discovered the flaw and the tools they used to instigate it.</p><h2 id="how-to-stay-safe-from-this-usb-attack">How to stay safe from this USB attack</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="CSFXsX24TGg5qRaKfGEjC6" name="USB-A vs USB-C.jpg" alt="USB-A vs USB-C" src="https://cdn.mos.cms.futurecdn.net/CSFXsX24TGg5qRaKfGEjC6.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>If you are concerned about this kind of attack and willing, you could enable a 'DisableCoInstallers' registry value. This prevents driver packages from utilizing co-installers during device installtion. </p><p>You can do this by searching for it in the Start menu or using the keyboard short cut of the Windows key +R. Then navigate to HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Device Installer Registry key. Then add DWORD-32 value named DisableCoInstallers and set it to 1.</p><p>It doesn't totally eliminate plug and pwn attacks, but it could break some of them.</p><p>"In anything sensitive I'd pair it with device installation restrictions or hardware-ID allow-lists, and turn off PnP device redirection on RDP and VDI hosts that don't need it (`fDisablePNPRedir`)," Hernando told BleepingComputer.</p><p>It's a good reminder either way to make sure you're only plugging in trusted devices to your system or downloading software from official sources when you can to ensure the safety of what you're putting into your computer.</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/windows-operating-systems/windows-11-is-broken-and-microsoft-is-fixing-the-wrong-things#viafoura-comments"><strong>Windows 11 is broken — and Microsoft is fixing the wrong things</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/computing/browsers/microsoft-is-still-using-deceptive-tactics-and-design-to-force-you-to-use-edge"><strong>Microsoft is still using ‘deceptive tactics and design’ to force you to use Edge</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-extends-windows-10-support-for-another-year-what-you-need-to-know"><strong>Microsoft extends Windows 10 support for another year: what you need to know</strong></a><strong></strong></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/online-security/new-windows-zero-day-flaw-could-give-hackers-deep-access-to-your-pc-how-to-stay-safe</link>
                                                                            <description>
                            <![CDATA[ Two different Windows flaws popped up this week. What connects them is that both could give bad actors system privileges. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">pn79hVmH7mpAKpDpKoxV3Z</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/pjRoZBt6XiSUTK6dUoB8Jh-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 13 Aug 2026 01:09:52 +0000</pubDate>                                                                                                                                <updated>Thu, 13 Aug 2026 16:02:19 +0000</updated>
                                                                                                                                            <category><![CDATA[Online Security]]></category>
                                                    <category><![CDATA[Windows Operating Systems]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Internet]]></category>
                                                    <category><![CDATA[Software]]></category>
                                                    <category><![CDATA[Operating Systems]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;br&gt;Send secure tips on Signal: scyo1.55.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/pjRoZBt6XiSUTK6dUoB8Jh-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock / Edited by Gemini]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A Windows 11 laptop displaying a large warning sign]]></media:description>                                                            <media:text><![CDATA[A Windows 11 laptop displaying a large warning sign]]></media:text>
                                <media:title type="plain"><![CDATA[A Windows 11 laptop displaying a large warning sign]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/pjRoZBt6XiSUTK6dUoB8Jh-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>This week two different <a href="https://www.tomsguide.com/computing/online-security/over-1-billion-windows-users-at-risk-after-disgruntled-security-researcher-leaks-defender-zero-days">Windows vulnerabilities</a> were revealed that attack your PC from different angles. However, there is one unfortunate thread that connects them; both are capable of allowing a malicious actor to gain system privileges on your Windows device, and neither has been patched yet.</p><p>The flaws are a <a href="https://www.tomsguide.com/computing/online-security/do-you-use-microsoft-exchange-hackers-are-actively-exploiting-a-new-zero-day-flaw">zero-day vulnerability</a> that can circumnavigate a previous RoguePlanet and a new "Plug and Pwn" attack that emulates USB devices.</p><p>Read on to find out what each attack can do and how to potentially stay safe until they get patched. </p><h2 id="shieldbreak-zero-day">Shieldbreak Zero-Day</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JU27PbrhCr9X35AbQFzAdR" name="virtual vpn" alt="Hands typing on a laptop with a digital shield and lock icon, symbolizing cybersecurity. Surrounded by binary code and glowing elements." src="https://cdn.mos.cms.futurecdn.net/JU27PbrhCr9X35AbQFzAdR.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: TU IS (via Getty Images))</span></figcaption></figure><p>The zero-day vulnerability was found by Nightmare Eclipse, a bug hunter who reportedly has major beef with Microsoft and no qualms sharing the latest vulnerabilities they've discovered before a patch has released.</p><p>The latest, dubbed <a href="https://github.com/MSNightmare/ShieldBreak" target="_blank">ShieldBreak</a>, can apparently get around the RoguePlanet patch and allows attackers to gain system privileges on patched Windows 10, Windows 11 and Windows Server system.</p><p>Per <a href="https://www.theregister.com/cyber-crime/2026/08/12/microsoft-vendetta-hacker-has-a-new-zero-day-that-gives-system-privileges-on-fully-patched-windows/5286889" target="_blank">The Register</a>, the exploit has been tested by other security researchers and confirmed.</p><p>ShieldBreak apparently uses a "user-mode callback hook" to change file contents during a Defender cloud-hydration scan via cfapi (Cloud Filter API)," according to security researcher <a href="https://cyberplace.social/@GossiTheDog/117082629057300721" target="_blank">Kevin Beaumont</a>.</p><p>Basically, it uses <a href="https://www.tomsguide.com/computing/antivirus/microsoft-defender-review">Microsoft Defender</a>, if enabled, when it runs a scan. Then the flaw can be exploited to gain System privileges. Another researcher, <a href="https://infosec.exchange/@wdormann/117079587486018149" target="_blank">Will Dormann</a>, says that Defender has to be active for the exploit to work.</p><h2 id="how-to-stay-safe-from-shieldbreak">How to stay safe from Shieldbreak</h2><p>Until Microsoft patches this vulnerability, one way to stay safe is to disable Microsoft Defender. </p><p>If you think your system might be vulnerable, Kevin Beaumont did <a href="https://cyberplace.social/@GossiTheDog/117082629057300721" target="_blank">publish three detections </a>that are supposed to be able to catch Shieldbreak in action. If you have the knowledge, you could try running them.</p><h2 id="plug-and-pwn">Plug and Pwn</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jDguSN4dyAxkcNZQD5iamP" name="USB-A.jpg" alt="USB-A" src="https://cdn.mos.cms.futurecdn.net/jDguSN4dyAxkcNZQD5iamP.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>The other flaw is a new "plug and pwn" disclosed by security researchers <a href="https://x.com/0xedh" target="_blank">Alejandro Hernando</a> and <a href="https://x.com/Qm9yamFN" target="_blank">Borja Martinez </a>(via <a href="https://www.bleepingcomputer.com/news/security/plug-and-pwn-attack-uses-fake-usb-devices-for-windows-system-access/" target="_blank">Bleeping Computer</a>) during the recent DEF CON 34 hacking conference. This vulnerability exploits how Windows identifies and automatically connects USB hardware, finds matching driver packages and then installs software as the Authority/System account.</p><p>Simply, the flaw emulates USB devices and can be used to force Windows to install vendor packages with exploitable components that can be used to gain system privileges on a Windows device.</p><p>Apparently, in some attacks, they didn't even require user interaction or physical USB hardware to gain access. This is enabled because Windows uses something called a co-installer, which automatically downloads and installs software and drivers when a new USB device is inserted in the computer.</p><p>This specific version is different from previous ones because it follows the Windows installation path and not something from a specific vendor. Notably, the remote attacks only seem to work on systems where USB redirection is enabled, which Alejandro Hernando said is common with virtual desktop environments.</p><p>Bleeping Computer gets far more granular if you're interested in how Hernando and Martinez discovered the flaw and the tools they used to instigate it.</p><h2 id="how-to-stay-safe-from-this-usb-attack">How to stay safe from this USB attack</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="CSFXsX24TGg5qRaKfGEjC6" name="USB-A vs USB-C.jpg" alt="USB-A vs USB-C" src="https://cdn.mos.cms.futurecdn.net/CSFXsX24TGg5qRaKfGEjC6.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>If you are concerned about this kind of attack and willing, you could enable a 'DisableCoInstallers' registry value. This prevents driver packages from utilizing co-installers during device installtion. </p><p>You can do this by searching for it in the Start menu or using the keyboard short cut of the Windows key +R. Then navigate to HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Device Installer Registry key. Then add DWORD-32 value named DisableCoInstallers and set it to 1.</p><p>It doesn't totally eliminate plug and pwn attacks, but it could break some of them.</p><p>"In anything sensitive I'd pair it with device installation restrictions or hardware-ID allow-lists, and turn off PnP device redirection on RDP and VDI hosts that don't need it (`fDisablePNPRedir`)," Hernando told BleepingComputer.</p><p>It's a good reminder either way to make sure you're only plugging in trusted devices to your system or downloading software from official sources when you can to ensure the safety of what you're putting into your computer.</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/windows-operating-systems/windows-11-is-broken-and-microsoft-is-fixing-the-wrong-things#viafoura-comments"><strong>Windows 11 is broken — and Microsoft is fixing the wrong things</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/computing/browsers/microsoft-is-still-using-deceptive-tactics-and-design-to-force-you-to-use-edge"><strong>Microsoft is still using ‘deceptive tactics and design’ to force you to use Edge</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-extends-windows-10-support-for-another-year-what-you-need-to-know"><strong>Microsoft extends Windows 10 support for another year: what you need to know</strong></a><strong></strong></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Windows 11 is broken — and Microsoft is fixing the wrong things ]]></title>
                                                                                                <dc:content><![CDATA[ <p>It’s a little sad being a fan of tech these days. AI is consuming the world’s art and emotion and spitting out slop, and it’s driving up the price of just about every piece of consumer electronics as it does.</p><p>If you don’t need to upgrade your computer anytime soon, then you’re in a good spot - except <a href="https://www.tomsguide.com/reviews/windows-11">Windows 11</a> is doing its damnedest to be a mess of Copilot and bugs. While Microsoft is moving to improve things (with Windows head honcho Pavan Davuluri <a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-promises-windows-11-reset-new-focus-on-performance-reliability-and-reducing-unnecessary-copilot-ai">promising big changes back in March</a>), it feels as though we might be better off nuking the whole thing from orbit.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OLq4ZX"></div>                            </div>                            <script src="https://kwizly.com/embed/OLq4ZX.js" async></script><h2 id="a-bloated-mess">A bloated mess</h2><p><a href="https://blogs.windows.com/windows-insider/2026/07/31/windows-quality-an-update-on-the-commitment-we-made-in-march/" target="_blank">In an update published last week</a>, Davuluri shared a number of changes the team had made in the months since committing to improving Windows 11.</p><p>It’s well worth a read, but what strikes me are the elements that feel so foundational to Windows. Windows 11 is almost 5 years old, and yet the team is now working on a “faster and more dependable File Explorer” and allowing “more taskbar customization”.</p><p>In many ways, these feel like table stakes. These are things that should have been hammered home a long time ago, and it shows how disconnected from its consumers’ reality Microsoft is at this point. People have been using Windows 11 and calling for a smaller memory footprint for 8GB machines, and now Microsoft is finally on board.</p><p>The Copilot-addled, bloated mess that Windows 11 has become can no longer be considered the price to pay for a more modular, customizable OS than its Apple or Linux contemporaries.</p><p>My <a href="https://www.tomsguide.com/computing/macbooks/macbook-air-13-inch-m3-review">MacBook Air M3</a> is the device I reach for to do work, despite having a beefy gaming rig with more RAM than I know what to do with. It’s perhaps unsurprising that Microsoft can’t seem to pick a lane.</p><p>The company is all about AI now, but not long ago it was being able to run Android apps on Windows, before that it was mixed reality and before that it was Cortana.</p><div><blockquote><p>The company keeps chasing trends while ignoring what many customers want</p></blockquote></div><p>The company keeps chasing trends while ignoring what many customers want: A steady, stable, secure OS.</p><p>Recent updates have helped fix those cracked foundations, but I fear Windows 11 might be too far gone, even with the upcoming option to uninstall AI models from Copilot+ PCs, the app toggles, and more.</p><h2 id="i-don-t-know-if-it-can-rebuild">I don't know if it can rebuild</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hDNix4fYdmJGsVB26D4tkN" name="windows 11.shutterstock_2000666507" alt="A laptop with the Windows 11 logo" src="https://cdn.mos.cms.futurecdn.net/hDNix4fYdmJGsVB26D4tkN.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Back in 2024, <a href="https://www.tomshardware.com/software/windows/ex-windows-developer-calls-windows-11-start-menu-performance-comically-bad-even-with-a-core-i9-and-128gb-of-ram" target="_blank">former Windows developer Andy Young</a> showcased how even with 128GB of RAM, Microsoft’s Search Bar was a laggy mess and causing major issues when just trying to find something.</p><p>In the months that followed, Microsoft fixed it, but it took one of their own to put them on blast to achieve it. It’s almost as if the staff there aren’t using Windows 11 day-to-day; seeing adverts, the constant Copilot interjections, and more.</p><p>That makes me think that it’s run its race, and that the company is moving to Windows 12 (or at least thinking about it), almost certainly with a sizeable AI component.</p><div><blockquote><p>Do you agree? Or are you happy with Windows 11? Drop a message in the comments with your thoughts.</p></blockquote></div><p>One only has to look across the platform divide to see that Apple has taken its own kickings in recent years. Customers became so used to the thoughtful updates to macOS that something like the borders of windows not lining up was seen as a huge issue as part of the <a href="https://www.tomsguide.com/computing/online-security/even-if-you-hate-liquid-glass-you-shouldnt-skip-updating-to-ios-26-for-the-sake-of-your-iphone">Liquid Glass rollout last year</a>.</p><p>Windows 11’s modularity has always been one of its strengths: It’s a gaming platform, it’s a workspace, it’s somewhere you can install something for everything and get what you need done. But in recent years, it’s lost its way big time, and I feel like Microsoft simply doesn’t know how to turn this massive ship around without rebuilding it all from scratch.</p><p>But hey, those are just my thoughts. Do you agree with me? Or are you happy with the way Windows 11 is running for you? Drop me a message in the comments with your thoughts.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/i-asked-chatgpt-for-the-best-ways-to-reduce-stress-these-7-simple-techniques-helped-me-feel-like-myself-again">I asked ChatGPT for the best ways to reduce stress — these 7 simple techniques helped me feel like myself again</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra">I tested the Samsung Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra for 2 weeks — here’s the one I’d buy</a></li><li><a href="https://www.tomsguide.com/ai/google-maps-just-got-a-major-ai-upgrade-these-7-ask-maps-prompts-let-you-order-food-find-events-and-more">Google Maps just got a major AI upgrade — these 7 Ask Maps prompts let you order food, find events and more</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/windows-operating-systems/windows-11-is-broken-and-microsoft-is-fixing-the-wrong-things</link>
                                                                            <description>
                            <![CDATA[ Microsoft has been rolling out updates and corrections to Windows 11 but perhaps the operating system is past saving? ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">vW7qXXckYSx3XgkuFXudmS</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/efn9hKA2gxWvbcovTTtjwZ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 10 Aug 2026 07:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Windows Operating Systems]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Software]]></category>
                                                    <category><![CDATA[Operating Systems]]></category>
                                                                                                                    <dc:creator><![CDATA[ Lloyd Coombes ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xcWocVTwa9yiwXRs559XNA.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Lloyd Coombes is a freelance tech and fitness writer. He&#039;s an expert in all things Apple as well as in computer and gaming tech, with previous works published on TechRadar, Tom&#039;s Guide, Live Science and more. You&#039;ll find him regularly testing the latest MacBook or iPhone, but he spends most of his time writing about video games as Gaming Editor for the Daily Star. He also covers board games and virtual reality, just to round out the nerdy pursuits.&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/efn9hKA2gxWvbcovTTtjwZ-1280-80.jpg">
                                                            <media:credit><![CDATA[Generated using Google Gemini]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A greyscale laptop showing a Windows 11 screen with a red cross on it]]></media:description>                                                            <media:text><![CDATA[A greyscale laptop showing a Windows 11 screen with a red cross on it]]></media:text>
                                <media:title type="plain"><![CDATA[A greyscale laptop showing a Windows 11 screen with a red cross on it]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/efn9hKA2gxWvbcovTTtjwZ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>It’s a little sad being a fan of tech these days. AI is consuming the world’s art and emotion and spitting out slop, and it’s driving up the price of just about every piece of consumer electronics as it does.</p><p>If you don’t need to upgrade your computer anytime soon, then you’re in a good spot - except <a href="https://www.tomsguide.com/reviews/windows-11">Windows 11</a> is doing its damnedest to be a mess of Copilot and bugs. While Microsoft is moving to improve things (with Windows head honcho Pavan Davuluri <a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-promises-windows-11-reset-new-focus-on-performance-reliability-and-reducing-unnecessary-copilot-ai">promising big changes back in March</a>), it feels as though we might be better off nuking the whole thing from orbit.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OLq4ZX"></div>                            </div>                            <script src="https://kwizly.com/embed/OLq4ZX.js" async></script><h2 id="a-bloated-mess">A bloated mess</h2><p><a href="https://blogs.windows.com/windows-insider/2026/07/31/windows-quality-an-update-on-the-commitment-we-made-in-march/" target="_blank">In an update published last week</a>, Davuluri shared a number of changes the team had made in the months since committing to improving Windows 11.</p><p>It’s well worth a read, but what strikes me are the elements that feel so foundational to Windows. Windows 11 is almost 5 years old, and yet the team is now working on a “faster and more dependable File Explorer” and allowing “more taskbar customization”.</p><p>In many ways, these feel like table stakes. These are things that should have been hammered home a long time ago, and it shows how disconnected from its consumers’ reality Microsoft is at this point. People have been using Windows 11 and calling for a smaller memory footprint for 8GB machines, and now Microsoft is finally on board.</p><p>The Copilot-addled, bloated mess that Windows 11 has become can no longer be considered the price to pay for a more modular, customizable OS than its Apple or Linux contemporaries.</p><p>My <a href="https://www.tomsguide.com/computing/macbooks/macbook-air-13-inch-m3-review">MacBook Air M3</a> is the device I reach for to do work, despite having a beefy gaming rig with more RAM than I know what to do with. It’s perhaps unsurprising that Microsoft can’t seem to pick a lane.</p><p>The company is all about AI now, but not long ago it was being able to run Android apps on Windows, before that it was mixed reality and before that it was Cortana.</p><div><blockquote><p>The company keeps chasing trends while ignoring what many customers want</p></blockquote></div><p>The company keeps chasing trends while ignoring what many customers want: A steady, stable, secure OS.</p><p>Recent updates have helped fix those cracked foundations, but I fear Windows 11 might be too far gone, even with the upcoming option to uninstall AI models from Copilot+ PCs, the app toggles, and more.</p><h2 id="i-don-t-know-if-it-can-rebuild">I don't know if it can rebuild</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hDNix4fYdmJGsVB26D4tkN" name="windows 11.shutterstock_2000666507" alt="A laptop with the Windows 11 logo" src="https://cdn.mos.cms.futurecdn.net/hDNix4fYdmJGsVB26D4tkN.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Back in 2024, <a href="https://www.tomshardware.com/software/windows/ex-windows-developer-calls-windows-11-start-menu-performance-comically-bad-even-with-a-core-i9-and-128gb-of-ram" target="_blank">former Windows developer Andy Young</a> showcased how even with 128GB of RAM, Microsoft’s Search Bar was a laggy mess and causing major issues when just trying to find something.</p><p>In the months that followed, Microsoft fixed it, but it took one of their own to put them on blast to achieve it. It’s almost as if the staff there aren’t using Windows 11 day-to-day; seeing adverts, the constant Copilot interjections, and more.</p><p>That makes me think that it’s run its race, and that the company is moving to Windows 12 (or at least thinking about it), almost certainly with a sizeable AI component.</p><div><blockquote><p>Do you agree? Or are you happy with Windows 11? Drop a message in the comments with your thoughts.</p></blockquote></div><p>One only has to look across the platform divide to see that Apple has taken its own kickings in recent years. Customers became so used to the thoughtful updates to macOS that something like the borders of windows not lining up was seen as a huge issue as part of the <a href="https://www.tomsguide.com/computing/online-security/even-if-you-hate-liquid-glass-you-shouldnt-skip-updating-to-ios-26-for-the-sake-of-your-iphone">Liquid Glass rollout last year</a>.</p><p>Windows 11’s modularity has always been one of its strengths: It’s a gaming platform, it’s a workspace, it’s somewhere you can install something for everything and get what you need done. But in recent years, it’s lost its way big time, and I feel like Microsoft simply doesn’t know how to turn this massive ship around without rebuilding it all from scratch.</p><p>But hey, those are just my thoughts. Do you agree with me? Or are you happy with the way Windows 11 is running for you? Drop me a message in the comments with your thoughts.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/i-asked-chatgpt-for-the-best-ways-to-reduce-stress-these-7-simple-techniques-helped-me-feel-like-myself-again">I asked ChatGPT for the best ways to reduce stress — these 7 simple techniques helped me feel like myself again</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra">I tested the Samsung Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra for 2 weeks — here’s the one I’d buy</a></li><li><a href="https://www.tomsguide.com/ai/google-maps-just-got-a-major-ai-upgrade-these-7-ask-maps-prompts-let-you-order-food-find-events-and-more">Google Maps just got a major AI upgrade — these 7 Ask Maps prompts let you order food, find events and more</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Microsoft is still using ‘deceptive tactics and design’ to force you to use Edge ]]></title>
                                                                                                <dc:content><![CDATA[ <p>You already know about Microsoft’s desperate ploys to get you to use Edge on Windows 11 — chances are you’re one of the folks who have gone through the test of patience to install <a href="https://www.tomsguide.com/tag/firefox">Firefox</a> or <a href="https://www.tomsguide.com/tag/chrome">Google Chrome</a>.</p><p>Well, new <a href="https://research.mozilla.org/browser-competition/over-the-edge-2/" target="_blank">research by Mozilla</a> reveals that the Redmond crew are not only still up to their old tricks, but getting worse. All kinds of “harmful design” shenanigans are at play here, in order to “not allow people to download and install an alternative browser, to set it as their default, or to continue using it as their default, without harmful interference.”</p><p>If only we could only get the same treatment as <a href="https://www.tomsguide.com/computing/windows-operating-systems/finally-microsoft-will-stop-begging-you-to-make-edge-your-default-browser-but-not-for-everyone">Windows users get in the EU</a>...</p><h2 id="staying-desperate">Staying desperate</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1351px;"><p class="vanilla-image-block" style="padding-top:79.94%;"><img id="phisb8hSyHA5EzrRHf8eAN" name="Microsoft Edge" alt="Microsoft Edge" src="https://cdn.mos.cms.futurecdn.net/phisb8hSyHA5EzrRHf8eAN.jpg" mos="" align="middle" fullscreen="1" width="1351" height="1080" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/phisb8hSyHA5EzrRHf8eAN.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: Mozilla)</span></figcaption></figure><p>So what did the research find? Well, Mozilla discovered that a lot of the shady tricks Microsoft was called out for in the past are still happening:</p><ul><li><strong>Visual interference: </strong>Searching for different browsers to download in Edge still brings up the “All you need is right here” banner, as well as a banner promoting the browser when you go to Chrome’s download page.</li><li><strong>Default browser selection trickery: </strong>There is a button at the top of the default apps screen to change to a different browser, but not every file type is switched over.</li><li><strong>Trick wording: </strong>Things like “Use Microsoft’s recommended browser settings,” “You’re almost done setting up your PC” and more still persist.</li><li><strong>Dark patterns: </strong>In the setup screens you normally see a few days later, Edge-preferential options are shown as big blue buttons, whereas keeping the same settings is usually smaller, greyed-out text.</li></ul><p>And that’s just a few of the many different harmful patterns Mozilla found — including Copilot opening links in Edge instead of your default browser, pre-selecting checkboxes to sync data to Edge, and resetting it as the default browser when you migrate from Windows 10 to 11.</p><h2 id="just-make-a-better-browser">Just make a better browser</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Tc9zNbWDujp6HyxnFHUWqG" name="Edge_wants_you_to_stay.jpg" alt="Microsoft Edge wants you to stay as a user" src="https://cdn.mos.cms.futurecdn.net/Tc9zNbWDujp6HyxnFHUWqG.jpg" mos="" align="middle" fullscreen="" width="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 / Microsoft)</span></figcaption></figure><p>It screams “inferiority complex” if I’m being real, which is a shame because Edge is indeed a good browser. It runs on the same Chromium engine as Chrome (to support all the same extensions), but also has some efficiencies built into it to not drain the battery as badly.</p><p>But this aggressive lock-in, some high RAM resource usage in the background and the clutter of Copilot and MSN news does make it falter. It’s not like Microsoft doesn't have a history of doing this — they were taken to court over an antitrust lawsuit in 1998 for bundling Internet Explorer with Windows and making it difficult to install a competing browser.</p><p>The only difference now is that users are committed enough to jump through those hoops to get to their favorite browsers. I mean “Google Chrome” is one of the most searched terms on Bing after all!</p><p>If you want to compete, build something better. Don’t go about it this way.</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/hardware/sk-hynix-warns-2027-will-be-worst-year-for-ram-prices-right-as-a-damning-report-reveals-something-that-will-add-fuel-to-the-price-fixing-lawsuit">SK Hynix warns 2027 will be 'worst year' for RAM prices — right as a damning report reveals something that will add fuel to the price-fixing lawsuit</a></li><li><a href="https://www.tomsguide.com/computing/routers/router-overheating-the-simple-mistakes-killing-your-wi-fi-this-summer-according-to-a-networking-expert">Router overheating? The simple mistakes killing your Wi-Fi this summer — according to a networking expert</a></li><li><a href="https://www.tomsguide.com/computing/malware-adware/dangerous-new-crashstealer-mac-malware-bypasses-apples-gatekeeper-to-steal-your-passwords-and-more">Dangerous new CrashStealer Mac impersonates Apple's own tools — and bypasses Gatekeeper — to steal your passwords and more</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/browsers/microsoft-is-still-using-deceptive-tactics-and-design-to-force-you-to-use-edge</link>
                                                                            <description>
                            <![CDATA[ Mozilla’s new "Over The Edge 2.0" report proves Microsoft is still using deceptive dark patterns and Copilot overrides to force Windows users to use Edge. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">sS336gzqWFg87SufLQCaBh</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/gcb4ZLNUhkLc5vcuK2DVjB-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 16 Jul 2026 11:42:57 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Browsers]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Internet]]></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/gcb4ZLNUhkLc5vcuK2DVjB-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Microsoft Edge open on a laptop with the browser&#039;s app listing page open on a smartphone in front of it]]></media:description>                                                            <media:text><![CDATA[Microsoft Edge open on a laptop with the browser&#039;s app listing page open on a smartphone in front of it]]></media:text>
                                <media:title type="plain"><![CDATA[Microsoft Edge open on a laptop with the browser&#039;s app listing page open on a smartphone in front of it]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/gcb4ZLNUhkLc5vcuK2DVjB-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>You already know about Microsoft’s desperate ploys to get you to use Edge on Windows 11 — chances are you’re one of the folks who have gone through the test of patience to install <a href="https://www.tomsguide.com/tag/firefox">Firefox</a> or <a href="https://www.tomsguide.com/tag/chrome">Google Chrome</a>.</p><p>Well, new <a href="https://research.mozilla.org/browser-competition/over-the-edge-2/" target="_blank">research by Mozilla</a> reveals that the Redmond crew are not only still up to their old tricks, but getting worse. All kinds of “harmful design” shenanigans are at play here, in order to “not allow people to download and install an alternative browser, to set it as their default, or to continue using it as their default, without harmful interference.”</p><p>If only we could only get the same treatment as <a href="https://www.tomsguide.com/computing/windows-operating-systems/finally-microsoft-will-stop-begging-you-to-make-edge-your-default-browser-but-not-for-everyone">Windows users get in the EU</a>...</p><h2 id="staying-desperate">Staying desperate</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1351px;"><p class="vanilla-image-block" style="padding-top:79.94%;"><img id="phisb8hSyHA5EzrRHf8eAN" name="Microsoft Edge" alt="Microsoft Edge" src="https://cdn.mos.cms.futurecdn.net/phisb8hSyHA5EzrRHf8eAN.jpg" mos="" align="middle" fullscreen="1" width="1351" height="1080" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/phisb8hSyHA5EzrRHf8eAN.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: Mozilla)</span></figcaption></figure><p>So what did the research find? Well, Mozilla discovered that a lot of the shady tricks Microsoft was called out for in the past are still happening:</p><ul><li><strong>Visual interference: </strong>Searching for different browsers to download in Edge still brings up the “All you need is right here” banner, as well as a banner promoting the browser when you go to Chrome’s download page.</li><li><strong>Default browser selection trickery: </strong>There is a button at the top of the default apps screen to change to a different browser, but not every file type is switched over.</li><li><strong>Trick wording: </strong>Things like “Use Microsoft’s recommended browser settings,” “You’re almost done setting up your PC” and more still persist.</li><li><strong>Dark patterns: </strong>In the setup screens you normally see a few days later, Edge-preferential options are shown as big blue buttons, whereas keeping the same settings is usually smaller, greyed-out text.</li></ul><p>And that’s just a few of the many different harmful patterns Mozilla found — including Copilot opening links in Edge instead of your default browser, pre-selecting checkboxes to sync data to Edge, and resetting it as the default browser when you migrate from Windows 10 to 11.</p><h2 id="just-make-a-better-browser">Just make a better browser</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Tc9zNbWDujp6HyxnFHUWqG" name="Edge_wants_you_to_stay.jpg" alt="Microsoft Edge wants you to stay as a user" src="https://cdn.mos.cms.futurecdn.net/Tc9zNbWDujp6HyxnFHUWqG.jpg" mos="" align="middle" fullscreen="" width="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 / Microsoft)</span></figcaption></figure><p>It screams “inferiority complex” if I’m being real, which is a shame because Edge is indeed a good browser. It runs on the same Chromium engine as Chrome (to support all the same extensions), but also has some efficiencies built into it to not drain the battery as badly.</p><p>But this aggressive lock-in, some high RAM resource usage in the background and the clutter of Copilot and MSN news does make it falter. It’s not like Microsoft doesn't have a history of doing this — they were taken to court over an antitrust lawsuit in 1998 for bundling Internet Explorer with Windows and making it difficult to install a competing browser.</p><p>The only difference now is that users are committed enough to jump through those hoops to get to their favorite browsers. I mean “Google Chrome” is one of the most searched terms on Bing after all!</p><p>If you want to compete, build something better. Don’t go about it this way.</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/hardware/sk-hynix-warns-2027-will-be-worst-year-for-ram-prices-right-as-a-damning-report-reveals-something-that-will-add-fuel-to-the-price-fixing-lawsuit">SK Hynix warns 2027 will be 'worst year' for RAM prices — right as a damning report reveals something that will add fuel to the price-fixing lawsuit</a></li><li><a href="https://www.tomsguide.com/computing/routers/router-overheating-the-simple-mistakes-killing-your-wi-fi-this-summer-according-to-a-networking-expert">Router overheating? The simple mistakes killing your Wi-Fi this summer — according to a networking expert</a></li><li><a href="https://www.tomsguide.com/computing/malware-adware/dangerous-new-crashstealer-mac-malware-bypasses-apples-gatekeeper-to-steal-your-passwords-and-more">Dangerous new CrashStealer Mac impersonates Apple's own tools — and bypasses Gatekeeper — to steal your passwords and more</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ From hidden menus to frustrating trade-offs, our complete comparison of major AI chatbot privacy controls shows exactly how ChatGPT, Google Gemini, and others track your chats and what you can do to stop them ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Most of today's AI assistants can use at least some customer conversations to improve future models, although the rules vary dramatically depending on which service you're using, whether you have a personal or business account, and which privacy settings you've enabled.</p><p>After reading about <a href="https://www.tomsguide.com/computing/google-wants-to-train-its-ai-on-your-search-history-you-dont-have-to-let-it">Google's latest changes around Search and AI training</a>, I decided to spend some time checking the privacy controls for every major AI chatbot I use regularly. </p><p>I wanted to know exactly which companies actually make it easy to control how your data is used. I did the work so you don't have to — here's how they actually compare.</p><h2 id="not-every-ai-company-plays-by-the-same-rules">Not every AI company plays by the same rules</h2><p>It's tempting to believe that all chatbots have similar privacy rules considering how similar they all seem. But behind the scenes, they're collecting and handling your data in very different ways.</p><p>Some make it easy to opt out of having conversations used to improve AI models. Others bury the controls several menus deep. And in some cases, there isn't a meaningful opt-out at all.</p><p>After comparing ChatGPT, Gemini, Claude, Microsoft Copilot, Meta AI and Grok, one thing became obvious: there is no industry standard for AI privacy.</p><h2 id="chatgpt-the-most-straightforward">ChatGPT: The most straightforward</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2250px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="57hs6JrgxS3E997ibBEXEj" name="ChatGPT incognito 5.jpg" alt="ChatGPT settings menu" src="https://cdn.mos.cms.futurecdn.net/57hs6JrgxS3E997ibBEXEj.jpg" mos="" align="middle" fullscreen="" width="2250" height="1266" attribution="" endorsement="" 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 biggest surprise for me was ChatGPT. I was not expecting the settings to be as easy to understand. Quite the contrary, I expected the settings to be buried somewhere inside a privacy dashboard. Instead, they're right where most people would think to look.</p><p><strong>Open Settings > Data Controls</strong> and you'll see a switch labeled "Improve the model for everyone."</p><p>Turn it off, and OpenAI says your future conversations won't be used to improve its models.</p><p>You can also use <a href="https://www.tomsguide.com/ai/ive-started-using-chatgpts-incognito-mode-every-time-heres-4-reasons-why-and-how-to-do-it">Temporary Chat</a>, which doesn't save conversations to your history or use them for model training.</p><p>It took less than a minute to change. Whether you're comfortable sharing conversations or not, I appreciated how straightforward the process was.</p><h2 id="google-gemini-transparent-but-with-a-tradeoff">Google Gemini: Transparent, but with a tradeoff</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="APVGR3LfkGdLNdwq4xWbJX" name="s25-ultra-gemini" alt="Google Gemini performing Cross App action on a Galaxy s25 Ultra" src="https://cdn.mos.cms.futurecdn.net/APVGR3LfkGdLNdwq4xWbJX.jpg" mos="" align="middle" fullscreen="" width="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>Google's controls weren't especially difficult to find either. Gemini Apps Activity lets you decide whether your conversations are stored and used according to Google's policies.</p><p>The catch is that disabling activity also changes how Gemini works. You'll lose saved chat history, and some personalized experiences disappear along with it. That's not necessarily a bad tradeoff, just something you'll have to weigh before making the switch.</p><p>As mentioned, Google recently <a href="https://www.tomsguide.com/ai/google-just-changed-a-major-privacy-setting-heres-the-switch-i-turned-off-immediately">confirmed that some Search interactions</a> — including uploads used with <a href="https://www.tomsguide.com/ai/google-gemini/google-search-box-just-got-the-biggest-makeover-in-nearly-30-years">AI-powered Search features</a>, may contribute to improving its AI systems unless you disable the relevant activity settings.</p><h2 id="claude-clear-controls-with-some-fine-print-worth-reading">Claude: Clear controls, with some fine print worth reading</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ehRQPagfgfcNUEqyrgR9bd" name="Claude Privacy" alt="Claude Privacy" src="https://cdn.mos.cms.futurecdn.net/ehRQPagfgfcNUEqyrgR9bd.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Anthropic introduced a training opt-in for its consumer Claude products (Free, Pro and Max) in August 2025. Users were asked to decide whether their conversations could be used to improve future models, with a deadline to make their choice.</p><p>The setting lives under <strong>Settings > Privacy</strong>, where you'll find a toggle labeled "Improve Claude for everyone." Turn it off and Anthropic says your future conversations won't be used for model training.</p><p>Like ChatGPT, the change is forward-looking — it doesn't pull your data out of models that have already been trained. And if you leave the toggle on, Anthropic's retention period for that data extends from 30 days to up to five years.</p><p>There's also an Incognito mode, accessible via a ghost icon in the interface. Incognito conversations aren't used for training regardless of your main toggle setting, which is a useful option for one-off sensitive queries.</p><p>One thing worth noting: Anthropic's privacy policy includes a carve-out for conversations flagged by its safety classifiers. Even if you've opted out, flagged content may still be used to improve Anthropic's internal trust and safety systems. The policy doesn't define exactly what triggers a flag or commit to notifying users when one occurs.</p><p>Business and API users operate under separate commercial terms, and their data isn't used for model training by default.</p><h2 id="microsoft-copilot-it-depends-on-which-product-you-re-using">Microsoft Copilot: It depends on which product you're using</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="s6daGB6yqDwY346NPjhUBg" name="Microsoft Copilot.jpg" alt="Microsoft Copilot" src="https://cdn.mos.cms.futurecdn.net/s6daGB6yqDwY346NPjhUBg.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Microsoft was the hardest to summarize because the answer changes depending on where you're using AI.</p><p>For the consumer Copilot experience (used with a personal Microsoft account), Microsoft does use conversation data — including voice interactions and uploaded files' context — to train its AI models by default. </p><p>However, an opt-out exists. On copilot.com or the desktop app, go to your <strong>profile icon > your profile name > Privacy >Training on conversation activity</strong>. </p><p>On mobile, the path is <strong>Menu > profile icon > Account > Privacy > Training</strong> <strong>on conversation activity</strong>. Opting out excludes your future conversations from model training.</p><p>One detail that separates Microsoft from the pack is that even if you don't opt out, Microsoft says personal identifiers are anonymized before data is used for training. Uploaded files themselves are never used for training and are deleted after 30 days.</p><p>For Microsoft 365 Copilot used through a work or school account, the picture is much cleaner. Microsoft explicitly states that enterprise data is not used to train its foundation AI models. Your organization's IT administrator controls the relevant settings, and users in those environments won't even see a training toggle.</p><p>The gap between these two experiences is significant because a personal user who doesn't dig into settings is opted in by default. An enterprise user is protected by contract. If you're using Copilot casually with a personal account, it's worth the two minutes to check.</p><h2 id="meta-ai-no-simple-opt-out-for-most-users">Meta AI: No simple opt-out for most users</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="m62uRJJu6At56Ss2hpqt5R" name="Meta_Facebook Settings and Privacy" alt="Meta/Facebook Settings and Privacy" src="https://cdn.mos.cms.futurecdn.net/m62uRJJu6At56Ss2hpqt5R.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Meta AI is where the comparison gets uncomfortable. Unlike every other service on this list, Meta doesn't offer U.S. users a simple toggle to opt out of AI training. Your public posts, comments, captions and interactions with Meta AI across Facebook, Instagram and WhatsApp can all be used to train Meta's generative AI models.</p><p>EU and UK users have stronger protections, they can submit a formal objection through Meta's Privacy Center under GDPR rights, and Meta is required to review it. </p><p>But for users in the United States, the only available option is a third-party information form designed for cases where your personal data appeared in an AI-generated response. Meta doesn't guarantee it will honor these requests.</p><p>There's also no way to submit an opt-out request specifically for Meta AI interactions on WhatsApp. Meta says private messages aren't used for training, but any conversation you have directly with Meta AI can be.</p><p>Making your accounts private reduces your exposure, since Meta says it doesn't scrape private posts. But that's a blunt instrument, it changes your entire social media experience to address an AI training concern.</p><p>To make matters more complex, as of late <a href="https://www.reuters.com/business/media-telecom/meta-use-ai-chats-personalize-content-ads-december-2025-10-01/" target="_blank">2025 Meta began using AI chat interactions for ad targeting across its platforms</a>, with no opt-out available for that specific use.</p><h2 id="grok-an-opt-out-exists-but-the-scope-is-wider-than-you-d-expect">Grok: An opt-out exists, but the scope is wider than you'd expect</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4452px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="dnT3eqsB75oW79opwoTRjY" name="Grok lead" alt="Grok logo on a phone handset on a keyboard" src="https://cdn.mos.cms.futurecdn.net/dnT3eqsB75oW79opwoTRjY.jpg" mos="" align="middle" fullscreen="" width="4452" height="2504" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Grok, built by xAI and integrated into X (formerly Twitter), does offer a training opt-out, but the situation is more complicated than it first appears because there are actually two separate data flows to manage.</p><p>First, there's your Grok conversation data. You can disable training use by going to <strong>Settings > Data Controls</strong> within Grok and turning off the relevant toggle. xAI has confirmed that once disabled, your future chats won't be used for model training.</p><p>Second, there's your X platform data. By default, your public posts, likes and interactions on X are also used to train Grok, regardless if you've ever opened the chatbot. To disable this, go to <strong>Settings and Privacy > Privacy and Safety </strong>on X and find the Grok data-sharing section.</p><p>Both settings need to be turned off separately. Disabling one doesn't affect the other.</p><p>That dual structure is the key difference between Grok and standalone chatbots like ChatGPT or Claude. Those services only train on what you tell them directly. Grok can train on everything you've ever posted publicly on X, and opting out doesn't retroactively remove data that's already been collected.</p><p>Grok also offers a Private Chat mode, where conversations aren't saved and are deleted within about 30 days, similar to incognito features on other platforms. But the broader X data pipeline makes the overall privacy picture murkier than the conversation-level toggle alone would suggest.</p><h2 id="what-i-learned">What I learned</h2><p>At one end, ChatGPT and Claude offer clear, easy-to-find toggles that take under a minute to change. Google is similarly accessible but comes with a functional tradeoff. Microsoft splits the difference depending on whether you're a personal or enterprise user.</p><p>At the other end, Meta offers U.S. users no meaningful conversation-level opt-out, and Grok requires managing two separate settings across two different interfaces to fully limit your exposure.</p><p>As AI becomes part of everyday life, it's important to really understand the privacy settings. Choosing a chatbot may involve more than deciding which one writes the best email or creates the best image and come down to a much simpler question: Which company do you trust with your conversations and how hard do they make you work to answer that for yourself? <br><br>Let me know in the comments which chatbot you prefer and why. </p><a href="https://follow.it/articles-by-amanda-caswell-tom-s-guide?leanpub" class="button button--large button--primary">Follow Amanda Caswell and stay ahead of the AI curve</a><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/gemini-isnt-just-a-chatbot-anymore-here-are-13-things-it-can-do-in-2026">Gemini isn't just a chatbot anymore — here are 13 things it can do in 2026</a></li><li><a href="https://www.tomsguide.com/ai/i-replaced-my-true-crime-podcast-with-chatgpt-voice-for-a-week-heres-what-happened">I replaced my true crime podcast with ChatGPT Voice for a week — here's what happened</a></li><li><a href="https://www.tomsguide.com/ai/chatgpt-isnt-just-a-chatbot-anymore-here-are-11-things-it-can-do-in-2026">ChatGPT isn't just a chatbot anymore — here are 11 things it can do in 2026</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/ai/i-checked-the-privacy-settings-of-every-major-ai-chatbot-heres-how-they-actually-compare</link>
                                                                            <description>
                            <![CDATA[ I compared the privacy settings of ChatGPT, Google Gemini, Claude, Copilot, Meta AI and Grok to see which made it easiest to opt out of AI training. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">7EMdc6afSCPTuSrxbxYrLW</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/9SPX3KFaKvAj2EFwmdWntR-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 08 Jul 2026 10:00:00 +0000</pubDate>                                                                                                                                <updated>Wed, 08 Jul 2026 20:06:39 +0000</updated>
                                                                                                                                            <category><![CDATA[AI]]></category>
                                                                                                <author><![CDATA[ amanda.caswell@futurenet.com (Amanda Caswell) ]]></author>                    <dc:creator><![CDATA[ Amanda Caswell ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/zYjevim2q7FjQiefqpjZRB.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/9SPX3KFaKvAj2EFwmdWntR-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[AI ChatGPT vs. Gemini vs. Claude logos on phones]]></media:description>                                                            <media:text><![CDATA[AI ChatGPT vs. Gemini vs. Claude logos on phones]]></media:text>
                                <media:title type="plain"><![CDATA[AI ChatGPT vs. Gemini vs. Claude logos on phones]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/9SPX3KFaKvAj2EFwmdWntR-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Most of today's AI assistants can use at least some customer conversations to improve future models, although the rules vary dramatically depending on which service you're using, whether you have a personal or business account, and which privacy settings you've enabled.</p><p>After reading about <a href="https://www.tomsguide.com/computing/google-wants-to-train-its-ai-on-your-search-history-you-dont-have-to-let-it">Google's latest changes around Search and AI training</a>, I decided to spend some time checking the privacy controls for every major AI chatbot I use regularly. </p><p>I wanted to know exactly which companies actually make it easy to control how your data is used. I did the work so you don't have to — here's how they actually compare.</p><h2 id="not-every-ai-company-plays-by-the-same-rules">Not every AI company plays by the same rules</h2><p>It's tempting to believe that all chatbots have similar privacy rules considering how similar they all seem. But behind the scenes, they're collecting and handling your data in very different ways.</p><p>Some make it easy to opt out of having conversations used to improve AI models. Others bury the controls several menus deep. And in some cases, there isn't a meaningful opt-out at all.</p><p>After comparing ChatGPT, Gemini, Claude, Microsoft Copilot, Meta AI and Grok, one thing became obvious: there is no industry standard for AI privacy.</p><h2 id="chatgpt-the-most-straightforward">ChatGPT: The most straightforward</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2250px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="57hs6JrgxS3E997ibBEXEj" name="ChatGPT incognito 5.jpg" alt="ChatGPT settings menu" src="https://cdn.mos.cms.futurecdn.net/57hs6JrgxS3E997ibBEXEj.jpg" mos="" align="middle" fullscreen="" width="2250" height="1266" attribution="" endorsement="" 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 biggest surprise for me was ChatGPT. I was not expecting the settings to be as easy to understand. Quite the contrary, I expected the settings to be buried somewhere inside a privacy dashboard. Instead, they're right where most people would think to look.</p><p><strong>Open Settings > Data Controls</strong> and you'll see a switch labeled "Improve the model for everyone."</p><p>Turn it off, and OpenAI says your future conversations won't be used to improve its models.</p><p>You can also use <a href="https://www.tomsguide.com/ai/ive-started-using-chatgpts-incognito-mode-every-time-heres-4-reasons-why-and-how-to-do-it">Temporary Chat</a>, which doesn't save conversations to your history or use them for model training.</p><p>It took less than a minute to change. Whether you're comfortable sharing conversations or not, I appreciated how straightforward the process was.</p><h2 id="google-gemini-transparent-but-with-a-tradeoff">Google Gemini: Transparent, but with a tradeoff</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="APVGR3LfkGdLNdwq4xWbJX" name="s25-ultra-gemini" alt="Google Gemini performing Cross App action on a Galaxy s25 Ultra" src="https://cdn.mos.cms.futurecdn.net/APVGR3LfkGdLNdwq4xWbJX.jpg" mos="" align="middle" fullscreen="" width="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>Google's controls weren't especially difficult to find either. Gemini Apps Activity lets you decide whether your conversations are stored and used according to Google's policies.</p><p>The catch is that disabling activity also changes how Gemini works. You'll lose saved chat history, and some personalized experiences disappear along with it. That's not necessarily a bad tradeoff, just something you'll have to weigh before making the switch.</p><p>As mentioned, Google recently <a href="https://www.tomsguide.com/ai/google-just-changed-a-major-privacy-setting-heres-the-switch-i-turned-off-immediately">confirmed that some Search interactions</a> — including uploads used with <a href="https://www.tomsguide.com/ai/google-gemini/google-search-box-just-got-the-biggest-makeover-in-nearly-30-years">AI-powered Search features</a>, may contribute to improving its AI systems unless you disable the relevant activity settings.</p><h2 id="claude-clear-controls-with-some-fine-print-worth-reading">Claude: Clear controls, with some fine print worth reading</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ehRQPagfgfcNUEqyrgR9bd" name="Claude Privacy" alt="Claude Privacy" src="https://cdn.mos.cms.futurecdn.net/ehRQPagfgfcNUEqyrgR9bd.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Anthropic introduced a training opt-in for its consumer Claude products (Free, Pro and Max) in August 2025. Users were asked to decide whether their conversations could be used to improve future models, with a deadline to make their choice.</p><p>The setting lives under <strong>Settings > Privacy</strong>, where you'll find a toggle labeled "Improve Claude for everyone." Turn it off and Anthropic says your future conversations won't be used for model training.</p><p>Like ChatGPT, the change is forward-looking — it doesn't pull your data out of models that have already been trained. And if you leave the toggle on, Anthropic's retention period for that data extends from 30 days to up to five years.</p><p>There's also an Incognito mode, accessible via a ghost icon in the interface. Incognito conversations aren't used for training regardless of your main toggle setting, which is a useful option for one-off sensitive queries.</p><p>One thing worth noting: Anthropic's privacy policy includes a carve-out for conversations flagged by its safety classifiers. Even if you've opted out, flagged content may still be used to improve Anthropic's internal trust and safety systems. The policy doesn't define exactly what triggers a flag or commit to notifying users when one occurs.</p><p>Business and API users operate under separate commercial terms, and their data isn't used for model training by default.</p><h2 id="microsoft-copilot-it-depends-on-which-product-you-re-using">Microsoft Copilot: It depends on which product you're using</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="s6daGB6yqDwY346NPjhUBg" name="Microsoft Copilot.jpg" alt="Microsoft Copilot" src="https://cdn.mos.cms.futurecdn.net/s6daGB6yqDwY346NPjhUBg.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Microsoft was the hardest to summarize because the answer changes depending on where you're using AI.</p><p>For the consumer Copilot experience (used with a personal Microsoft account), Microsoft does use conversation data — including voice interactions and uploaded files' context — to train its AI models by default. </p><p>However, an opt-out exists. On copilot.com or the desktop app, go to your <strong>profile icon > your profile name > Privacy >Training on conversation activity</strong>. </p><p>On mobile, the path is <strong>Menu > profile icon > Account > Privacy > Training</strong> <strong>on conversation activity</strong>. Opting out excludes your future conversations from model training.</p><p>One detail that separates Microsoft from the pack is that even if you don't opt out, Microsoft says personal identifiers are anonymized before data is used for training. Uploaded files themselves are never used for training and are deleted after 30 days.</p><p>For Microsoft 365 Copilot used through a work or school account, the picture is much cleaner. Microsoft explicitly states that enterprise data is not used to train its foundation AI models. Your organization's IT administrator controls the relevant settings, and users in those environments won't even see a training toggle.</p><p>The gap between these two experiences is significant because a personal user who doesn't dig into settings is opted in by default. An enterprise user is protected by contract. If you're using Copilot casually with a personal account, it's worth the two minutes to check.</p><h2 id="meta-ai-no-simple-opt-out-for-most-users">Meta AI: No simple opt-out for most users</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="m62uRJJu6At56Ss2hpqt5R" name="Meta_Facebook Settings and Privacy" alt="Meta/Facebook Settings and Privacy" src="https://cdn.mos.cms.futurecdn.net/m62uRJJu6At56Ss2hpqt5R.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Meta AI is where the comparison gets uncomfortable. Unlike every other service on this list, Meta doesn't offer U.S. users a simple toggle to opt out of AI training. Your public posts, comments, captions and interactions with Meta AI across Facebook, Instagram and WhatsApp can all be used to train Meta's generative AI models.</p><p>EU and UK users have stronger protections, they can submit a formal objection through Meta's Privacy Center under GDPR rights, and Meta is required to review it. </p><p>But for users in the United States, the only available option is a third-party information form designed for cases where your personal data appeared in an AI-generated response. Meta doesn't guarantee it will honor these requests.</p><p>There's also no way to submit an opt-out request specifically for Meta AI interactions on WhatsApp. Meta says private messages aren't used for training, but any conversation you have directly with Meta AI can be.</p><p>Making your accounts private reduces your exposure, since Meta says it doesn't scrape private posts. But that's a blunt instrument, it changes your entire social media experience to address an AI training concern.</p><p>To make matters more complex, as of late <a href="https://www.reuters.com/business/media-telecom/meta-use-ai-chats-personalize-content-ads-december-2025-10-01/" target="_blank">2025 Meta began using AI chat interactions for ad targeting across its platforms</a>, with no opt-out available for that specific use.</p><h2 id="grok-an-opt-out-exists-but-the-scope-is-wider-than-you-d-expect">Grok: An opt-out exists, but the scope is wider than you'd expect</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4452px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="dnT3eqsB75oW79opwoTRjY" name="Grok lead" alt="Grok logo on a phone handset on a keyboard" src="https://cdn.mos.cms.futurecdn.net/dnT3eqsB75oW79opwoTRjY.jpg" mos="" align="middle" fullscreen="" width="4452" height="2504" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Grok, built by xAI and integrated into X (formerly Twitter), does offer a training opt-out, but the situation is more complicated than it first appears because there are actually two separate data flows to manage.</p><p>First, there's your Grok conversation data. You can disable training use by going to <strong>Settings > Data Controls</strong> within Grok and turning off the relevant toggle. xAI has confirmed that once disabled, your future chats won't be used for model training.</p><p>Second, there's your X platform data. By default, your public posts, likes and interactions on X are also used to train Grok, regardless if you've ever opened the chatbot. To disable this, go to <strong>Settings and Privacy > Privacy and Safety </strong>on X and find the Grok data-sharing section.</p><p>Both settings need to be turned off separately. Disabling one doesn't affect the other.</p><p>That dual structure is the key difference between Grok and standalone chatbots like ChatGPT or Claude. Those services only train on what you tell them directly. Grok can train on everything you've ever posted publicly on X, and opting out doesn't retroactively remove data that's already been collected.</p><p>Grok also offers a Private Chat mode, where conversations aren't saved and are deleted within about 30 days, similar to incognito features on other platforms. But the broader X data pipeline makes the overall privacy picture murkier than the conversation-level toggle alone would suggest.</p><h2 id="what-i-learned">What I learned</h2><p>At one end, ChatGPT and Claude offer clear, easy-to-find toggles that take under a minute to change. Google is similarly accessible but comes with a functional tradeoff. Microsoft splits the difference depending on whether you're a personal or enterprise user.</p><p>At the other end, Meta offers U.S. users no meaningful conversation-level opt-out, and Grok requires managing two separate settings across two different interfaces to fully limit your exposure.</p><p>As AI becomes part of everyday life, it's important to really understand the privacy settings. Choosing a chatbot may involve more than deciding which one writes the best email or creates the best image and come down to a much simpler question: Which company do you trust with your conversations and how hard do they make you work to answer that for yourself? <br><br>Let me know in the comments which chatbot you prefer and why. </p><a href="https://follow.it/articles-by-amanda-caswell-tom-s-guide?leanpub" class="button button--large button--primary">Follow Amanda Caswell and stay ahead of the AI curve</a><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/gemini-isnt-just-a-chatbot-anymore-here-are-13-things-it-can-do-in-2026">Gemini isn't just a chatbot anymore — here are 13 things it can do in 2026</a></li><li><a href="https://www.tomsguide.com/ai/i-replaced-my-true-crime-podcast-with-chatgpt-voice-for-a-week-heres-what-happened">I replaced my true crime podcast with ChatGPT Voice for a week — here's what happened</a></li><li><a href="https://www.tomsguide.com/ai/chatgpt-isnt-just-a-chatbot-anymore-here-are-11-things-it-can-do-in-2026">ChatGPT isn't just a chatbot anymore — here are 11 things it can do in 2026</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Microsoft extends Windows 10 support for another year: what you need to know ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Good news for those of you who have yet to upgrade to Windows 11: You're going to get another year of reprieve.</p><p>Microsoft officially <a href="https://www.tomsguide.com/news/live/windows-10-end-of-support-2025">ended support for Windows 10</a> in October 2025, but you could sign up for the Extended Security Update (ESU) program, which will keep support going through October 13,  2026. </p><p>At that point, support was going to be cut off for good. However, that's changed thanks to a <a href="https://www.microsoft.com/en-gb/windows/extended-security-updates?r=1" target="_blank">quiet change Microsoft introduced</a> this week and spotted by <a href="https://www.gsmarena.com/microsoft_quietly_extends_windows_10_support_for_another_year-news-73453.php" target="_blank">GSMArena</a>. The new end date has been extended to October 12, 2027. </p><h2 id="ram-crisis-relief">RAM crisis relief</h2><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="DucJVEzwF4KJNbcg2WW9PJ" name="RAM" alt="RAM" src="https://cdn.mos.cms.futurecdn.net/DucJVEzwF4KJNbcg2WW9PJ.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: fabrikasimf / Freepik)</span></figcaption></figure><p>I can't find anything beyond the FAQ page, but Microsoft hasn't really promoted this update. The company is desparate for people to upgrade to Windows 11, something users have avoided because of <a href="https://www.tomsguide.com/computing/windows-operating-systems/we-need-to-improve-windows-in-ways-that-are-meaningful-for-people-microsoft-is-urgently-trying-to-fix-windows-11-issues">core problems with the operating system</a>.</p><p>Still, this is extra breathing room for people who haven't upgraded. Plus, it alleviates the need to purchase a new laptop, just as every tech company is raising prices due to the <a href="https://www.tomsguide.com/computing/hardware/the-squeeze-is-real-i-spoke-to-ram-crisis-oracle-carmen-li-about-when-this-nightmare-ends-heres-what-she-told-me">ongoing memory shortage</a>.</p><p>PC makers have been <a href="https://www.tomsguide.com/computing/lenovo-is-planning-another-pc-price-hike-in-march-and-im-all-out-of-patience-with-this-ai-bubble">ringing the warning bell</a> since early 2026, with <a href="https://www.tomsguide.com/computing/buy-it-as-soon-as-you-can-lenovo-issues-urgent-warning-on-ram-crisis-spiking-prices">Lenovo saying "Buy it soon as you can"</a> in February.</p><p><a href="https://www.tomsguide.com/computing/macbooks/apple-price-hikes-are-official-heres-how-much-more-youll-pay-for-macbooks-and-ipads-now">Apple just raised prices</a> on its laptops and <a href="https://www.tomsguide.com/gaming/xbox/microsoft-blames-components-crisis-for-rising-xbox-prices-amidst-ai-greed-which-has-been-partly-caused-by-microsoft">Microsoft hiked Xbox console prices</a> for the third time in a year while blaming the memory shortage this week.</p><p>With purchasing power becoming untenable, even a year is a nice break.</p><h2 id="how-to-sign-up-for-the-esu">How to sign up for the ESU</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4642px;"><p class="vanilla-image-block" style="padding-top:62.32%;"><img id="fF7acrg8AUVF4uUadMVr69" name="Windows 10.jpg" alt="Windows 10" src="https://cdn.mos.cms.futurecdn.net/fF7acrg8AUVF4uUadMVr69.jpg" mos="" align="middle" fullscreen="" width="4642" height="2893" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>To sign up for the ESU program, <strong>your device needs to run Windows 10, version 22H2</strong> Home, Professional, Pro Education or Workstations edition.  It also needs to have the latest Windows update installed.</p><p>You need to have a Microsoft account that is an administrator.</p><p><strong>There's</strong> <strong>no cost if you sync your PC settings</strong>. You can also redeem 1,000 Microsoft Rewards points or make a one-time $30 purchase. </p><p>To get the ESU running you can go to Settings > Update & Security > Windows Update. If you meet the requirements you should see an Enroll Now button for ESU. </p><p>You can extend the ESU license on up to 10 devices. </p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/gaming/xbox/microsoft-blames-components-crisis-for-rising-xbox-prices-amidst-ai-greed-which-has-been-partly-caused-by-microsoft">Microsoft blames "components crisis" for rising Xbox prices amidst AI greed, which was partly caused by...Microsoft?</a></li><li><a href="https://www.tomsguide.com/ai/nvidia-claims-its-new-ai-data-centers-use-almost-no-water-heres-what-that-actually-means">NVIDIA claims its new AI data centers use almost no water — here's what that actually means</a></li><li><a href="https://www.tomsguide.com/computing/windows-operating-systems/here-are-some-way-too-early-windows-12-predictions-based-on-how-microsoft-is-changing-windows-11">Here are some way-too-early Windows 12 predictions based on how Microsoft is changing Windows 11</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/windows-operating-systems/microsoft-extends-windows-10-support-for-another-year-what-you-need-to-know</link>
                                                                            <description>
                            <![CDATA[ Windows 10 support was supposed to end for good this year, but Microsoft quietly extended it for at least one more. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">XEwdeuuKYAKACuF84UZoJX</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/qNMZdaX6mztsXXhqkDijd3-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 26 Jun 2026 21:19:43 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Windows Operating Systems]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Software]]></category>
                                                    <category><![CDATA[Operating Systems]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ.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/qNMZdaX6mztsXXhqkDijd3-1280-80.jpg">
                                                            <media:credit><![CDATA[Shuttershock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[How to update Windows 10 ]]></media:description>                                                            <media:text><![CDATA[How to update Windows 10 ]]></media:text>
                                <media:title type="plain"><![CDATA[How to update Windows 10 ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/qNMZdaX6mztsXXhqkDijd3-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Good news for those of you who have yet to upgrade to Windows 11: You're going to get another year of reprieve.</p><p>Microsoft officially <a href="https://www.tomsguide.com/news/live/windows-10-end-of-support-2025">ended support for Windows 10</a> in October 2025, but you could sign up for the Extended Security Update (ESU) program, which will keep support going through October 13,  2026. </p><p>At that point, support was going to be cut off for good. However, that's changed thanks to a <a href="https://www.microsoft.com/en-gb/windows/extended-security-updates?r=1" target="_blank">quiet change Microsoft introduced</a> this week and spotted by <a href="https://www.gsmarena.com/microsoft_quietly_extends_windows_10_support_for_another_year-news-73453.php" target="_blank">GSMArena</a>. The new end date has been extended to October 12, 2027. </p><h2 id="ram-crisis-relief">RAM crisis relief</h2><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="DucJVEzwF4KJNbcg2WW9PJ" name="RAM" alt="RAM" src="https://cdn.mos.cms.futurecdn.net/DucJVEzwF4KJNbcg2WW9PJ.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: fabrikasimf / Freepik)</span></figcaption></figure><p>I can't find anything beyond the FAQ page, but Microsoft hasn't really promoted this update. The company is desparate for people to upgrade to Windows 11, something users have avoided because of <a href="https://www.tomsguide.com/computing/windows-operating-systems/we-need-to-improve-windows-in-ways-that-are-meaningful-for-people-microsoft-is-urgently-trying-to-fix-windows-11-issues">core problems with the operating system</a>.</p><p>Still, this is extra breathing room for people who haven't upgraded. Plus, it alleviates the need to purchase a new laptop, just as every tech company is raising prices due to the <a href="https://www.tomsguide.com/computing/hardware/the-squeeze-is-real-i-spoke-to-ram-crisis-oracle-carmen-li-about-when-this-nightmare-ends-heres-what-she-told-me">ongoing memory shortage</a>.</p><p>PC makers have been <a href="https://www.tomsguide.com/computing/lenovo-is-planning-another-pc-price-hike-in-march-and-im-all-out-of-patience-with-this-ai-bubble">ringing the warning bell</a> since early 2026, with <a href="https://www.tomsguide.com/computing/buy-it-as-soon-as-you-can-lenovo-issues-urgent-warning-on-ram-crisis-spiking-prices">Lenovo saying "Buy it soon as you can"</a> in February.</p><p><a href="https://www.tomsguide.com/computing/macbooks/apple-price-hikes-are-official-heres-how-much-more-youll-pay-for-macbooks-and-ipads-now">Apple just raised prices</a> on its laptops and <a href="https://www.tomsguide.com/gaming/xbox/microsoft-blames-components-crisis-for-rising-xbox-prices-amidst-ai-greed-which-has-been-partly-caused-by-microsoft">Microsoft hiked Xbox console prices</a> for the third time in a year while blaming the memory shortage this week.</p><p>With purchasing power becoming untenable, even a year is a nice break.</p><h2 id="how-to-sign-up-for-the-esu">How to sign up for the ESU</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4642px;"><p class="vanilla-image-block" style="padding-top:62.32%;"><img id="fF7acrg8AUVF4uUadMVr69" name="Windows 10.jpg" alt="Windows 10" src="https://cdn.mos.cms.futurecdn.net/fF7acrg8AUVF4uUadMVr69.jpg" mos="" align="middle" fullscreen="" width="4642" height="2893" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>To sign up for the ESU program, <strong>your device needs to run Windows 10, version 22H2</strong> Home, Professional, Pro Education or Workstations edition.  It also needs to have the latest Windows update installed.</p><p>You need to have a Microsoft account that is an administrator.</p><p><strong>There's</strong> <strong>no cost if you sync your PC settings</strong>. You can also redeem 1,000 Microsoft Rewards points or make a one-time $30 purchase. </p><p>To get the ESU running you can go to Settings > Update & Security > Windows Update. If you meet the requirements you should see an Enroll Now button for ESU. </p><p>You can extend the ESU license on up to 10 devices. </p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/gaming/xbox/microsoft-blames-components-crisis-for-rising-xbox-prices-amidst-ai-greed-which-has-been-partly-caused-by-microsoft">Microsoft blames "components crisis" for rising Xbox prices amidst AI greed, which was partly caused by...Microsoft?</a></li><li><a href="https://www.tomsguide.com/ai/nvidia-claims-its-new-ai-data-centers-use-almost-no-water-heres-what-that-actually-means">NVIDIA claims its new AI data centers use almost no water — here's what that actually means</a></li><li><a href="https://www.tomsguide.com/computing/windows-operating-systems/here-are-some-way-too-early-windows-12-predictions-based-on-how-microsoft-is-changing-windows-11">Here are some way-too-early Windows 12 predictions based on how Microsoft is changing Windows 11</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Microsoft blames "components crisis" for rising Xbox prices amidst AI greed, which was partly caused by...Microsoft? ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Three days ago in a sprawling interview with <a href="https://ew.com/xbox-25th-anniversary-hollywood-adaptations-cover-story-exclusive-12003252" target="_blank">Entertainment Weekly</a>, new Xbox CEO <a href="https://www.tomsguide.com/gaming/xbox/xboxs-asha-sharma-promises-the-return-of-xbox-and-a-distinct-point-of-view-in-new-interview">Asha Sharma</a> said, "gaming is unaffordable in many cases." Today, Xbox announced price hikes for its consoles, the third in the last year. </p><p>The increases don't go into effect until August, but it does hit 512GB models with a $100 bump, while 1TB consoles are going up $150. Xbox is also discontinuing its 2TB model. </p><div ><table><caption>Xbox Console Pricing</caption><thead><tr><th class="firstcol " ><p><strong>Console</strong></p></th><th  ><p><strong>Old Price</strong></p></th><th  ><p><strong>New Price</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Xbox Series S 512</strong></p></td><td  ><p>$399.99</p></td><td  ><p>$499.99</p></td></tr><tr><td class="firstcol " ><p><strong>Xbox Series S 1TB</strong></p></td><td  ><p>$449.99</p></td><td  ><p>$599.99</p></td></tr><tr><td class="firstcol " ><p><strong>Xbox Series X Digital 1TB</strong></p></td><td  ><p>$599.99</p></td><td  ><p>$749.99</p></td></tr><tr><td class="firstcol " ><p><strong>Xbox Series X 1TB</strong></p></td><td  ><p>$649.99</p></td><td  ><p>$799.99</p></td></tr><tr><td class="firstcol " ><p><strong>Xbox Series X 2TB Galaxy Black Special Edition</strong></p></td><td  ><p>$799.99</p></td><td  ><p>Discontinued</p></td></tr></tbody></table></div><p>The Xbox announcement takes a contrite tone and even says that the company "hoped another price increase would not be necessary" after <a href="https://www.tomsguide.com/gaming/xbox/microsoft-raises-prices-on-xbox-series-s-and-x-for-the-second-time-this-year">last October's hike</a>.</p><p>It all comes only a couple of weeks after a missive from Sharma and Xbox Studios head Matt Booty discussing how <a href="https://news.xbox.com/en-us/2026/06/10/next-100-days-xbox-reset/" target="_blank">Xbox needed a reset</a>, which was quickly followed by<a href="https://www.bloomberg.com/news/articles/2026-06-10/xbox-plans-significant-layoffs-as-it-transforms-under-new-ceo-asha-sharma"> news of significant layoffs</a>.</p><p>It's a worrisome sign that Xbox knows this will be a problem when most of the announcement is loaded with buy now, pay later and other financing options. </p><h2 id="as-with-most-price-increase-blame-ai">As with most price increase; blame AI</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="E7RP6cwkqeUAeFyKot6VVU" name="Xbox Series X vs Xbox Series X Digital Edition-6" alt="Both versions of the Xbox Series X next to both versions of the Xbox Series S on a desk" src="https://cdn.mos.cms.futurecdn.net/E7RP6cwkqeUAeFyKot6VVU.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Since the end of 2025, the <a href="https://www.tomsguide.com/computing/smart-glasses/samsung-teases-ai-smart-glasses-but-reveals-memory-shortage-could-get-worse-in-recent-earnings-call">ongoing memory shortage</a> has slowly but steadily affected every tech company in the world, from phones and laptops to gaming. </p><p>Apple, one of the last holdouts, also <a href="https://www.tomsguide.com/computing/macbooks/apple-price-hikes-are-official-heres-how-much-more-youll-pay-for-macbooks-and-ipads-now">announced broad price increases</a> today for every device the company makes. At the far end, one version of the flailing Vision Pro now costs $3,699. The lowest announced increase was a $70 bump for the Apple TV 4K, an aging device that many expect to be replaced this year. </p><p>Last year, it was the <a href="https://www.tomsguide.com/computing/internet/you-dont-have-endless-options-amazon-ceo-warns-of-tariff-creep-as-sellers-start-to-raise-prices-on-consumers">roller-coaster tariffs </a>from the Trump administration that were to blame for varying increases. This year, every single price hike has blamed the memory shortage, which us and others have taken to referring to as <a href="https://www.tomsguide.com/computing/ram-price-crisis-2026-everything-you-need-to-know">RAMaggedon</a>.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eMVMAW"></div>                            </div>                            <script src="https://kwizly.com/embed/eMVMAW.js" async></script><p>"Unfortunately, console storage and memory prices have increased by more than 2.5x, and we expect another doubling by the fall of 2027," Xbox's announcement reads. "The entire consumer electronics industry is struggling with the current components crisis, but the effects are particularly hard on consoles."</p><p>AI greed and the <a href="https://www.tomsguide.com/ai/erin-brockovich-just-launched-an-ai-data-center-map-and-it-highlights-a-growing-problem-tech-giants-are-avoiding">massive AI data center boom</a> have been driving RAM and storage prices through the roof for months.</p><p>As an example, the WD Black m.2 SSD, a hard drive we recommend for upgrading your PS5's internal memory cost around $125 last June. It's on sale for <a href="https://www.amazon.com/Western-Digital-Officially-Licensed-Expansion/dp/B0C48B3RGL" target="_blank" rel="nofollow">Prime Day right now</a>, but current prices have it at $250, a current low after the SSD hit nearly $300 in April. </p><h2 id="microsoft-partly-to-blame">Microsoft partly to blame</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DznCTgyU7ivL76hyfP3hXk" name="MSFT_earnings_2026_LIST" alt="A composite shot with Satya Nadella on the left and a Microsoft store on the right" src="https://cdn.mos.cms.futurecdn.net/DznCTgyU7ivL76hyfP3hXk.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Fabrice Coffrini/Getty)</span></figcaption></figure><p>There are other companies to truly hold accountable for the memory crisis. <a href="https://www.tomsguide.com/computing/gpus/were-working-on-things-that-are-utterly-shocking-nvidias-ceo-on-pc-gamings-future-solving-the-ram-pricing-crisis-and-the-lore-behind-his-leather-jackets">Nvidia, </a>OpenAI, and Google have made massive investments in what they call artificial intelligence. </p><p>But we can't absolve Microsoft (or Apple) as both companies, laggards in the headlong race toward AI, have also invested heavily in AI, with varying degrees of success.</p><p>Just this month at<a href="https://www.tomsguide.com/news/live/microsoft-build-2026"> Microsoft Build 2026</a>, the company spent the majority of the event discussing AI and "agentic" systems. Most of the work is business-focused, but it's clear AI is what has the company's attention right now. This is despite <a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-is-reportedly-pulling-back-on-stuffing-windows-11-with-ai-and-i-couldnt-be-happier">promises to pull back</a> on stuffing Windows 11 with AI earlier in the year.</p><h2 id="gamers-don-t-want-it">Gamers don't want 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="iyn2kRwrCzCKLXTXvMwjUG" name="Xbox Series X Digital Edition-1" alt="Playing Metaphor ReFantazio on the Xbox Series X Digital Edition" src="https://cdn.mos.cms.futurecdn.net/iyn2kRwrCzCKLXTXvMwjUG.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Gamers on the whole are a capricious bunch, to put things nicely, but as a recent <a href="https://www.game-oracle.com/blog/ai-part2" target="_blank">Game Oracle study</a> found, they don't want AI. Titles with the AI-generated assets tag on Steam received 53% fewer ratings, indicating a lack of interest, and were more likely to be negatively reviewed. </p><p>Now, it's possible that AI is allowing more lazy developers to push out more slop, a veritable abyss that will seemingly never go away, AI or not.</p><p>Still, it speaks to a wider trend of consumers rejecting AI. <a href="https://www.marketingbrew.com/stories/harris-poll-ai-fatigue-less-trust-ai-generated-ads-cannes-lions" target="_blank">Marketing Brew</a> reports that 65% of respondents to a study said they never wanted to hear about AI again.</p><p><a href="https://www.cbsnews.com/news/ai-bubble-tech-selloff-investment-consumer-business-demand/" target="_blank">CBS News</a> just reported today that despite humongous investments in AI, companies don't really have customers. That's both consumers and businesses that are discovering that firing workers for "AI solutions" has netted next to zero in returns.</p><p>Our friends at <a href="https://www.tomshardware.com/tech-industry/artificial-intelligence/one-third-of-consumers-reject-ai-on-their-devices-with-most-saying-they-simply-dont-need-it-latest-report-highlights-privacy-fears-and-potential-costs-among-other-real-world-concerns" target="_blank">Tom's Hardware reported</a> in February that two-thirds of customers reject AI on their devices.</p><p>Between increasing prices for the companies themselves and their customers rejecting their AI-focused products, there will be a breaking point. The question is, how close are we to reaching it?</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/gaming/gta-6s-ultimate-edition-is-the-real-full-game-and-the-rumors-of-it-costing-usd100-were-true-after-all">GTA 6's Ultimate Edition is the real full game — and the rumors of it costing $100 were true after all</a></li><li><a href="https://www.tomsguide.com/news/live/xbox-games-showcase-2026-live-updates">Xbox Games Showcase 2026 — all the news, reveals, and announcements at Microsoft’s biggest gaming event of the year</a></li><li><a href="https://www.tomsguide.com/gaming/xbox/microsoft-reveals-new-details-on-its-project-helix-pc-console-hybrid-heres-all-the-latest-on-the-next-xbox">Microsoft reveals new details on its Project Helix PC-console hybrid: here's all the latest on the next Xbox</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/xbox/microsoft-blames-components-crisis-for-rising-xbox-prices-amidst-ai-greed-which-has-been-partly-caused-by-microsoft</link>
                                                                            <description>
                            <![CDATA[ Xbox announced new price increases for the Xbox Series X and S and sunsetting of the 2TB version. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">o3PyVXfzeUgFACYTLgK2ah</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/ehKH6GSEWqriffcToAJZgG-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 25 Jun 2026 21:00:26 +0000</pubDate>                                                                                                                                <updated>Thu, 25 Jun 2026 21:06:58 +0000</updated>
                                                                                                                                            <category><![CDATA[Xbox]]></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/ehKH6GSEWqriffcToAJZgG-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Xbox Series X controller being held]]></media:description>                                                            <media:text><![CDATA[Xbox Series X controller being held]]></media:text>
                                <media:title type="plain"><![CDATA[Xbox Series X controller being held]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/ehKH6GSEWqriffcToAJZgG-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Three days ago in a sprawling interview with <a href="https://ew.com/xbox-25th-anniversary-hollywood-adaptations-cover-story-exclusive-12003252" target="_blank">Entertainment Weekly</a>, new Xbox CEO <a href="https://www.tomsguide.com/gaming/xbox/xboxs-asha-sharma-promises-the-return-of-xbox-and-a-distinct-point-of-view-in-new-interview">Asha Sharma</a> said, "gaming is unaffordable in many cases." Today, Xbox announced price hikes for its consoles, the third in the last year. </p><p>The increases don't go into effect until August, but it does hit 512GB models with a $100 bump, while 1TB consoles are going up $150. Xbox is also discontinuing its 2TB model. </p><div ><table><caption>Xbox Console Pricing</caption><thead><tr><th class="firstcol " ><p><strong>Console</strong></p></th><th  ><p><strong>Old Price</strong></p></th><th  ><p><strong>New Price</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Xbox Series S 512</strong></p></td><td  ><p>$399.99</p></td><td  ><p>$499.99</p></td></tr><tr><td class="firstcol " ><p><strong>Xbox Series S 1TB</strong></p></td><td  ><p>$449.99</p></td><td  ><p>$599.99</p></td></tr><tr><td class="firstcol " ><p><strong>Xbox Series X Digital 1TB</strong></p></td><td  ><p>$599.99</p></td><td  ><p>$749.99</p></td></tr><tr><td class="firstcol " ><p><strong>Xbox Series X 1TB</strong></p></td><td  ><p>$649.99</p></td><td  ><p>$799.99</p></td></tr><tr><td class="firstcol " ><p><strong>Xbox Series X 2TB Galaxy Black Special Edition</strong></p></td><td  ><p>$799.99</p></td><td  ><p>Discontinued</p></td></tr></tbody></table></div><p>The Xbox announcement takes a contrite tone and even says that the company "hoped another price increase would not be necessary" after <a href="https://www.tomsguide.com/gaming/xbox/microsoft-raises-prices-on-xbox-series-s-and-x-for-the-second-time-this-year">last October's hike</a>.</p><p>It all comes only a couple of weeks after a missive from Sharma and Xbox Studios head Matt Booty discussing how <a href="https://news.xbox.com/en-us/2026/06/10/next-100-days-xbox-reset/" target="_blank">Xbox needed a reset</a>, which was quickly followed by<a href="https://www.bloomberg.com/news/articles/2026-06-10/xbox-plans-significant-layoffs-as-it-transforms-under-new-ceo-asha-sharma"> news of significant layoffs</a>.</p><p>It's a worrisome sign that Xbox knows this will be a problem when most of the announcement is loaded with buy now, pay later and other financing options. </p><h2 id="as-with-most-price-increase-blame-ai">As with most price increase; blame AI</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="E7RP6cwkqeUAeFyKot6VVU" name="Xbox Series X vs Xbox Series X Digital Edition-6" alt="Both versions of the Xbox Series X next to both versions of the Xbox Series S on a desk" src="https://cdn.mos.cms.futurecdn.net/E7RP6cwkqeUAeFyKot6VVU.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Since the end of 2025, the <a href="https://www.tomsguide.com/computing/smart-glasses/samsung-teases-ai-smart-glasses-but-reveals-memory-shortage-could-get-worse-in-recent-earnings-call">ongoing memory shortage</a> has slowly but steadily affected every tech company in the world, from phones and laptops to gaming. </p><p>Apple, one of the last holdouts, also <a href="https://www.tomsguide.com/computing/macbooks/apple-price-hikes-are-official-heres-how-much-more-youll-pay-for-macbooks-and-ipads-now">announced broad price increases</a> today for every device the company makes. At the far end, one version of the flailing Vision Pro now costs $3,699. The lowest announced increase was a $70 bump for the Apple TV 4K, an aging device that many expect to be replaced this year. </p><p>Last year, it was the <a href="https://www.tomsguide.com/computing/internet/you-dont-have-endless-options-amazon-ceo-warns-of-tariff-creep-as-sellers-start-to-raise-prices-on-consumers">roller-coaster tariffs </a>from the Trump administration that were to blame for varying increases. This year, every single price hike has blamed the memory shortage, which us and others have taken to referring to as <a href="https://www.tomsguide.com/computing/ram-price-crisis-2026-everything-you-need-to-know">RAMaggedon</a>.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eMVMAW"></div>                            </div>                            <script src="https://kwizly.com/embed/eMVMAW.js" async></script><p>"Unfortunately, console storage and memory prices have increased by more than 2.5x, and we expect another doubling by the fall of 2027," Xbox's announcement reads. "The entire consumer electronics industry is struggling with the current components crisis, but the effects are particularly hard on consoles."</p><p>AI greed and the <a href="https://www.tomsguide.com/ai/erin-brockovich-just-launched-an-ai-data-center-map-and-it-highlights-a-growing-problem-tech-giants-are-avoiding">massive AI data center boom</a> have been driving RAM and storage prices through the roof for months.</p><p>As an example, the WD Black m.2 SSD, a hard drive we recommend for upgrading your PS5's internal memory cost around $125 last June. It's on sale for <a href="https://www.amazon.com/Western-Digital-Officially-Licensed-Expansion/dp/B0C48B3RGL" target="_blank" rel="nofollow">Prime Day right now</a>, but current prices have it at $250, a current low after the SSD hit nearly $300 in April. </p><h2 id="microsoft-partly-to-blame">Microsoft partly to blame</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DznCTgyU7ivL76hyfP3hXk" name="MSFT_earnings_2026_LIST" alt="A composite shot with Satya Nadella on the left and a Microsoft store on the right" src="https://cdn.mos.cms.futurecdn.net/DznCTgyU7ivL76hyfP3hXk.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Fabrice Coffrini/Getty)</span></figcaption></figure><p>There are other companies to truly hold accountable for the memory crisis. <a href="https://www.tomsguide.com/computing/gpus/were-working-on-things-that-are-utterly-shocking-nvidias-ceo-on-pc-gamings-future-solving-the-ram-pricing-crisis-and-the-lore-behind-his-leather-jackets">Nvidia, </a>OpenAI, and Google have made massive investments in what they call artificial intelligence. </p><p>But we can't absolve Microsoft (or Apple) as both companies, laggards in the headlong race toward AI, have also invested heavily in AI, with varying degrees of success.</p><p>Just this month at<a href="https://www.tomsguide.com/news/live/microsoft-build-2026"> Microsoft Build 2026</a>, the company spent the majority of the event discussing AI and "agentic" systems. Most of the work is business-focused, but it's clear AI is what has the company's attention right now. This is despite <a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-is-reportedly-pulling-back-on-stuffing-windows-11-with-ai-and-i-couldnt-be-happier">promises to pull back</a> on stuffing Windows 11 with AI earlier in the year.</p><h2 id="gamers-don-t-want-it">Gamers don't want 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="iyn2kRwrCzCKLXTXvMwjUG" name="Xbox Series X Digital Edition-1" alt="Playing Metaphor ReFantazio on the Xbox Series X Digital Edition" src="https://cdn.mos.cms.futurecdn.net/iyn2kRwrCzCKLXTXvMwjUG.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Gamers on the whole are a capricious bunch, to put things nicely, but as a recent <a href="https://www.game-oracle.com/blog/ai-part2" target="_blank">Game Oracle study</a> found, they don't want AI. Titles with the AI-generated assets tag on Steam received 53% fewer ratings, indicating a lack of interest, and were more likely to be negatively reviewed. </p><p>Now, it's possible that AI is allowing more lazy developers to push out more slop, a veritable abyss that will seemingly never go away, AI or not.</p><p>Still, it speaks to a wider trend of consumers rejecting AI. <a href="https://www.marketingbrew.com/stories/harris-poll-ai-fatigue-less-trust-ai-generated-ads-cannes-lions" target="_blank">Marketing Brew</a> reports that 65% of respondents to a study said they never wanted to hear about AI again.</p><p><a href="https://www.cbsnews.com/news/ai-bubble-tech-selloff-investment-consumer-business-demand/" target="_blank">CBS News</a> just reported today that despite humongous investments in AI, companies don't really have customers. That's both consumers and businesses that are discovering that firing workers for "AI solutions" has netted next to zero in returns.</p><p>Our friends at <a href="https://www.tomshardware.com/tech-industry/artificial-intelligence/one-third-of-consumers-reject-ai-on-their-devices-with-most-saying-they-simply-dont-need-it-latest-report-highlights-privacy-fears-and-potential-costs-among-other-real-world-concerns" target="_blank">Tom's Hardware reported</a> in February that two-thirds of customers reject AI on their devices.</p><p>Between increasing prices for the companies themselves and their customers rejecting their AI-focused products, there will be a breaking point. The question is, how close are we to reaching it?</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/gaming/gta-6s-ultimate-edition-is-the-real-full-game-and-the-rumors-of-it-costing-usd100-were-true-after-all">GTA 6's Ultimate Edition is the real full game — and the rumors of it costing $100 were true after all</a></li><li><a href="https://www.tomsguide.com/news/live/xbox-games-showcase-2026-live-updates">Xbox Games Showcase 2026 — all the news, reveals, and announcements at Microsoft’s biggest gaming event of the year</a></li><li><a href="https://www.tomsguide.com/gaming/xbox/microsoft-reveals-new-details-on-its-project-helix-pc-console-hybrid-heres-all-the-latest-on-the-next-xbox">Microsoft reveals new details on its Project Helix PC-console hybrid: here's all the latest on the next Xbox</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ NVIDIA claims its new AI data centers use almost no water — here's what that actually means ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Training and running AI models requires <a href="https://www.tomsguide.com/ai/the-ai-boom-is-driving-up-electricity-bills-heres-what-you-need-to-know">enormous amounts of computing power</a>, and keeping those powerful chips cool often means consuming large amounts of water. It's become a growing source of concern as tech companies build <a href="https://www.tomsguide.com/ai/this-ai-data-center-will-be-bigger-than-2-000-walmarts-and-dump-23-atom-bombs-worth-of-energy-into-the-environment-every-day-and-locals-are-terrified">massive AI data centers </a>across the United States.</p><p>Now NVIDIA says it has a solution. The company recently unveiled a <a href="https://blogs.nvidia.com/blog/liquid-cooling-ai-factories/" target="_blank">new liquid-cooling system</a> designed for its next-generation AI infrastructure that it claims could reduce cooling water consumption to nearly zero in certain environments.</p><p> The announcement arrives as <a href="https://www.tomsguide.com/ai/i-kept-hearing-that-ai-data-centers-are-draining-towns-dry-so-i-looked-at-the-evidence">public scrutiny of AI's environmental footprint continues to grow</a>, with communities questioning whether new data centers are placing too much strain on local resources.</p><p>So what exactly is NVIDIA proposing, and does it really solve AI's water problem?</p><h2 id="why-ai-data-centers-use-so-much-water">Why AI data centers use so much water  </h2><p>AI systems run on specialized chips called <a href="https://www.tomsguide.com/news/the-top-gpus-just-fell-below-msrp-should-you-buy-now">GPUs</a>, many of which are <a href="https://www.tomsguide.com/computing/laptops/nvidia-is-returning-to-its-roots-with-new-laptop-chips-and-a-heavy-focus-on-gaming-but-will-it-be-enough-to-make-arm-cpus-a-viable-alternative">designed by NVIDIA</a>. These chips generate enormous amounts of heat when processing AI workloads.</p><p>Historically, many data centers have relied on cooling towers that use water evaporation to remove heat. While effective, the process can consume millions of gallons of water annually.</p><p>As AI models become larger and more powerful, <a href="https://www.lincolninst.edu/publications/land-lines-magazine/articles/land-water-impacts-data-centers/" target="_blank">cooling demands have increased alongside them</a>, turning water consumption into one of the most controversial aspects of the AI boom.</p><p>The issue has become especially sensitive in regions already facing water shortages or drought conditions.</p><h2 id="nvidia-s-new-approach">NVIDIA's new approach </h2><p>According to NVIDIA, its latest cooling system <a href="https://blogs.nvidia.com/blog/liquid-cooling-ai-factories/" target="_blank">circulates warm liquid directly around AI hardware at temperatures reaching approximately 45°C (113°F)</a>.</p><p>Rather than relying on traditional cooling towers, the warmer liquid can be paired with dry coolers, which function more like large radiators and do not require significant water consumption.</p><p>NVIDIA says this could <a href="https://blogs.nvidia.com/blog/liquid-cooling-ai-factories/">r</a>educe facility cooling water use from roughly 2.6 million gallons per megawatt annually to nearly zero in favorable climates.</p><p>The company also argues that operating at higher liquid temperatures improves overall energy efficiency while creating opportunities to reuse waste heat elsewhere.</p><p>In other words, NVIDIA's goal is o redesign the entire thermal management process around water conservation.</p><h2 id="the-important-caveat">The important caveat  </h2><p>The company's claims primarily address one specific category of water use: cooling. And while that matters, cooling isn't the only way AI consumes water. </p><p>Water is also used throughout the broader AI supply chain, including electricity generation, semiconductor manufacturing and data center construction.</p><p>Even if cooling water usage falls dramatically, AI systems still carry an environmental footprint beyond the walls of the data center itself.</p><p>Of course, there's also the question of scale. AI demand continues to grow at an extraordinary pace. Critics argue that <a href="https://www.tomshardware.com/tech-industry/ai-is-set-to-consume-up-to-600-billion-gallons-of-water-by-2030-rising-energy-consumption-primarily-to-blame-as-data-center-power-demands-rise" target="_blank">efficiency gains can sometimes be offset by rapid expansion</a>, meaning total resource consumption may continue rising even as individual facilities become more efficient.</p><h2 id="why-this-matters">Why this matters  </h2><p>The industry's largest companies are now under pressure to demonstrate that future AI growth can occur without placing unsustainable demands on water and energy resources. NVIDIA is not alone here — <a href="https://www.tomshardware.com/tech-industry/big-tech/microsoft-ceo-says-new-ai-data-centers-use-as-little-water-annually-as-a-restaurant-closed-loop-cooling-system-aims-to-slash-consumption-from-millions-of-gallons-as-ai-infrastructure-faces-mounting-environmental-scrutiny" target="_blank">Microsoft has made similar zero-water cooling claims</a> for its newest data centers.</p><p>NVIDIA isn't claiming that AI no longer has an environmental footprint. Instead, it's targeting one of the most visible concerns surrounding modern data centers: water-intensive cooling system</p><p>Whether NVIDIA's approach becomes the new standard remains to be seen, but it offers a glimpse of how the industry may attempt to address one of its most persistent criticisms.</p><a href="https://follow.it/articles-by-amanda-caswell-tom-s-guide?leanpub" class="button button--large button--primary">Follow Amanda Caswell and stay ahead of the AI curve</a><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/anthropic-will-pay-workers-usd85-000-to-learn-ai-and-it-reveals-the-next-big-ai-job-trend">Anthropic will pay workers $85,000 to learn AI — and it reveals the next big AI job trend</a></li><li><a href="https://www.tomsguide.com/ai/anthropics-fable-five-ban-exposed-ais-next-big-problem-but-sakanas-fugu-may-have-the-answer">Anthropic's Fable 5 ban exposed AI's next big problem — but Sakana's Fugu may have the answer</a></li><li><a href="https://www.tomsguide.com/ai/is-your-job-ai-resilient-find-your-risk-score-with-our-career-calculator">Is your job 'AI-resilient'? Find your risk score with our career calculator</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/ai/nvidia-claims-its-new-ai-data-centers-use-almost-no-water-heres-what-that-actually-means</link>
                                                                            <description>
                            <![CDATA[ NVIDIA says its new AI data centers can use almost no water thanks to advanced liquid cooling. Here's how the technology works and whether it really solves AI's growing environmental problem. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">7uh2GC6NaFEAuyXazX5Zp</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/JsjUeAN9AybsfyYfuATxUE-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 24 Jun 2026 18:45:30 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[AI]]></category>
                                                                                                <author><![CDATA[ amanda.caswell@futurenet.com (Amanda Caswell) ]]></author>                    <dc:creator><![CDATA[ Amanda Caswell ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/zYjevim2q7FjQiefqpjZRB.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/JsjUeAN9AybsfyYfuATxUE-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Nvidia]]></media:description>                                                            <media:text><![CDATA[Nvidia]]></media:text>
                                <media:title type="plain"><![CDATA[Nvidia]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/JsjUeAN9AybsfyYfuATxUE-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Training and running AI models requires <a href="https://www.tomsguide.com/ai/the-ai-boom-is-driving-up-electricity-bills-heres-what-you-need-to-know">enormous amounts of computing power</a>, and keeping those powerful chips cool often means consuming large amounts of water. It's become a growing source of concern as tech companies build <a href="https://www.tomsguide.com/ai/this-ai-data-center-will-be-bigger-than-2-000-walmarts-and-dump-23-atom-bombs-worth-of-energy-into-the-environment-every-day-and-locals-are-terrified">massive AI data centers </a>across the United States.</p><p>Now NVIDIA says it has a solution. The company recently unveiled a <a href="https://blogs.nvidia.com/blog/liquid-cooling-ai-factories/" target="_blank">new liquid-cooling system</a> designed for its next-generation AI infrastructure that it claims could reduce cooling water consumption to nearly zero in certain environments.</p><p> The announcement arrives as <a href="https://www.tomsguide.com/ai/i-kept-hearing-that-ai-data-centers-are-draining-towns-dry-so-i-looked-at-the-evidence">public scrutiny of AI's environmental footprint continues to grow</a>, with communities questioning whether new data centers are placing too much strain on local resources.</p><p>So what exactly is NVIDIA proposing, and does it really solve AI's water problem?</p><h2 id="why-ai-data-centers-use-so-much-water">Why AI data centers use so much water  </h2><p>AI systems run on specialized chips called <a href="https://www.tomsguide.com/news/the-top-gpus-just-fell-below-msrp-should-you-buy-now">GPUs</a>, many of which are <a href="https://www.tomsguide.com/computing/laptops/nvidia-is-returning-to-its-roots-with-new-laptop-chips-and-a-heavy-focus-on-gaming-but-will-it-be-enough-to-make-arm-cpus-a-viable-alternative">designed by NVIDIA</a>. These chips generate enormous amounts of heat when processing AI workloads.</p><p>Historically, many data centers have relied on cooling towers that use water evaporation to remove heat. While effective, the process can consume millions of gallons of water annually.</p><p>As AI models become larger and more powerful, <a href="https://www.lincolninst.edu/publications/land-lines-magazine/articles/land-water-impacts-data-centers/" target="_blank">cooling demands have increased alongside them</a>, turning water consumption into one of the most controversial aspects of the AI boom.</p><p>The issue has become especially sensitive in regions already facing water shortages or drought conditions.</p><h2 id="nvidia-s-new-approach">NVIDIA's new approach </h2><p>According to NVIDIA, its latest cooling system <a href="https://blogs.nvidia.com/blog/liquid-cooling-ai-factories/" target="_blank">circulates warm liquid directly around AI hardware at temperatures reaching approximately 45°C (113°F)</a>.</p><p>Rather than relying on traditional cooling towers, the warmer liquid can be paired with dry coolers, which function more like large radiators and do not require significant water consumption.</p><p>NVIDIA says this could <a href="https://blogs.nvidia.com/blog/liquid-cooling-ai-factories/">r</a>educe facility cooling water use from roughly 2.6 million gallons per megawatt annually to nearly zero in favorable climates.</p><p>The company also argues that operating at higher liquid temperatures improves overall energy efficiency while creating opportunities to reuse waste heat elsewhere.</p><p>In other words, NVIDIA's goal is o redesign the entire thermal management process around water conservation.</p><h2 id="the-important-caveat">The important caveat  </h2><p>The company's claims primarily address one specific category of water use: cooling. And while that matters, cooling isn't the only way AI consumes water. </p><p>Water is also used throughout the broader AI supply chain, including electricity generation, semiconductor manufacturing and data center construction.</p><p>Even if cooling water usage falls dramatically, AI systems still carry an environmental footprint beyond the walls of the data center itself.</p><p>Of course, there's also the question of scale. AI demand continues to grow at an extraordinary pace. Critics argue that <a href="https://www.tomshardware.com/tech-industry/ai-is-set-to-consume-up-to-600-billion-gallons-of-water-by-2030-rising-energy-consumption-primarily-to-blame-as-data-center-power-demands-rise" target="_blank">efficiency gains can sometimes be offset by rapid expansion</a>, meaning total resource consumption may continue rising even as individual facilities become more efficient.</p><h2 id="why-this-matters">Why this matters  </h2><p>The industry's largest companies are now under pressure to demonstrate that future AI growth can occur without placing unsustainable demands on water and energy resources. NVIDIA is not alone here — <a href="https://www.tomshardware.com/tech-industry/big-tech/microsoft-ceo-says-new-ai-data-centers-use-as-little-water-annually-as-a-restaurant-closed-loop-cooling-system-aims-to-slash-consumption-from-millions-of-gallons-as-ai-infrastructure-faces-mounting-environmental-scrutiny" target="_blank">Microsoft has made similar zero-water cooling claims</a> for its newest data centers.</p><p>NVIDIA isn't claiming that AI no longer has an environmental footprint. Instead, it's targeting one of the most visible concerns surrounding modern data centers: water-intensive cooling system</p><p>Whether NVIDIA's approach becomes the new standard remains to be seen, but it offers a glimpse of how the industry may attempt to address one of its most persistent criticisms.</p><a href="https://follow.it/articles-by-amanda-caswell-tom-s-guide?leanpub" class="button button--large button--primary">Follow Amanda Caswell and stay ahead of the AI curve</a><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/anthropic-will-pay-workers-usd85-000-to-learn-ai-and-it-reveals-the-next-big-ai-job-trend">Anthropic will pay workers $85,000 to learn AI — and it reveals the next big AI job trend</a></li><li><a href="https://www.tomsguide.com/ai/anthropics-fable-five-ban-exposed-ais-next-big-problem-but-sakanas-fugu-may-have-the-answer">Anthropic's Fable 5 ban exposed AI's next big problem — but Sakana's Fugu may have the answer</a></li><li><a href="https://www.tomsguide.com/ai/is-your-job-ai-resilient-find-your-risk-score-with-our-career-calculator">Is your job 'AI-resilient'? Find your risk score with our career calculator</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Here are some way-too-early Windows 12 predictions based on how Microsoft is changing Windows 11 ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Now that <a href="https://www.tomsguide.com/news/live/microsoft-build-2026">Microsoft Build 2026</a> is in the rearview, we have a much clearer picture of the <a href="https://www.tomsguide.com/computing/windows-operating-systems/the-future-of-windows-11-what-is-microsoft-building-next">future of Windows 11</a>. Agentic AI systems! Smart work ID badges! Always-on personal assistants! The path ahead for Microsoft’s current operating system will clearly feature AI in some form or fashion at every turn. But what about <a href="https://www.tomsguide.com/news/windows-12">Windows 12</a>?</p><p>Though it wasn’t a surprise that Microsoft didn’t announce its next OS during this year's Build keynote, we’d be amazed if work on Windows 12 hasn’t been motoring away in the background for quite some time over in Redmond. As such, we thought now would be an opportune time to speculate on a platform that will likely usher in a new era of AI integration. </p><p>Whether dealing with the petaflop power of the Surface RTX Spark Dev Box or the potentially paradigm-shifting Project Solara, AI agents will be run both locally and through the cloud to forge next-level hybrid computing on Windows 12. </p><p>But it’s not all about AI with our predictions for an OS we’re expecting in the not-too-distant future. The future of Xbox could also be intrinsically tied to Windows 12. With <a href="https://www.tomsguide.com/gaming/xbox/all-windows-based-handheld-gaming-consoles-are-getting-the-xbox-full-screen-experience-what-you-need-to-know">Xbox Mode continuing to bloom on Windows 11</a>, don’t be surprised if Microsoft commits hard to PC gaming going forward, with more focus on creating a UI that can truly compete with Steam. </p><p>Without further ado, let’s get into some Windows 12 predictions, even if it does seem ludicrously early to be making them.</p><h2 id="windows-12-will-be-all-about-ai">Windows 12 will be all about AI</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="dMwUdeVcgTcgchLUnQgpQ3" name="Microsoft Surface Laptop (2026)-5" alt="Microsoft Surface Laptop 8" src="https://cdn.mos.cms.futurecdn.net/dMwUdeVcgTcgchLUnQgpQ3.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Forget Copilot. The level of AI integration Windows 12 is going to embrace will be far more impactful than asking a digital assistant what the weather will be in a couple of hours. Microsoft’s new OS will have AI baked into its very core, with agentic systems that exhibit real autonomy handling the jobs you’d previously have done with apps. </p><p>This year’s Build made it clear that <a href="https://www.tomsguide.com/ai/a-guide-to-agentic-ai-how-windows-is-going-to-do-more-things-for-you">AI agents are a huge priority for Microsoft</a>. As much as they’re shaping the future of your current OS, the use of agentic systems will likely leap to a new level with Windows 12. </p><p>Just take <a href="https://www.microsoft.com/en-us/microsoft-365/blog/2026/06/02/introducing-microsoft-scout-your-always-on-personal-agent/">Microsoft Scout</a>. This new Autopilot AI agent acts as an always-on personal agent. Rather than needing to be prompted like Copilot, Scout uses the MAI-Thinking-1 reasoning model to act autonomously. As such, it learns how you work over time, quickly becoming aware of your routines in order to better service your needs on any given day. </p><p>By the time Windows 12 launches, Scout and similar agentic systems will have had plenty of time to percolate. When Microsoft’s next OS is out in the wild, we could be looking at a platform where AI runs far deeper than mere surface-level window dressing. The days of manually setting meetings or switching between spreadsheets and emails could be over, as AI agents like Scout take control of your workflow, autonomously handling tasks so that you can fully focus on the most important aspects of your job. </p><p>Essentially, Windows 12 is going to be an AI OS, one that could potentially transform the way you work. </p><h2 id="hybrid-computing-will-be-central-to-windows-12">Hybrid computing will be central to Windows 12</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="B7VDkWBHZGqQNifR89nryg" name="Project-Solara (credit Microsoft)" alt="Microsoft Build press images" src="https://cdn.mos.cms.futurecdn.net/B7VDkWBHZGqQNifR89nryg.jpg" mos="" align="middle" fullscreen="" width="1200" height="675" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>The era of AI PCs has been around for a while now, yet it looks like Windows 12 could fully realize the potential of AI, in part, by turning the focus more heavily on hybrid computing. In this future of Jaws 19, hoverboards and flying Deloreans, users won’t need to worry about whether tasks are running on their NPU, CPU or GPU. Instead, Windows 12’s AI-influenced OS will autonomously figure out where workloads should be handled. </p><p>This isn’t about Microsoft pitting cloud AI and local AI against each other. The future we envisage for Windows 12 is where hybrid workflows are commonplace, with AI agents running locally on the systems like the Spark Dev Box (which we’ll touch on shortly) and through the cloud, too. </p><p>Ideally, users won’t even know where tasks are running. Less demanding AI tasks may operate locally, while heavy duty rendering could be split up between hardware and cloud-based infrastructures. If Windows 12 fully embraces the concept of hybrid computing, the end result will hopefully be an OS that balances performance more efficiently, as tasks run discretely across local hardware and the cloud.</p><h2 id="ai-agents-will-replace-apps">AI agents will replace apps</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YsPaUc5ean2R2rGU87rDrg" name="Project-Solara-1" alt="Microsoft Build press images" src="https://cdn.mos.cms.futurecdn.net/YsPaUc5ean2R2rGU87rDrg.jpg" mos="" align="middle" fullscreen="" width="1200" height="675" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Much of the focus of this year’s Build centered around agentic systems. AI agents aren’t just the future of Windows, they’re the here and now. We’ve already touched on Microsoft Spark being rolled out to Frontier customers, and before too long <a href="https://commandline.microsoft.com/project-solara-build-2026/">Project Solara</a> will be upon this. </p><p>Built from the ground up on a Microsoft-tailored Android platform, the focus for Solara is on AI agents, not apps. Indeed, Solara seems keen to move away from traditional Windows hardware, instead taking the forms of a smart clock-like device and a work ID badge. The latter has been designed to assist users on the go, and it’s capable of recording notes before using AI to clean up audio that can then be sent to colleagues. It potentially represents a future of computing where you no longer need to be chained to a laptop to get work done. </p><p>Microsoft is clearly betting the farm on AI, and it’s entirely possible Windows 12 will be a heavily AI-assisted OS. Unlike past operating systems, AI agents will have far more importance than old-school apps. In this (potentially soon to be realized) future, your day will no longer be taken up by sifting through emails and spreadsheets. Rather, agentic systems will act as personal AI assistants, acting autonomously as they help declutter your workday to help you complete tasks more effortlessly and efficiently. </p><h2 id="windows-12-will-light-the-spark">Windows 12 will light the Spark</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rPdwCgeWPVoHuMhfpUNv5h" name="Microsoft-Build-2026 (credit Microsoft)" alt="Microsoft Build press images" src="https://cdn.mos.cms.futurecdn.net/rPdwCgeWPVoHuMhfpUNv5h.jpg" mos="" align="middle" fullscreen="" width="1200" height="675" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>There’s a line of thinking that’s easy to buy into following Microsoft's Build keynote: Windows 12 will be a “dev-first” OS. Now, Redmond isn’t suddenly going to forget regular consumers. But looking forward, it’s hard not to see the Big M being more focused on servicing developers' needs than at any other point in its history.</p><p>Enter the <a href="https://blogs.windows.com/devices/2026/06/02/building-the-next-generation-of-devices-for-developers-surface-rtx-spark-dev-box/">Surface RTX Spark Dev Box</a>. Initially shipping as a Windows 11 Pro mini PC that’s built around the Nvidia RTX Spark superchip, there’s no question more enhanced versions of this little rig will support Windows 12 in the future. Designed to support locally-based AI development, this is a box that has been built to service agentic workflows that eat up huge compute costs. Thankfully, the numbers suggest the Spark Dev Box will be more than capable of handling such tasks, as this dev-focused mini marvel gives users up to an astonishing 1 petaflop of AI compute and 128GB of unified memory. </p><p>Rocking the power of a combined Nvidia Blackwell RTX GPU and Nvidia Grace CPU, the Spark Dev Box can power 120B+ parameter models locally. And that last word really is key. Spark has been designed to service the most demanding<em> local</em> AI tasks, in turn taking the focus away from cloud-based AI pipelines. Spark feels like a test run for what the future of high-end Windows 12 devices will look like: a workstation where the emphasis is on locally supporting AI agents to give developers more control.</p><h2 id="xbox-mode-could-change-the-game">Xbox Mode could change the game</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:832px;"><p class="vanilla-image-block" style="padding-top:56.61%;"><img id="YdX6MSjaSYxj7PKuhgJzwN" name="Screenshot 2026-05-20 155209" alt="xbox" src="https://cdn.mos.cms.futurecdn.net/YdX6MSjaSYxj7PKuhgJzwN.png" mos="" align="middle" fullscreen="" width="832" height="471" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Getty Images)</span></figcaption></figure><p>Microsoft didn’t shine any light on its gaming endeavors during the dev-focused Build keynote, and that wasn’t a surprise. That doesn’t mean there aren’t big plans for the future of Xbox, particularly with how it ties into Windows 12 going forward. </p><p>With Phil Spencer gone, replaced by new Head of Xbox Asha Sharma, don’t be shocked if Microsoft’s gaming division goes through big changes in the next couple of years. We’ve known about <a href="https://www.tomsguide.com/gaming/xbox/microsoft-reveals-new-details-on-its-project-helix-pc-console-hybrid-heres-all-the-latest-on-the-next-xbox">Project Helix</a> for ages at this point. And with the next Xbox promising to bridge the gap between consoles and PCs like never before, how Windows 12 handles Microsoft games may look quite different to the way Windows 11 currently deals with Xbox titles.</p><p><a href="https://www.tomsguide.com/gaming/xbox/all-windows-based-handheld-gaming-consoles-are-getting-the-xbox-full-screen-experience-what-you-need-to-know">Xbox Full Screen Mode</a> rolled out on Windows not too long ago, giving gamers an experience that’s more in line with Steam’s Big Picture. As Xbox integration continues to evolve, it would make sense for Microsoft to double down on providing a more console-like OS for next-gen games. </p><p>As for what Xbox Mode on Windows 12 could look like, there’s a reasonable chance we could see a gaming-focused app that’s more deeply integrated with Microsoft’s next OS. Imagine a more streamlined platform that you could boot directly into as soon as you fire up your PC. One that uses fewer Windows background processes to provide an experience that’s every bit as seamless as Steam. </p><p>It seems clear the future of Xbox is more deeply tied to Windows than ever before. As rumors swirl suggesting Sony could soon stop releasing PS5 games on PC, next-gen Xbox titles could provide the most premium console-like experience on Windows 12.</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/windows-operating-systems/im-a-windows-user-and-these-are-5-upgrades-i-want-from-windows-12">I’m a Windows user — and these are 5 upgrades I want from Windows 12</a></li><li><a href="https://www.tomsguide.com/best-picks/best-computers">The 7 best computers in 2026: tested by experts</a></li><li><a href="https://www.tomsguide.com/computing/windows-operating-systems/15-top-windows-11-tips-everyone-needs-to-know">15 top Windows 11 tips everyone needs to know</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/windows-operating-systems/here-are-some-way-too-early-windows-12-predictions-based-on-how-microsoft-is-changing-windows-11</link>
                                                                            <description>
                            <![CDATA[ We might not see Windows 12 for a good while yet, but in the wake of Microsoft Build 2026, now seems like an ideal time to start speculating on Microsoft’s next OS. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">8VCE6ThwdjPdQXQLKCKEE7</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/43feUogzceEtWd5Y4KTf7e-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 21 Jun 2026 05:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Windows Operating Systems]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Software]]></category>
                                                    <category><![CDATA[Operating Systems]]></category>
                                                                                                <author><![CDATA[ dave.meikleham@futurenet.com (Dave Meikleham) ]]></author>                    <dc:creator><![CDATA[ Dave Meikleham ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/Rda8e7jGfyTdZLWYJQQ8VY.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Dave is a computing editor at Tom’s Guide and covers everything from cutting-edge laptops, the latest GPU tech, to ultrawide monitors. When he’s not worrying about dead pixels, Dave enjoys regularly rebuilding his PC for absolutely no reason at all. He built his first rig over 20 years ago, and he’s gone through more motherboards than he’s had hot dinners. Probably. &lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;In a previous life, he worked as a video game journalist during a career spanning the best part of two decades. Over that time he worked across both online and print, with bylines for GamesRadar+, PC Gamer, TechRadar, Edge and the Official UK PlayStation Magazine. He’s almost amassed an immeasurable amount of bad puns.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;An avid PC and console gamer, Dave enjoys breaking out Fraps way too often as he obsesses over frame rates. Despite owning a graphics card that costs roughly the same as your average used car, he still enjoys gaming on the go and is regularly glued to his Switch. Away from tech, most of Dave’s time is taken up by walking his husky, obsessing about his various OLED displays and sweating over the fitness of half a dozen Arsenal players on any given week.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <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/43feUogzceEtWd5Y4KTf7e-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[How to disable the Windows key]]></media:description>                                                            <media:text><![CDATA[How to disable the Windows key]]></media:text>
                                <media:title type="plain"><![CDATA[How to disable the Windows key]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/43feUogzceEtWd5Y4KTf7e-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Now that <a href="https://www.tomsguide.com/news/live/microsoft-build-2026">Microsoft Build 2026</a> is in the rearview, we have a much clearer picture of the <a href="https://www.tomsguide.com/computing/windows-operating-systems/the-future-of-windows-11-what-is-microsoft-building-next">future of Windows 11</a>. Agentic AI systems! Smart work ID badges! Always-on personal assistants! The path ahead for Microsoft’s current operating system will clearly feature AI in some form or fashion at every turn. But what about <a href="https://www.tomsguide.com/news/windows-12">Windows 12</a>?</p><p>Though it wasn’t a surprise that Microsoft didn’t announce its next OS during this year's Build keynote, we’d be amazed if work on Windows 12 hasn’t been motoring away in the background for quite some time over in Redmond. As such, we thought now would be an opportune time to speculate on a platform that will likely usher in a new era of AI integration. </p><p>Whether dealing with the petaflop power of the Surface RTX Spark Dev Box or the potentially paradigm-shifting Project Solara, AI agents will be run both locally and through the cloud to forge next-level hybrid computing on Windows 12. </p><p>But it’s not all about AI with our predictions for an OS we’re expecting in the not-too-distant future. The future of Xbox could also be intrinsically tied to Windows 12. With <a href="https://www.tomsguide.com/gaming/xbox/all-windows-based-handheld-gaming-consoles-are-getting-the-xbox-full-screen-experience-what-you-need-to-know">Xbox Mode continuing to bloom on Windows 11</a>, don’t be surprised if Microsoft commits hard to PC gaming going forward, with more focus on creating a UI that can truly compete with Steam. </p><p>Without further ado, let’s get into some Windows 12 predictions, even if it does seem ludicrously early to be making them.</p><h2 id="windows-12-will-be-all-about-ai">Windows 12 will be all about AI</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="dMwUdeVcgTcgchLUnQgpQ3" name="Microsoft Surface Laptop (2026)-5" alt="Microsoft Surface Laptop 8" src="https://cdn.mos.cms.futurecdn.net/dMwUdeVcgTcgchLUnQgpQ3.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Forget Copilot. The level of AI integration Windows 12 is going to embrace will be far more impactful than asking a digital assistant what the weather will be in a couple of hours. Microsoft’s new OS will have AI baked into its very core, with agentic systems that exhibit real autonomy handling the jobs you’d previously have done with apps. </p><p>This year’s Build made it clear that <a href="https://www.tomsguide.com/ai/a-guide-to-agentic-ai-how-windows-is-going-to-do-more-things-for-you">AI agents are a huge priority for Microsoft</a>. As much as they’re shaping the future of your current OS, the use of agentic systems will likely leap to a new level with Windows 12. </p><p>Just take <a href="https://www.microsoft.com/en-us/microsoft-365/blog/2026/06/02/introducing-microsoft-scout-your-always-on-personal-agent/">Microsoft Scout</a>. This new Autopilot AI agent acts as an always-on personal agent. Rather than needing to be prompted like Copilot, Scout uses the MAI-Thinking-1 reasoning model to act autonomously. As such, it learns how you work over time, quickly becoming aware of your routines in order to better service your needs on any given day. </p><p>By the time Windows 12 launches, Scout and similar agentic systems will have had plenty of time to percolate. When Microsoft’s next OS is out in the wild, we could be looking at a platform where AI runs far deeper than mere surface-level window dressing. The days of manually setting meetings or switching between spreadsheets and emails could be over, as AI agents like Scout take control of your workflow, autonomously handling tasks so that you can fully focus on the most important aspects of your job. </p><p>Essentially, Windows 12 is going to be an AI OS, one that could potentially transform the way you work. </p><h2 id="hybrid-computing-will-be-central-to-windows-12">Hybrid computing will be central to Windows 12</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="B7VDkWBHZGqQNifR89nryg" name="Project-Solara (credit Microsoft)" alt="Microsoft Build press images" src="https://cdn.mos.cms.futurecdn.net/B7VDkWBHZGqQNifR89nryg.jpg" mos="" align="middle" fullscreen="" width="1200" height="675" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>The era of AI PCs has been around for a while now, yet it looks like Windows 12 could fully realize the potential of AI, in part, by turning the focus more heavily on hybrid computing. In this future of Jaws 19, hoverboards and flying Deloreans, users won’t need to worry about whether tasks are running on their NPU, CPU or GPU. Instead, Windows 12’s AI-influenced OS will autonomously figure out where workloads should be handled. </p><p>This isn’t about Microsoft pitting cloud AI and local AI against each other. The future we envisage for Windows 12 is where hybrid workflows are commonplace, with AI agents running locally on the systems like the Spark Dev Box (which we’ll touch on shortly) and through the cloud, too. </p><p>Ideally, users won’t even know where tasks are running. Less demanding AI tasks may operate locally, while heavy duty rendering could be split up between hardware and cloud-based infrastructures. If Windows 12 fully embraces the concept of hybrid computing, the end result will hopefully be an OS that balances performance more efficiently, as tasks run discretely across local hardware and the cloud.</p><h2 id="ai-agents-will-replace-apps">AI agents will replace apps</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YsPaUc5ean2R2rGU87rDrg" name="Project-Solara-1" alt="Microsoft Build press images" src="https://cdn.mos.cms.futurecdn.net/YsPaUc5ean2R2rGU87rDrg.jpg" mos="" align="middle" fullscreen="" width="1200" height="675" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Much of the focus of this year’s Build centered around agentic systems. AI agents aren’t just the future of Windows, they’re the here and now. We’ve already touched on Microsoft Spark being rolled out to Frontier customers, and before too long <a href="https://commandline.microsoft.com/project-solara-build-2026/">Project Solara</a> will be upon this. </p><p>Built from the ground up on a Microsoft-tailored Android platform, the focus for Solara is on AI agents, not apps. Indeed, Solara seems keen to move away from traditional Windows hardware, instead taking the forms of a smart clock-like device and a work ID badge. The latter has been designed to assist users on the go, and it’s capable of recording notes before using AI to clean up audio that can then be sent to colleagues. It potentially represents a future of computing where you no longer need to be chained to a laptop to get work done. </p><p>Microsoft is clearly betting the farm on AI, and it’s entirely possible Windows 12 will be a heavily AI-assisted OS. Unlike past operating systems, AI agents will have far more importance than old-school apps. In this (potentially soon to be realized) future, your day will no longer be taken up by sifting through emails and spreadsheets. Rather, agentic systems will act as personal AI assistants, acting autonomously as they help declutter your workday to help you complete tasks more effortlessly and efficiently. </p><h2 id="windows-12-will-light-the-spark">Windows 12 will light the Spark</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rPdwCgeWPVoHuMhfpUNv5h" name="Microsoft-Build-2026 (credit Microsoft)" alt="Microsoft Build press images" src="https://cdn.mos.cms.futurecdn.net/rPdwCgeWPVoHuMhfpUNv5h.jpg" mos="" align="middle" fullscreen="" width="1200" height="675" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>There’s a line of thinking that’s easy to buy into following Microsoft's Build keynote: Windows 12 will be a “dev-first” OS. Now, Redmond isn’t suddenly going to forget regular consumers. But looking forward, it’s hard not to see the Big M being more focused on servicing developers' needs than at any other point in its history.</p><p>Enter the <a href="https://blogs.windows.com/devices/2026/06/02/building-the-next-generation-of-devices-for-developers-surface-rtx-spark-dev-box/">Surface RTX Spark Dev Box</a>. Initially shipping as a Windows 11 Pro mini PC that’s built around the Nvidia RTX Spark superchip, there’s no question more enhanced versions of this little rig will support Windows 12 in the future. Designed to support locally-based AI development, this is a box that has been built to service agentic workflows that eat up huge compute costs. Thankfully, the numbers suggest the Spark Dev Box will be more than capable of handling such tasks, as this dev-focused mini marvel gives users up to an astonishing 1 petaflop of AI compute and 128GB of unified memory. </p><p>Rocking the power of a combined Nvidia Blackwell RTX GPU and Nvidia Grace CPU, the Spark Dev Box can power 120B+ parameter models locally. And that last word really is key. Spark has been designed to service the most demanding<em> local</em> AI tasks, in turn taking the focus away from cloud-based AI pipelines. Spark feels like a test run for what the future of high-end Windows 12 devices will look like: a workstation where the emphasis is on locally supporting AI agents to give developers more control.</p><h2 id="xbox-mode-could-change-the-game">Xbox Mode could change the game</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:832px;"><p class="vanilla-image-block" style="padding-top:56.61%;"><img id="YdX6MSjaSYxj7PKuhgJzwN" name="Screenshot 2026-05-20 155209" alt="xbox" src="https://cdn.mos.cms.futurecdn.net/YdX6MSjaSYxj7PKuhgJzwN.png" mos="" align="middle" fullscreen="" width="832" height="471" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Getty Images)</span></figcaption></figure><p>Microsoft didn’t shine any light on its gaming endeavors during the dev-focused Build keynote, and that wasn’t a surprise. That doesn’t mean there aren’t big plans for the future of Xbox, particularly with how it ties into Windows 12 going forward. </p><p>With Phil Spencer gone, replaced by new Head of Xbox Asha Sharma, don’t be shocked if Microsoft’s gaming division goes through big changes in the next couple of years. We’ve known about <a href="https://www.tomsguide.com/gaming/xbox/microsoft-reveals-new-details-on-its-project-helix-pc-console-hybrid-heres-all-the-latest-on-the-next-xbox">Project Helix</a> for ages at this point. And with the next Xbox promising to bridge the gap between consoles and PCs like never before, how Windows 12 handles Microsoft games may look quite different to the way Windows 11 currently deals with Xbox titles.</p><p><a href="https://www.tomsguide.com/gaming/xbox/all-windows-based-handheld-gaming-consoles-are-getting-the-xbox-full-screen-experience-what-you-need-to-know">Xbox Full Screen Mode</a> rolled out on Windows not too long ago, giving gamers an experience that’s more in line with Steam’s Big Picture. As Xbox integration continues to evolve, it would make sense for Microsoft to double down on providing a more console-like OS for next-gen games. </p><p>As for what Xbox Mode on Windows 12 could look like, there’s a reasonable chance we could see a gaming-focused app that’s more deeply integrated with Microsoft’s next OS. Imagine a more streamlined platform that you could boot directly into as soon as you fire up your PC. One that uses fewer Windows background processes to provide an experience that’s every bit as seamless as Steam. </p><p>It seems clear the future of Xbox is more deeply tied to Windows than ever before. As rumors swirl suggesting Sony could soon stop releasing PS5 games on PC, next-gen Xbox titles could provide the most premium console-like experience on Windows 12.</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/windows-operating-systems/im-a-windows-user-and-these-are-5-upgrades-i-want-from-windows-12">I’m a Windows user — and these are 5 upgrades I want from Windows 12</a></li><li><a href="https://www.tomsguide.com/best-picks/best-computers">The 7 best computers in 2026: tested by experts</a></li><li><a href="https://www.tomsguide.com/computing/windows-operating-systems/15-top-windows-11-tips-everyone-needs-to-know">15 top Windows 11 tips everyone needs to know</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Latest Microsoft Surface devices are more expensive — but there’s some good news ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Microsoft’s latest Surface devices won’t be cheap. As <a href="https://www.windowscentral.com/hardware/surface/microsoft-unveils-surface-laptop-8-and-surface-pro-12-with-snapdragon-x2-chips-with-better-performance-and-battery-life-and-higher-price-tags-to-match" target="_blank">Windows Central</a> reports, consumer versions of the Surface Laptop 8 and Surface Pro 12 powered by Snapdragon X2 chips have just been unveiled. Though these models are more affordable than the current enterprise models powered by Intel, they still cost significantly more than their respective predecessors.</p><p>The Surface Laptop 8 starts at $1,599, while the Surface Pro 12 starts at $1,499. Those prices sting on their own, but it’s made worse when you consider that they both started at $999 in 2024. Yes, the new devices pack the more powerful <a href="https://www.tomsguide.com/computing/cpus/qualcomm-announces-snapdragon-x2-plus-cpus-at-ces-20265-and-it-promises-an-epic-upgrade">Snapdragon X2 Plus</a> chip and more storage, but their respective price tags still sting.</p><p>One saving grace is that Microsoft is offering incentives. For instance, buying the Surface Pro 12 between now and June 30 gets you a free Surface Pro keyboard. Preordering the Surface Laptop 8 gives you a free Surface Arc Mouse and a 50% offer for Microsoft Complete. The free keyboard with the Surface Pro is especially useful since it's essential for using the tablet like a laptop. You can also save up to $900 when trading in an older Surface device for a new one.</p><p>I reviewed the business model of the <a href="https://www.tomsguide.com/computing/laptops/the-new-microsoft-surface-laptop-8-is-great-but-its-hard-to-recommend-to-most-people">Surface Laptop 8</a> with an Intel Core Ultra X7 chip and found it to be an overall excellent, if expensive, notebook. I haven’t tested the Snapdragon X2 consumer model yet, but it has the same design as the Surface Laptop I reviewed. Microsoft says the new Surface devices offer 53% faster graphics performance over last gen, and up to 15 to 20 hours of battery life.</p><p>Thanks to the ongoing RAM crisis driving up the cost of electronics, I can’t say that I’m surprised that the latest Surface devices cost so much more than the 2024 models. This is a story we’ve seen over and over again this year. However, thanks to the incentives and freebies Microsoft is offering, you might save by choosing to upgrade. The consumer versions of the Surface devices are available now.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/cpus/snapdragon-x2-elite-vs-snapdragon-x-elite-heres-whats-new">Snapdragon X2 Elite vs Snapdragon X Elite: Here's what's new</a></li><li><a href="https://www.tomsguide.com/news/i-want-to-build-a-gaming-pc-but-i-wont-heres-why">I downsized to a mini PC years ago and I’ve never been happier</a></li><li><a href="https://www.tomsguide.com/computing/browsers/microsoft-is-killing-the-master-password-in-edge-browser-today-heres-how-it-will-work-now">Microsoft is killing the master password in Edge browser today</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/latest-microsoft-surface-devices-are-more-expensive-but-theres-some-good-news</link>
                                                                            <description>
                            <![CDATA[ The consumer versions of the Microsoft Surface Laptop 8 and Surface Pro 12 are now available for $600 and $500 more than 2024's models. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">zLjWM3MeyHmgmTJg3oX5Za</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/dMwUdeVcgTcgchLUnQgpQ3-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 16 Jun 2026 15:06:37 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Computing]]></category>
                                                                                                <author><![CDATA[ tony.polanco@futurenet.com (Tony Polanco) ]]></author>                    <dc:creator><![CDATA[ Tony Polanco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/atzRNqFt5wYgEUPBDahWsD.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/dMwUdeVcgTcgchLUnQgpQ3-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Microsoft Surface Laptop 8]]></media:description>                                                            <media:text><![CDATA[Microsoft Surface Laptop 8]]></media:text>
                                <media:title type="plain"><![CDATA[Microsoft Surface Laptop 8]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/dMwUdeVcgTcgchLUnQgpQ3-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Microsoft’s latest Surface devices won’t be cheap. As <a href="https://www.windowscentral.com/hardware/surface/microsoft-unveils-surface-laptop-8-and-surface-pro-12-with-snapdragon-x2-chips-with-better-performance-and-battery-life-and-higher-price-tags-to-match" target="_blank">Windows Central</a> reports, consumer versions of the Surface Laptop 8 and Surface Pro 12 powered by Snapdragon X2 chips have just been unveiled. Though these models are more affordable than the current enterprise models powered by Intel, they still cost significantly more than their respective predecessors.</p><p>The Surface Laptop 8 starts at $1,599, while the Surface Pro 12 starts at $1,499. Those prices sting on their own, but it’s made worse when you consider that they both started at $999 in 2024. Yes, the new devices pack the more powerful <a href="https://www.tomsguide.com/computing/cpus/qualcomm-announces-snapdragon-x2-plus-cpus-at-ces-20265-and-it-promises-an-epic-upgrade">Snapdragon X2 Plus</a> chip and more storage, but their respective price tags still sting.</p><p>One saving grace is that Microsoft is offering incentives. For instance, buying the Surface Pro 12 between now and June 30 gets you a free Surface Pro keyboard. Preordering the Surface Laptop 8 gives you a free Surface Arc Mouse and a 50% offer for Microsoft Complete. The free keyboard with the Surface Pro is especially useful since it's essential for using the tablet like a laptop. You can also save up to $900 when trading in an older Surface device for a new one.</p><p>I reviewed the business model of the <a href="https://www.tomsguide.com/computing/laptops/the-new-microsoft-surface-laptop-8-is-great-but-its-hard-to-recommend-to-most-people">Surface Laptop 8</a> with an Intel Core Ultra X7 chip and found it to be an overall excellent, if expensive, notebook. I haven’t tested the Snapdragon X2 consumer model yet, but it has the same design as the Surface Laptop I reviewed. Microsoft says the new Surface devices offer 53% faster graphics performance over last gen, and up to 15 to 20 hours of battery life.</p><p>Thanks to the ongoing RAM crisis driving up the cost of electronics, I can’t say that I’m surprised that the latest Surface devices cost so much more than the 2024 models. This is a story we’ve seen over and over again this year. However, thanks to the incentives and freebies Microsoft is offering, you might save by choosing to upgrade. The consumer versions of the Surface devices are available now.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/cpus/snapdragon-x2-elite-vs-snapdragon-x-elite-heres-whats-new">Snapdragon X2 Elite vs Snapdragon X Elite: Here's what's new</a></li><li><a href="https://www.tomsguide.com/news/i-want-to-build-a-gaming-pc-but-i-wont-heres-why">I downsized to a mini PC years ago and I’ve never been happier</a></li><li><a href="https://www.tomsguide.com/computing/browsers/microsoft-is-killing-the-master-password-in-edge-browser-today-heres-how-it-will-work-now">Microsoft is killing the master password in Edge browser today</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Xbox Games Showcase 2026 — all the news, reveals, and announcements at Microsoft’s biggest gaming event of the year ]]></title>
                                                                                                <dc:content><![CDATA[ <div class="live-content"><p>PlayStation has had its turn, and this weekend was time for Microsoft’s Xbox to take the spotlight. The Xbox Game Showcase 2026 promises the latest looks at upcoming games from Xbox Game Studios, alongside new reveals and trailers from some of the biggest franchises around. </p><p>The live-streamed event kicked off Sunday at <strong>10 a.m. PT / 1 p.m. ET / 6 p.m. BST</strong>, and if one Xbox gaming showcase wasn’t enough, it was immediately followed by the Gears of War: E-Day Direct, with plenty of new information on the upcoming shooter, which is set to release on October 6. Don’t worry if you couldn't watch; you can check out all the biggest announcements and reveal below. </p><p>Alongside Gears, we saw more from the new Fable game, a teaser for Persona 5, and Call of Duty: Modern Warfare 4 had a presence in a big way, as well as the Halo 1 remake. </p><h3 class="article-body__section" id="section-how-to-watch-xbox-games-showcase-2026"><span>How to watch Xbox Games Showcase 2026</span></h3><p><strong>Xbox Games Showcase 2026 + Gears of War: E-Day Direct takes place today (Sunday, June 7) at 10 a.m. PT / 1 p.m. ET / 6 p.m. BST</strong>. </p><p>You can watch the recording via <a href="https://www.youtube.com/user/xbox/hub" target="_blank" rel="nofollow">YouTube</a> or <a href="https://www.twitch.tv/xbox" target="_blank" rel="nofollow">Twitch</a>. </p><h3 class="article-body__section" id="section-live-updates"><span>LIVE UPDATES</span></h3></div><div class="live-content"><time datetime="2026-06-05T17:26:00+00:00">June 5, 2026 – 1:26 PM</time><h2 id="welcome">Welcome!</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:809px;"><p class="vanilla-image-block" style="padding-top:56.37%;"><img id="ztD9L9fCjfUCfPmL5bJ3qd" name="xbox-logo-2" alt="Xbox logo" src="https://cdn.mos.cms.futurecdn.net/ztD9L9fCjfUCfPmL5bJ3qd.jpg" mos="" align="middle" fullscreen="" width="809" height="456" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Good morning! Welcome to Tom's Guide's coverage of the Xbox Games Showcase 2026 + Gears of War: E-Day Direct (that's quite a mouthful). We'll have live updates covering all the new reveals and trailers in this live blog. If you're a passionate Xbox gamer, you won't want to miss this mammoth-sized live showcase. </p></div><div class="live-content"><time datetime="2026-06-07T12:53:18+00:00">June 7, 2026 – 8:53 AM</time><h2 id="halo-campaign-evolved-screenshots-leaked">Halo: Campaign Evolved screenshots leaked</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1591px;"><p class="vanilla-image-block" style="padding-top:56.00%;"><img id="EezZR3qYmZupsaCqA5mFCC" name="Screenshot 2026-06-07 074733" alt="A potential screenshot of Halo Campaign Evolved purportedly uploaded onto the Official Xbox Store page before it was taken down" src="https://cdn.mos.cms.futurecdn.net/EezZR3qYmZupsaCqA5mFCC.png" mos="" align="middle" fullscreen="" width="1591" height="891" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Reddit - tman2damax11)</span></figcaption></figure><p>There's been a surprising lack of leaks ahead of today's Xbox Games Showcase, but several screenshots of Halo: Campaign Evolved were captured on Xbox's official store page by some <a href="https://www.reddit.com/r/halo/comments/1txz5p3/new_campaign_evolved_screenshots_on_offical_xbox/" target="_blank" rel="nofollow">eagle-eyed Redditors</a> before being taken down. The screenshots give us a glimpse at Cortana's redesign, along with battles in space and redesigned brutes with beards. </p></div><div class="live-content"><time datetime="2026-06-07T13:28:48+00:00">June 7, 2026 – 9:28 AM</time><h2 id="persona-6-debut">Persona 6 debut?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="nd9dJHAZ725XoXfj3n7XtW" name="persona-4-golden-switch-key-art.jpg" alt="Persona 4 Golden keyart" src="https://cdn.mos.cms.futurecdn.net/nd9dJHAZ725XoXfj3n7XtW.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sega/Atlus)</span></figcaption></figure><p>Several leakers have suggested we could get a look at Persona 6 today, though with Atlus also expected to reveal a release date for Persona 4 Revival at the Xbox Games Showcase, I'm not too optimistic. Then again, that would be peak Atlus. </p></div><div class="live-content"><time datetime="2026-06-07T13:55:14+00:00">June 7, 2026 – 9:55 AM</time><h2 id="don-t-expect-any-next-gen-console-news">Don't expect any next-gen console news</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9CrPEvWMT7uSo2Df8jLCb4" name="TG_Xbox-Series-S_6.jpg" alt="Xbox Series S review" src="https://cdn.mos.cms.futurecdn.net/9CrPEvWMT7uSo2Df8jLCb4.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Games will be front and center at today's presentation (it is all called the Xbox Games Showcase, after all). But if you were getting your hopes up about new details on Xbox's next-gen console, codenamed Project Helix, I'm here to dash those. </p><p>"The focus here is on the games," Microsoft Studios boss Matt Booty said on the latest Xbox podcast (h/t <a href="https://www.gamespot.com/articles/xbox-showcase-wont-have-next-gen-helix-news/" target="_blank">Gamespot</a>). "There won’t be Helix news. Helix will not be in this showcase. We want to get everything about that right."</p></div><div class="live-content"><time datetime="2026-06-07T14:28:54+00:00">June 7, 2026 – 10:28 AM</time><h2 id="a-new-era-for-xbox">A new era for Xbox</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:66.67%;"><img id="4TEfwqu9hSy4uToJ2pRoDT" name="asha-sharma-matt-booty" alt="Asha Sharma, Xbox CEO" src="https://cdn.mos.cms.futurecdn.net/4TEfwqu9hSy4uToJ2pRoDT.jpg" mos="" align="middle" fullscreen="" width="1920" height="1280" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>The showcase will be the first under new CEO of Microsoft Gaming Asha Sharma, who took over for now-retired Xbox boss Phil Spencer in February. Though I don't have high hopes given the show's focus on games, I'd love to see her outline a clearer picture on Xbox's future. </p><p>Phil's vision of Xbox's next-gen console as a powerful PC-like machine for your living room sounds tailored toward a pretty niche audience, but with rising costs of, well, everything these days, more and more gamers are getting priced out. Will Xbox pivot to court a broader crowd or double down on what's rumors suggest could be a pricey next-gen console? </p></div><div class="live-content"><time datetime="2026-06-07T15:22:56+00:00">June 7, 2026 – 11:22 AM</time><h2 id="viva-pinata-revival">Viva Piñata revival?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="MfzFH53Lyf9DmE3VBYQ4f4" name="viva_pinata.jpg" alt="viva pinata" src="https://cdn.mos.cms.futurecdn.net/MfzFH53Lyf9DmE3VBYQ4f4.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Rare)</span></figcaption></figure><p>It's a long shot, but given the recent success of <a href="https://www.tomsguide.com/gaming/pokemon-pokopia-review">Pokopia</a>, I'd love to see Xbox revive its Viva Piñata series. We haven't gotten a new game since Viva Piñata: Trouble in Paradise way back in 2008. Cozy games have only gotten more popular since then, and I say it's time to bring it back with more piñatas, bigger gardens, and modern controls. </p></div><div class="live-content"><time datetime="2026-06-07T15:51:23+00:00">June 7, 2026 – 11:51 AM</time><h2 id="just-an-hour-to-go">Just an hour to 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:1463px;"><p class="vanilla-image-block" style="padding-top:56.19%;"><img id="BPMCHeUyeiLboyrWPkycAh" name="shutterstock_200244203.jpg" alt="Xbox press conference" src="https://cdn.mos.cms.futurecdn.net/BPMCHeUyeiLboyrWPkycAh.jpg" mos="" align="middle" fullscreen="" width="1463" height="822" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>The Xbox Games Showcase is almost here! In a little over an hour, the livestreamed event will kick off, giving us our first look at games like State of Decay 3, Halo: Campaign Evolved, and new Fable and Call of Duty games. </p></div><div class="live-content"><time datetime="2026-06-07T16:41:52+00:00">June 7, 2026 – 12:41 PM</time><h2 id="the-red-room-of-death">The red room of death</h2><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2063436867564184038"><p lang="en" dir="ltr">Tomorrow pic.twitter.com/yo7ITz5Bce<a href="https://twitter.com/cantworkitout/status/2063436867564184038">June 7, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>Yesterday Xbox CEO Asha Sharma <a href="https://x.com/asha_shar/status/2063436867564184038" target="_blank">shared a snapshot on X</a> of the in-person venue this year's showcase will take place at. It's giving off big "Twin Peaks" vibes to me. </p></div><div class="live-content"><time datetime="2026-06-07T16:58:03+00:00">June 7, 2026 – 12:58 PM</time><h2 id="here-we-go">Here we 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:1600px;"><p class="vanilla-image-block" style="padding-top:66.69%;"><img id="LJXjiq3GAJFvKccxRwNHmB" name="Xbox Games Showcase 26_BLOGHERO" alt="Xbox Games Showcase keyart image with a "Live" badge underneath Xbox logo" src="https://cdn.mos.cms.futurecdn.net/LJXjiq3GAJFvKccxRwNHmB.jpg" mos="" align="middle" fullscreen="" width="1600" height="1067" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>The Xbox Games Showcase is about to kick off! As a refresher for anyone just joining us, you can watch along via <a href="https://www.youtube.com/user/xbox/hub" target="_blank" rel="nofollow">YouTube</a> or <a href="https://www.twitch.tv/xbox" target="_blank" rel="nofollow">Twitch</a> when the event kicks off at the top of the hour. Gears of War: E-day will front and center, with its own Direct immediately following the showcase. Also expect to hear more about RPGs like Fable, Clockwork Revolution, and the Persona series as well as a statement of intent from Xbox's new leadership.</p></div><div class="live-content"><time datetime="2026-06-07T17:05:51+00:00">June 7, 2026 – 1:05 PM</time><h2 id="new-gameplay-trailer-for-gears-of-war-e-day">New gameplay trailer for Gears of War: E Day</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="high" data-lazy-src="https://www.youtube-nocookie.com/embed/y85lNvF3kVQ" allowfullscreen></iframe></div></div><p>I'm not surprised to see Xbox kick things off with gameplay footage of today's main event: Gears of War: E-Day. A lengthy shot of gameplay showed off combat as chaos erupts through the street. The carnage is every bit as gritty and bloody as expected of the series, complete with chainsaws galore. </p></div><div class="live-content"><time datetime="2026-06-07T17:10:12+00:00">June 7, 2026 – 1:10 PM</time><h2 id="the-age-of-xbox-exclusives-continues">The age of Xbox exclusives continues</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1024px;"><p class="vanilla-image-block" style="padding-top:66.70%;"><img id="kwJBZ2i4EdEyxmKQhN5hcS" name="asha-sharma-1024x683" alt="Asha Sharma, Xbox CEO" src="https://cdn.mos.cms.futurecdn.net/kwJBZ2i4EdEyxmKQhN5hcS.jpg" mos="" align="middle" fullscreen="" width="1024" height="683" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>The new CEO of Microsoft Gaming Asha Sharma revealed Xbox isn't done with console exclusives quite yet. After showing off some gameplay footage of Gears of War: E-Day, the exec announced it would be an Xbox exclusive when it comes out on October 6, 2026. Considering how many previously exclusive Xbox games have made their way to other consoles, it was unclear whether Xbox would continue making them or instead pivot to hedging its bets with wider releases. </p></div><div class="live-content"><time datetime="2026-06-07T17:14:39+00:00">June 7, 2026 – 1:14 PM</time><h2 id="fable-revival-looks-promising">Fable revival looks promising</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/3iW1i78zFvk" allowfullscreen></iframe></div></div><p>I love RPGs, but somehow never played the original Fable games so I wasn't too hyped for the series revival. After seeing the trailer, though, I'm excited. The writing made me laugh out loud, landing somewhere between Baldur's Gate 3 and Vox Machina with some well-placed F-bombs that actually landed rather than feeling forced. The combat looks stellar as well, with a weight that reminds me of the newer God of War games. Fable will hit store shelves on February 23, 2027. </p></div><div class="live-content"><time datetime="2026-06-07T17:20:45+00:00">June 7, 2026 – 1:20 PM</time><h2 id="halo-gets-space-battles">Halo gets space battles</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/G4sUx2nX5EQ" allowfullscreen></iframe></div></div><p>Three new missions are coming to Halo Campaign Evolved, the big remake of the first Halo, and Xbox showed off an exciting new addition in today's showcase: space flying missions and combat. The missions seem to be prequels to the original's campaign, with the voiceover promising a story "we haven't heard yet" that takes place "one year before the ring." Halo Campaign Evolved releases July 28, 2026. </p></div><div class="live-content"><time datetime="2026-06-07T17:22:38+00:00">June 7, 2026 – 1:22 PM</time><h2 id="resonance-a-plague-tale-legacy-up-next">Resonance: A Plague Tale Legacy up next</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/r0ufgnb1hWc" allowfullscreen></iframe></div></div><p>Resonance: A Plague Tale Legacy shifts the spotlight to Sophia in a prequel adventure. The combat and gameplay seems less horror and more Tomb Raider/Uncharted vibes with some of the ancient temples she's seen running through. It comes out August 27 across multiple platforms.</p></div><div class="live-content"><time datetime="2026-06-07T17:25:09+00:00">June 7, 2026 – 1:25 PM</time><h2 id="persona-4-revival-takes-the-stage">Persona 4 Revival takes the stage</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/1osdiOAkBKc" allowfullscreen></iframe></div></div><p>Take a trip to The Midnight Channel with our first real look at Persona 4 Revival. In the same vein as the Persona 3 Reload remake, the PS2 original looks way more detailed this time around with animated cut scenes, vibrant colors, and more detailed models. Atlus is also bringing over the Baton Pass mechanic from P3R for flashy, Persona 5-esque battles.</p><p>It's out Feb 18, 2027!</p></div><div class="live-content"><time datetime="2026-06-07T17:32:14+00:00">June 7, 2026 – 1:32 PM</time><h2 id="build-your-cult-in-join-us">Build your cult in Join Us</h2><p>Join Us from Wolf Haus Games has the graphics and multiplayer havoc of GTA 6 with the premise of Cult of the Lamb, and I'm here for it. In either single player and 4-person co-op you build your cult and convert followers to your cause while surviving giant tentacle monsters emerging from the Earth and other apocalyptic scenarios. The voice acting is on point too: "You better evaluate your life choices." </p></div><div class="live-content"><time datetime="2026-06-07T17:37:00+00:00">June 7, 2026 – 1:37 PM</time><h2 id="a-new-senua-game-on-the-horizon">A new Senua game on the horizon</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/91LAY9B6lUc" allowfullscreen></iframe></div></div><p>We got a look at some of the combat and gameplay for the third game in the Senua series, simply titled Senua, that's coming out next year. The combat has always been on the floaty side, but her hits landed with a satisfying weight and there seems to be plenty of environmental tools you can use in group fights. The trailer showed her kicking over a burning effigy to scatter her opponents.  </p></div><div class="live-content"><time datetime="2026-06-07T17:39:56+00:00">June 7, 2026 – 1:39 PM</time><h2 id="fallout-76-gets-some-new-goodies">Fallout 76 gets some new goodies</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/sRra38_3WC8" allowfullscreen></iframe></div></div><p>Bethesda up now with a Fallout 76 update with a seriously catchy jingle. The new Infestations update, which is available now, adds plenty of new baddies to mow through with your friends. And is that new power armor I see? Nice!</p></div><div class="live-content"><time datetime="2026-06-07T17:43:31+00:00">June 7, 2026 – 1:43 PM</time><h2 id="sega-s-crazy-taxi-revival-looks-sick">Sega's Crazy Taxi revival looks sick</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/ePi8tDdKuWw" allowfullscreen></iframe></div></div><p>As soon as I heard that "yeah, yeah, yeah, yeah, yeah" I was sat up. Sega's long in development Crazy Taxi revival finally has a name and a slick new trailer. The gameplay footage showed off even more insane antics as players pick up customers and zip around the city. Crazy Taxi World Tour comes out in 2027 across PS5, Xbox, and PC. </p></div><div class="live-content"><time datetime="2026-06-07T17:46:03+00:00">June 7, 2026 – 1:46 PM</time><h2 id="y-all-we-are-so-back">Y'all we are so back</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/1-INYU6FLgI" allowfullscreen></iframe></div></div><p>Xbox showed off a new Xbox model for the company's 25th anniversary, with a Y2K style I've been chomping at the bit to come back: Those colored see-through casings that were everywhere in the early aughts. The limited edition Xbox Series X25 comes out in November 2026, and while it's not clear if it'll sport any new specs, they nailed the design. </p></div><div class="live-content"><time datetime="2026-06-07T17:50:10+00:00">June 7, 2026 – 1:50 PM</time><h2 id="minecraft-dungeons-ii-gets-a-new-trailer">Minecraft Dungeons II gets a new trailer</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/VyZKYhM0Kv4" allowfullscreen></iframe></div></div><p>Mojang Studios returns with its next Minecraft thing, showing off players fighting through dungeons together in a world of blocky, Minecraft-style visuals. Minecraft Dungeons 2 is coming September 29.</p></div><div class="live-content"><time datetime="2026-06-07T17:54:53+00:00">June 7, 2026 – 1:54 PM</time><h2 id="the-thieves-guild-is-back">The Thieves Guild is back</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/3uFptAC22iQ" allowfullscreen></iframe></div></div><p>Some Elder Scrolls news, though not Elder Scrolls 6. Rather, the series' MMORPG entry, The Elder Scrolls Online, is getting a thieves guild expansion that takes players to the high seas and underwater in a hunt for glorious loot. Also making an appearance was Sheogorath, the Daedric prince of madness, and it sure looks like he got transported to Skyrim. The update is coming out July 8. </p></div><div class="live-content"><time datetime="2026-06-07T18:00:35+00:00">June 7, 2026 – 2:00 PM</time><h2 id="genderbent-castlevania-yes-please">Genderbent Castlevania, yes please</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/I1YYTbciSD8" allowfullscreen></iframe></div></div><p>To celebrate Castlevania's 40th anniversary, we got a new look at Castlevania: Belmont's Curse, a new 2D entry in the series. It looks to be a substantial entry in the series, complete with a sprawling castle map and powers like gravity-flipping and jumping inside a painting. It's coming out October 15, 2026. </p></div><div class="live-content"><time datetime="2026-06-07T18:04:00+00:00">June 7, 2026 – 2:04 PM</time><h2 id="persona-6-got-something">Persona 6 got...something</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/9lwef2jan-Q" allowfullscreen></iframe></div></div><p>Persona 6 made an appearance at today's showcase, though hardly a substantial one. Instead of any gameplay or a look at the new cast of characters, we got another green-tinged teaser, this time of a graveyard and a couple of collages of people with cut-up pictures. I'm sure it'll all make more sense once Atlus releases the first batch of trailers, which may not be for a while considering we still don't have a release date. </p></div><div class="live-content"><time datetime="2026-06-07T18:07:52+00:00">June 7, 2026 – 2:07 PM</time><h2 id="spyro-my-boy">Spyro, my boy!</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/vHFW16_mDbo" allowfullscreen></iframe></div></div><p>Would you look at that, Spyro's getting a revival! I loved the games as a kid, and the trailer showed off the iconic purple dragon and some new flight-based gameplay. Spyro: A Realm Beyond takes flight in spring 2027. </p></div><div class="live-content"><time datetime="2026-06-07T18:09:30+00:00">June 7, 2026 – 2:09 PM</time><h2 id="clockwork-revolution-confirmed-for-2027">Clockwork Revolution confirmed for 2027</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/6B5NUd6B9I4" allowfullscreen></iframe></div></div><p>inXile's steampunk RPG Clockwork Revolution finally has a release window, and it's 2027. In today's showcase, we got a look at some of the game's core characters and first-person environments. Also: a heist plot! All signs point to it being another Xbox exclusive. </p></div><div class="live-content"><time datetime="2026-06-07T18:14:16+00:00">June 7, 2026 – 2:14 PM</time><h2 id="new-look-at-cod-mw4">New look at CoD MW4</h2><p>Call of Duty Modern Warfare 4's new DMZ looks tense as hell, and the sound design is entirely too real in replicating bullets whizzing by your head. "Extract or die trying," we're reminded. CoD MW4 is out October 23 with an upcoming playtest set for July.</p></div><div class="live-content"><time datetime="2026-06-07T18:15:27+00:00">June 7, 2026 – 2:15 PM</time><h2 id="onto-the-gears-of-war-e-day-direct">Onto the Gears of War: E-Day Direct</h2><p>Studio head Mike Crump welcomes us to the Coalition as the Gears of War presentation kicks off with a bloody countdown. So stay tuned to learn more about the long-awaited prequel. </p></div><div class="live-content"><time datetime="2026-06-07T18:18:49+00:00">June 7, 2026 – 2:18 PM</time><h2 id="the-most-brutally-satisfying-gears-yet">'The most brutally satisfying Gears yet'</h2><p>The prequel heads back to Emergence Date, the catastrophic event that forever altered humanity’s fate and set the stage for the war-torn world players first encountered in the original game back in 2006. </p><p>Crump promises "the most brutally satisfying Gears yet." With the series leap to Unreal Engine 5, developer The Coalition revisited what made the series resonate in the first place. The team looked back to the iconic "Mad World" trailer for inspiration, seeing in it many of the themes that define the franchise. With the E-Day story, they saw it as the perfect chance to recapture that atmosphere with modern tech that finally allowed them to realize it on the scale they originally envisioned.</p><p>Built from the ground up, the game showcases seamless large-scale environments, ray-traced lighting, and real-time destruction for a dramatically reimagined look at the Gears universe while staying true to its roots.</p></div><div class="live-content"><time datetime="2026-06-07T18:22:45+00:00">June 7, 2026 – 2:22 PM</time><h2 id="reimagined-combat-and-movement">Reimagined combat and movement</h2><p>The team overhauled the game's movement with smoother transitions, a larger range of cover, and the ability to jump to open up the citywide battleground. You have more choice than ever to tackle each combat puzzle, which can take place across neighborhoods and through multiple floors of buildings. The team built out an extensive tool set for making the world feel lived in too. </p></div><div class="live-content"><time datetime="2026-06-07T18:28:16+00:00">June 7, 2026 – 2:28 PM</time><h2 id="e-holes-are-back">E holes are back</h2><p>The iconic emergence loop for spawning enemies, a core part of the Gears of War combat flow, returns in Gears of War: E-Day. Chippable cover across a range of textures also makes you feel like you're influencing the world. You'll watch "the fall of Kalona" in real time, and The Coalition demonstrated this with before and after shots of the destruction as the Locus overrun the city. </p></div><div class="live-content"><time datetime="2026-06-07T18:38:57+00:00">June 7, 2026 – 2:38 PM</time><h2 id="a-look-at-gears-co-op">A look at Gears co-op</h2><p>All four characters are playable, with two-player split-screen available locally. In PvP, maps are designed to feel like classic battles, with the added bonus of new traversal modes to build on the game's revamped movement system. There's also Foreword siege, a 12-player mode that focuses on defending Kalona co-operatively.</p></div><div class="live-content"><time datetime="2026-06-07T18:45:59+00:00">June 7, 2026 – 2:45 PM</time><h2 id="that-s-a-wrap">That's a wrap!</h2><p>The Xbox Games Showcase ended with a reel of everything we've seen throughout the show. What was your favorite announcement? Let us know in the comments!</p></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/news/live/xbox-games-showcase-2026-live-updates</link>
                                                                            <description>
                            <![CDATA[ Xbox Games Showcase returned for 2026, offering new reveals and trailers for some of the biggest upcoming games, including Fable 4, Gears of War: E-Day, Call of Duty Modern Warfare 4 and more. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">pxx48BQrf8Q9VvzdcApkMY</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/ZG3KHPUnLcUkqhGjJpVBkB-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 07 Jun 2026 12:21:27 +0000</pubDate>                                                                                                                                <updated>Sun, 07 Jun 2026 18:46:11 +0000</updated>
                                                                                                                                            <category><![CDATA[Xbox]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Alyse Stanley ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/BxNnQuBWRHqkv5xWZsjrjc.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Alyse Stanley is a news editor at Tom’s Guide, overseeing weekend coverage and writing about the latest in tech, gaming, and entertainment. Before Tom’s Guide, Alyse worked as an editor for the Washington Post’s sunsetted video game section, Launcher, where she also wrote about indie games you shouldn’t miss, how to tackle your gaming backlog, and all things Nintendo. She previously led Gizmodo’s weekend news desk covering breaking tech news and has written game reviews and features for outlets like Polygon, Unwinnable, and Rock, Paper, Shotgun. A recent Chicago-area transplant born and raised in Virginia, Alyse is a big fan of horror movies, cartoons, and roller skating. She&#039;s also a puzzle fan and can often be found contributing to the NYT Connections coverage on Tom&#039;s Guide &lt;/p&gt; ]]></dc:description>
                                                                                                        <dc:contributor><![CDATA[ Rory Mellon ]]></dc:contributor>
                                                                    <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/ZG3KHPUnLcUkqhGjJpVBkB-1280-80.jpg">
                                                            <media:credit><![CDATA[Microsoft]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Xbox Games Showcase keyart image with a &quot;Live&quot; badge underneath Xbox logo]]></media:description>                                                            <media:text><![CDATA[Xbox Games Showcase keyart image with a &quot;Live&quot; badge underneath Xbox logo]]></media:text>
                                <media:title type="plain"><![CDATA[Xbox Games Showcase keyart image with a &quot;Live&quot; badge underneath Xbox logo]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/ZG3KHPUnLcUkqhGjJpVBkB-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div class="live-content"><p>PlayStation has had its turn, and this weekend was time for Microsoft’s Xbox to take the spotlight. The Xbox Game Showcase 2026 promises the latest looks at upcoming games from Xbox Game Studios, alongside new reveals and trailers from some of the biggest franchises around. </p><p>The live-streamed event kicked off Sunday at <strong>10 a.m. PT / 1 p.m. ET / 6 p.m. BST</strong>, and if one Xbox gaming showcase wasn’t enough, it was immediately followed by the Gears of War: E-Day Direct, with plenty of new information on the upcoming shooter, which is set to release on October 6. Don’t worry if you couldn't watch; you can check out all the biggest announcements and reveal below. </p><p>Alongside Gears, we saw more from the new Fable game, a teaser for Persona 5, and Call of Duty: Modern Warfare 4 had a presence in a big way, as well as the Halo 1 remake. </p><h3 class="article-body__section" id="section-how-to-watch-xbox-games-showcase-2026"><span>How to watch Xbox Games Showcase 2026</span></h3><p><strong>Xbox Games Showcase 2026 + Gears of War: E-Day Direct takes place today (Sunday, June 7) at 10 a.m. PT / 1 p.m. ET / 6 p.m. BST</strong>. </p><p>You can watch the recording via <a href="https://www.youtube.com/user/xbox/hub" target="_blank" rel="nofollow">YouTube</a> or <a href="https://www.twitch.tv/xbox" target="_blank" rel="nofollow">Twitch</a>. </p><h3 class="article-body__section" id="section-live-updates"><span>LIVE UPDATES</span></h3></div><div class="live-content"><time datetime="2026-06-05T17:26:00+00:00">June 5, 2026 – 1:26 PM</time><h2 id="welcome">Welcome!</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:809px;"><p class="vanilla-image-block" style="padding-top:56.37%;"><img id="ztD9L9fCjfUCfPmL5bJ3qd" name="xbox-logo-2" alt="Xbox logo" src="https://cdn.mos.cms.futurecdn.net/ztD9L9fCjfUCfPmL5bJ3qd.jpg" mos="" align="middle" fullscreen="" width="809" height="456" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Good morning! Welcome to Tom's Guide's coverage of the Xbox Games Showcase 2026 + Gears of War: E-Day Direct (that's quite a mouthful). We'll have live updates covering all the new reveals and trailers in this live blog. If you're a passionate Xbox gamer, you won't want to miss this mammoth-sized live showcase. </p></div><div class="live-content"><time datetime="2026-06-07T12:53:18+00:00">June 7, 2026 – 8:53 AM</time><h2 id="halo-campaign-evolved-screenshots-leaked">Halo: Campaign Evolved screenshots leaked</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1591px;"><p class="vanilla-image-block" style="padding-top:56.00%;"><img id="EezZR3qYmZupsaCqA5mFCC" name="Screenshot 2026-06-07 074733" alt="A potential screenshot of Halo Campaign Evolved purportedly uploaded onto the Official Xbox Store page before it was taken down" src="https://cdn.mos.cms.futurecdn.net/EezZR3qYmZupsaCqA5mFCC.png" mos="" align="middle" fullscreen="" width="1591" height="891" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Reddit - tman2damax11)</span></figcaption></figure><p>There's been a surprising lack of leaks ahead of today's Xbox Games Showcase, but several screenshots of Halo: Campaign Evolved were captured on Xbox's official store page by some <a href="https://www.reddit.com/r/halo/comments/1txz5p3/new_campaign_evolved_screenshots_on_offical_xbox/" target="_blank" rel="nofollow">eagle-eyed Redditors</a> before being taken down. The screenshots give us a glimpse at Cortana's redesign, along with battles in space and redesigned brutes with beards. </p></div><div class="live-content"><time datetime="2026-06-07T13:28:48+00:00">June 7, 2026 – 9:28 AM</time><h2 id="persona-6-debut">Persona 6 debut?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="nd9dJHAZ725XoXfj3n7XtW" name="persona-4-golden-switch-key-art.jpg" alt="Persona 4 Golden keyart" src="https://cdn.mos.cms.futurecdn.net/nd9dJHAZ725XoXfj3n7XtW.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sega/Atlus)</span></figcaption></figure><p>Several leakers have suggested we could get a look at Persona 6 today, though with Atlus also expected to reveal a release date for Persona 4 Revival at the Xbox Games Showcase, I'm not too optimistic. Then again, that would be peak Atlus. </p></div><div class="live-content"><time datetime="2026-06-07T13:55:14+00:00">June 7, 2026 – 9:55 AM</time><h2 id="don-t-expect-any-next-gen-console-news">Don't expect any next-gen console news</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9CrPEvWMT7uSo2Df8jLCb4" name="TG_Xbox-Series-S_6.jpg" alt="Xbox Series S review" src="https://cdn.mos.cms.futurecdn.net/9CrPEvWMT7uSo2Df8jLCb4.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Games will be front and center at today's presentation (it is all called the Xbox Games Showcase, after all). But if you were getting your hopes up about new details on Xbox's next-gen console, codenamed Project Helix, I'm here to dash those. </p><p>"The focus here is on the games," Microsoft Studios boss Matt Booty said on the latest Xbox podcast (h/t <a href="https://www.gamespot.com/articles/xbox-showcase-wont-have-next-gen-helix-news/" target="_blank">Gamespot</a>). "There won’t be Helix news. Helix will not be in this showcase. We want to get everything about that right."</p></div><div class="live-content"><time datetime="2026-06-07T14:28:54+00:00">June 7, 2026 – 10:28 AM</time><h2 id="a-new-era-for-xbox">A new era for Xbox</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:66.67%;"><img id="4TEfwqu9hSy4uToJ2pRoDT" name="asha-sharma-matt-booty" alt="Asha Sharma, Xbox CEO" src="https://cdn.mos.cms.futurecdn.net/4TEfwqu9hSy4uToJ2pRoDT.jpg" mos="" align="middle" fullscreen="" width="1920" height="1280" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>The showcase will be the first under new CEO of Microsoft Gaming Asha Sharma, who took over for now-retired Xbox boss Phil Spencer in February. Though I don't have high hopes given the show's focus on games, I'd love to see her outline a clearer picture on Xbox's future. </p><p>Phil's vision of Xbox's next-gen console as a powerful PC-like machine for your living room sounds tailored toward a pretty niche audience, but with rising costs of, well, everything these days, more and more gamers are getting priced out. Will Xbox pivot to court a broader crowd or double down on what's rumors suggest could be a pricey next-gen console? </p></div><div class="live-content"><time datetime="2026-06-07T15:22:56+00:00">June 7, 2026 – 11:22 AM</time><h2 id="viva-pinata-revival">Viva Piñata revival?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="MfzFH53Lyf9DmE3VBYQ4f4" name="viva_pinata.jpg" alt="viva pinata" src="https://cdn.mos.cms.futurecdn.net/MfzFH53Lyf9DmE3VBYQ4f4.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Rare)</span></figcaption></figure><p>It's a long shot, but given the recent success of <a href="https://www.tomsguide.com/gaming/pokemon-pokopia-review">Pokopia</a>, I'd love to see Xbox revive its Viva Piñata series. We haven't gotten a new game since Viva Piñata: Trouble in Paradise way back in 2008. Cozy games have only gotten more popular since then, and I say it's time to bring it back with more piñatas, bigger gardens, and modern controls. </p></div><div class="live-content"><time datetime="2026-06-07T15:51:23+00:00">June 7, 2026 – 11:51 AM</time><h2 id="just-an-hour-to-go">Just an hour to 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:1463px;"><p class="vanilla-image-block" style="padding-top:56.19%;"><img id="BPMCHeUyeiLboyrWPkycAh" name="shutterstock_200244203.jpg" alt="Xbox press conference" src="https://cdn.mos.cms.futurecdn.net/BPMCHeUyeiLboyrWPkycAh.jpg" mos="" align="middle" fullscreen="" width="1463" height="822" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>The Xbox Games Showcase is almost here! In a little over an hour, the livestreamed event will kick off, giving us our first look at games like State of Decay 3, Halo: Campaign Evolved, and new Fable and Call of Duty games. </p></div><div class="live-content"><time datetime="2026-06-07T16:41:52+00:00">June 7, 2026 – 12:41 PM</time><h2 id="the-red-room-of-death">The red room of death</h2><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2063436867564184038"><p lang="en" dir="ltr">Tomorrow pic.twitter.com/yo7ITz5Bce<a href="https://twitter.com/cantworkitout/status/2063436867564184038">June 7, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>Yesterday Xbox CEO Asha Sharma <a href="https://x.com/asha_shar/status/2063436867564184038" target="_blank">shared a snapshot on X</a> of the in-person venue this year's showcase will take place at. It's giving off big "Twin Peaks" vibes to me. </p></div><div class="live-content"><time datetime="2026-06-07T16:58:03+00:00">June 7, 2026 – 12:58 PM</time><h2 id="here-we-go">Here we 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:1600px;"><p class="vanilla-image-block" style="padding-top:66.69%;"><img id="LJXjiq3GAJFvKccxRwNHmB" name="Xbox Games Showcase 26_BLOGHERO" alt="Xbox Games Showcase keyart image with a "Live" badge underneath Xbox logo" src="https://cdn.mos.cms.futurecdn.net/LJXjiq3GAJFvKccxRwNHmB.jpg" mos="" align="middle" fullscreen="" width="1600" height="1067" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>The Xbox Games Showcase is about to kick off! As a refresher for anyone just joining us, you can watch along via <a href="https://www.youtube.com/user/xbox/hub" target="_blank" rel="nofollow">YouTube</a> or <a href="https://www.twitch.tv/xbox" target="_blank" rel="nofollow">Twitch</a> when the event kicks off at the top of the hour. Gears of War: E-day will front and center, with its own Direct immediately following the showcase. Also expect to hear more about RPGs like Fable, Clockwork Revolution, and the Persona series as well as a statement of intent from Xbox's new leadership.</p></div><div class="live-content"><time datetime="2026-06-07T17:05:51+00:00">June 7, 2026 – 1:05 PM</time><h2 id="new-gameplay-trailer-for-gears-of-war-e-day">New gameplay trailer for Gears of War: E Day</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="high" data-lazy-src="https://www.youtube-nocookie.com/embed/y85lNvF3kVQ" allowfullscreen></iframe></div></div><p>I'm not surprised to see Xbox kick things off with gameplay footage of today's main event: Gears of War: E-Day. A lengthy shot of gameplay showed off combat as chaos erupts through the street. The carnage is every bit as gritty and bloody as expected of the series, complete with chainsaws galore. </p></div><div class="live-content"><time datetime="2026-06-07T17:10:12+00:00">June 7, 2026 – 1:10 PM</time><h2 id="the-age-of-xbox-exclusives-continues">The age of Xbox exclusives continues</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1024px;"><p class="vanilla-image-block" style="padding-top:66.70%;"><img id="kwJBZ2i4EdEyxmKQhN5hcS" name="asha-sharma-1024x683" alt="Asha Sharma, Xbox CEO" src="https://cdn.mos.cms.futurecdn.net/kwJBZ2i4EdEyxmKQhN5hcS.jpg" mos="" align="middle" fullscreen="" width="1024" height="683" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>The new CEO of Microsoft Gaming Asha Sharma revealed Xbox isn't done with console exclusives quite yet. After showing off some gameplay footage of Gears of War: E-Day, the exec announced it would be an Xbox exclusive when it comes out on October 6, 2026. Considering how many previously exclusive Xbox games have made their way to other consoles, it was unclear whether Xbox would continue making them or instead pivot to hedging its bets with wider releases. </p></div><div class="live-content"><time datetime="2026-06-07T17:14:39+00:00">June 7, 2026 – 1:14 PM</time><h2 id="fable-revival-looks-promising">Fable revival looks promising</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/3iW1i78zFvk" allowfullscreen></iframe></div></div><p>I love RPGs, but somehow never played the original Fable games so I wasn't too hyped for the series revival. After seeing the trailer, though, I'm excited. The writing made me laugh out loud, landing somewhere between Baldur's Gate 3 and Vox Machina with some well-placed F-bombs that actually landed rather than feeling forced. The combat looks stellar as well, with a weight that reminds me of the newer God of War games. Fable will hit store shelves on February 23, 2027. </p></div><div class="live-content"><time datetime="2026-06-07T17:20:45+00:00">June 7, 2026 – 1:20 PM</time><h2 id="halo-gets-space-battles">Halo gets space battles</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/G4sUx2nX5EQ" allowfullscreen></iframe></div></div><p>Three new missions are coming to Halo Campaign Evolved, the big remake of the first Halo, and Xbox showed off an exciting new addition in today's showcase: space flying missions and combat. The missions seem to be prequels to the original's campaign, with the voiceover promising a story "we haven't heard yet" that takes place "one year before the ring." Halo Campaign Evolved releases July 28, 2026. </p></div><div class="live-content"><time datetime="2026-06-07T17:22:38+00:00">June 7, 2026 – 1:22 PM</time><h2 id="resonance-a-plague-tale-legacy-up-next">Resonance: A Plague Tale Legacy up next</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/r0ufgnb1hWc" allowfullscreen></iframe></div></div><p>Resonance: A Plague Tale Legacy shifts the spotlight to Sophia in a prequel adventure. The combat and gameplay seems less horror and more Tomb Raider/Uncharted vibes with some of the ancient temples she's seen running through. It comes out August 27 across multiple platforms.</p></div><div class="live-content"><time datetime="2026-06-07T17:25:09+00:00">June 7, 2026 – 1:25 PM</time><h2 id="persona-4-revival-takes-the-stage">Persona 4 Revival takes the stage</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/1osdiOAkBKc" allowfullscreen></iframe></div></div><p>Take a trip to The Midnight Channel with our first real look at Persona 4 Revival. In the same vein as the Persona 3 Reload remake, the PS2 original looks way more detailed this time around with animated cut scenes, vibrant colors, and more detailed models. Atlus is also bringing over the Baton Pass mechanic from P3R for flashy, Persona 5-esque battles.</p><p>It's out Feb 18, 2027!</p></div><div class="live-content"><time datetime="2026-06-07T17:32:14+00:00">June 7, 2026 – 1:32 PM</time><h2 id="build-your-cult-in-join-us">Build your cult in Join Us</h2><p>Join Us from Wolf Haus Games has the graphics and multiplayer havoc of GTA 6 with the premise of Cult of the Lamb, and I'm here for it. In either single player and 4-person co-op you build your cult and convert followers to your cause while surviving giant tentacle monsters emerging from the Earth and other apocalyptic scenarios. The voice acting is on point too: "You better evaluate your life choices." </p></div><div class="live-content"><time datetime="2026-06-07T17:37:00+00:00">June 7, 2026 – 1:37 PM</time><h2 id="a-new-senua-game-on-the-horizon">A new Senua game on the horizon</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/91LAY9B6lUc" allowfullscreen></iframe></div></div><p>We got a look at some of the combat and gameplay for the third game in the Senua series, simply titled Senua, that's coming out next year. The combat has always been on the floaty side, but her hits landed with a satisfying weight and there seems to be plenty of environmental tools you can use in group fights. The trailer showed her kicking over a burning effigy to scatter her opponents.  </p></div><div class="live-content"><time datetime="2026-06-07T17:39:56+00:00">June 7, 2026 – 1:39 PM</time><h2 id="fallout-76-gets-some-new-goodies">Fallout 76 gets some new goodies</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/sRra38_3WC8" allowfullscreen></iframe></div></div><p>Bethesda up now with a Fallout 76 update with a seriously catchy jingle. The new Infestations update, which is available now, adds plenty of new baddies to mow through with your friends. And is that new power armor I see? Nice!</p></div><div class="live-content"><time datetime="2026-06-07T17:43:31+00:00">June 7, 2026 – 1:43 PM</time><h2 id="sega-s-crazy-taxi-revival-looks-sick">Sega's Crazy Taxi revival looks sick</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/ePi8tDdKuWw" allowfullscreen></iframe></div></div><p>As soon as I heard that "yeah, yeah, yeah, yeah, yeah" I was sat up. Sega's long in development Crazy Taxi revival finally has a name and a slick new trailer. The gameplay footage showed off even more insane antics as players pick up customers and zip around the city. Crazy Taxi World Tour comes out in 2027 across PS5, Xbox, and PC. </p></div><div class="live-content"><time datetime="2026-06-07T17:46:03+00:00">June 7, 2026 – 1:46 PM</time><h2 id="y-all-we-are-so-back">Y'all we are so back</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/1-INYU6FLgI" allowfullscreen></iframe></div></div><p>Xbox showed off a new Xbox model for the company's 25th anniversary, with a Y2K style I've been chomping at the bit to come back: Those colored see-through casings that were everywhere in the early aughts. The limited edition Xbox Series X25 comes out in November 2026, and while it's not clear if it'll sport any new specs, they nailed the design. </p></div><div class="live-content"><time datetime="2026-06-07T17:50:10+00:00">June 7, 2026 – 1:50 PM</time><h2 id="minecraft-dungeons-ii-gets-a-new-trailer">Minecraft Dungeons II gets a new trailer</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/VyZKYhM0Kv4" allowfullscreen></iframe></div></div><p>Mojang Studios returns with its next Minecraft thing, showing off players fighting through dungeons together in a world of blocky, Minecraft-style visuals. Minecraft Dungeons 2 is coming September 29.</p></div><div class="live-content"><time datetime="2026-06-07T17:54:53+00:00">June 7, 2026 – 1:54 PM</time><h2 id="the-thieves-guild-is-back">The Thieves Guild is back</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/3uFptAC22iQ" allowfullscreen></iframe></div></div><p>Some Elder Scrolls news, though not Elder Scrolls 6. Rather, the series' MMORPG entry, The Elder Scrolls Online, is getting a thieves guild expansion that takes players to the high seas and underwater in a hunt for glorious loot. Also making an appearance was Sheogorath, the Daedric prince of madness, and it sure looks like he got transported to Skyrim. The update is coming out July 8. </p></div><div class="live-content"><time datetime="2026-06-07T18:00:35+00:00">June 7, 2026 – 2:00 PM</time><h2 id="genderbent-castlevania-yes-please">Genderbent Castlevania, yes please</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/I1YYTbciSD8" allowfullscreen></iframe></div></div><p>To celebrate Castlevania's 40th anniversary, we got a new look at Castlevania: Belmont's Curse, a new 2D entry in the series. It looks to be a substantial entry in the series, complete with a sprawling castle map and powers like gravity-flipping and jumping inside a painting. It's coming out October 15, 2026. </p></div><div class="live-content"><time datetime="2026-06-07T18:04:00+00:00">June 7, 2026 – 2:04 PM</time><h2 id="persona-6-got-something">Persona 6 got...something</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/9lwef2jan-Q" allowfullscreen></iframe></div></div><p>Persona 6 made an appearance at today's showcase, though hardly a substantial one. Instead of any gameplay or a look at the new cast of characters, we got another green-tinged teaser, this time of a graveyard and a couple of collages of people with cut-up pictures. I'm sure it'll all make more sense once Atlus releases the first batch of trailers, which may not be for a while considering we still don't have a release date. </p></div><div class="live-content"><time datetime="2026-06-07T18:07:52+00:00">June 7, 2026 – 2:07 PM</time><h2 id="spyro-my-boy">Spyro, my boy!</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/vHFW16_mDbo" allowfullscreen></iframe></div></div><p>Would you look at that, Spyro's getting a revival! I loved the games as a kid, and the trailer showed off the iconic purple dragon and some new flight-based gameplay. Spyro: A Realm Beyond takes flight in spring 2027. </p></div><div class="live-content"><time datetime="2026-06-07T18:09:30+00:00">June 7, 2026 – 2:09 PM</time><h2 id="clockwork-revolution-confirmed-for-2027">Clockwork Revolution confirmed for 2027</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/6B5NUd6B9I4" allowfullscreen></iframe></div></div><p>inXile's steampunk RPG Clockwork Revolution finally has a release window, and it's 2027. In today's showcase, we got a look at some of the game's core characters and first-person environments. Also: a heist plot! All signs point to it being another Xbox exclusive. </p></div><div class="live-content"><time datetime="2026-06-07T18:14:16+00:00">June 7, 2026 – 2:14 PM</time><h2 id="new-look-at-cod-mw4">New look at CoD MW4</h2><p>Call of Duty Modern Warfare 4's new DMZ looks tense as hell, and the sound design is entirely too real in replicating bullets whizzing by your head. "Extract or die trying," we're reminded. CoD MW4 is out October 23 with an upcoming playtest set for July.</p></div><div class="live-content"><time datetime="2026-06-07T18:15:27+00:00">June 7, 2026 – 2:15 PM</time><h2 id="onto-the-gears-of-war-e-day-direct">Onto the Gears of War: E-Day Direct</h2><p>Studio head Mike Crump welcomes us to the Coalition as the Gears of War presentation kicks off with a bloody countdown. So stay tuned to learn more about the long-awaited prequel. </p></div><div class="live-content"><time datetime="2026-06-07T18:18:49+00:00">June 7, 2026 – 2:18 PM</time><h2 id="the-most-brutally-satisfying-gears-yet">'The most brutally satisfying Gears yet'</h2><p>The prequel heads back to Emergence Date, the catastrophic event that forever altered humanity’s fate and set the stage for the war-torn world players first encountered in the original game back in 2006. </p><p>Crump promises "the most brutally satisfying Gears yet." With the series leap to Unreal Engine 5, developer The Coalition revisited what made the series resonate in the first place. The team looked back to the iconic "Mad World" trailer for inspiration, seeing in it many of the themes that define the franchise. With the E-Day story, they saw it as the perfect chance to recapture that atmosphere with modern tech that finally allowed them to realize it on the scale they originally envisioned.</p><p>Built from the ground up, the game showcases seamless large-scale environments, ray-traced lighting, and real-time destruction for a dramatically reimagined look at the Gears universe while staying true to its roots.</p></div><div class="live-content"><time datetime="2026-06-07T18:22:45+00:00">June 7, 2026 – 2:22 PM</time><h2 id="reimagined-combat-and-movement">Reimagined combat and movement</h2><p>The team overhauled the game's movement with smoother transitions, a larger range of cover, and the ability to jump to open up the citywide battleground. You have more choice than ever to tackle each combat puzzle, which can take place across neighborhoods and through multiple floors of buildings. The team built out an extensive tool set for making the world feel lived in too. </p></div><div class="live-content"><time datetime="2026-06-07T18:28:16+00:00">June 7, 2026 – 2:28 PM</time><h2 id="e-holes-are-back">E holes are back</h2><p>The iconic emergence loop for spawning enemies, a core part of the Gears of War combat flow, returns in Gears of War: E-Day. Chippable cover across a range of textures also makes you feel like you're influencing the world. You'll watch "the fall of Kalona" in real time, and The Coalition demonstrated this with before and after shots of the destruction as the Locus overrun the city. </p></div><div class="live-content"><time datetime="2026-06-07T18:38:57+00:00">June 7, 2026 – 2:38 PM</time><h2 id="a-look-at-gears-co-op">A look at Gears co-op</h2><p>All four characters are playable, with two-player split-screen available locally. In PvP, maps are designed to feel like classic battles, with the added bonus of new traversal modes to build on the game's revamped movement system. There's also Foreword siege, a 12-player mode that focuses on defending Kalona co-operatively.</p></div><div class="live-content"><time datetime="2026-06-07T18:45:59+00:00">June 7, 2026 – 2:45 PM</time><h2 id="that-s-a-wrap">That's a wrap!</h2><p>The Xbox Games Showcase ended with a reel of everything we've seen throughout the show. What was your favorite announcement? Let us know in the comments!</p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Windows laptops are entering their MacBook Neo era, but is Windows 11 actually ready for it? 8GB of RAM has me worried ]]></title>
                                                                                                <dc:content><![CDATA[ <p>One thing was clear at <a href="https://www.tomsguide.com/computing/best-of-computex-2026">Computex 2026</a>: every laptop maker is terrified of the <a href="https://www.tomsguide.com/computing/macbooks/apple-macbook-neo-review">MacBook Neo</a>, and they’re <a href="https://www.tomsguide.com/computing/laptops/forget-the-macbook-neo-these-4-windows-laptops-are-just-as-powerful">fighting back in a big way</a>. But I’m worried about whether Windows 11 is <em>actually </em>ready for this shift.</p><p>A $599 machine powered by an A18 Pro chip, Apple has essentially forced the hands of PC manufacturers who had gotten far too comfortable giving us mid systems at this price. But I’m glad the Neo-shaped earthquake has shaken up some change here. The <a href="https://www.tomsguide.com/computing/laptops/i-held-the-macbook-neo-in-one-hand-and-the-new-xps-13-in-the-other-and-dells-affordable-laptop-is-surprisingly-lighter">new Dell XPS 13</a> is looking mighty tasty at that lower price, but with better I/O and a touchscreen display, alongside that aluminum body.</p><p>But there’s a big Windows 11-related question here, because as <a href="https://www.tomsguide.com/computing/macbooks/windows-fans-say-macbook-neos-8gb-ram-is-ridiculous-so-i-tested-it-and-the-results-are-shocking">I found out testing it</a>, the way it's built makes it quite RAM hungry. I caught it using nearly 3X more memory than macOS, and with all the new features announced at <a href="https://www.tomsguide.com/news/live/microsoft-build-2026">Microsoft Build</a>, things could get worse.</p><div ><table><thead><tr><th class="firstcol " ><p><strong>Laptop</strong></p></th><th  ><p>MacBook Neo</p></th><th  ><p>Asus ProArt GoPro Edition</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Google Chrome + 20 Tabs RAM usage</strong></p></td><td  ><p>1.67 GB</p></td><td  ><p>4.76 GB</p></td></tr><tr><td class="firstcol " ><p><strong>Adobe Photoshop RAM usage</strong></p></td><td  ><p>3.86 GB</p></td><td  ><p>3.85 GB</p></td></tr><tr><td class="firstcol " ><p><strong>Apple Music RAM usage</strong></p></td><td  ><p>157.6 MB</p></td><td  ><p>239.1 MB</p></td></tr><tr><td class="firstcol " ><p><strong>System memory usage TOTAL</strong></p></td><td  ><p><strong>7.24 GB</strong></p></td><td  ><p><strong>27.1 GB</strong></p></td></tr></tbody></table></div><p>So while it’s all fair and good in the world of RAMageddon to shift to 8GB (not something I like to see, but something that is necessary given the insane pricing), Windows has to follow suit and trim some of the fat. Here are some ideas.</p><h2 id="give-me-a-compact-mode">Give me a compact mode</h2><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="hqB3iMGH3DpBcLNjw8SSJX" name="Asus ProArt GoPro Edition (PX13)" alt="Asus ProArt GoPro Edition (PX13)" src="https://cdn.mos.cms.futurecdn.net/hqB3iMGH3DpBcLNjw8SSJX.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>Right now, Windows 11 treats a $600 8GB thin-and-light the same way it treats a $3,000 workstation with 64GB of RAM. Yes, the OS’ memory management can be highly dynamic, but the core fundamentals take around 6GB, and the system aggressively caches background apps, so as to not waste any unused RAM.</p><p>This may work if you have a ton of memory, but we’re not in that world at the moment and every precious bit is sacred. So what we need is a modular, adaptive OS shell. If Windows 11 detects 8GB, it should trigger an aggressive “Compact mode” right out of the box to throttle background tasks, pause any non-essential tasks and prioritize anything active in the foreground.</p><h2 id="kill-the-widget-and-web-overhear">Kill the “widget and web” overhear</h2><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="9hJiHSP3dYfHR6gQC88xu5" name="MSI Modern 14S AI+" alt="MSI Modern 14S AI+" src="https://cdn.mos.cms.futurecdn.net/9hJiHSP3dYfHR6gQC88xu5.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>There’s this thing called WebView 2, which is actually the culprit behind some of the most unnecessary bloat within Windows 11 — namely web-heavy dependencies like news widgets you never look at or some of the always-connected elements like Start Menu details or Copilot feeds.</p><p>A user should never have to lose up to 1.5GB of RAM to useless stuff like this, so it needs to be decoupled from the core UI. If a feature isn’t actively on screen (or used) it’s background RAM allocation should be aggressively cut down.</p><h2 id="standardize-the-vanilla-baseline">Standardize the vanilla baseline</h2><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="hp2ttKct7XEsSX9q3Jnknm" name="Asus Zenbook 14" alt="Asus Zenbook 14" src="https://cdn.mos.cms.futurecdn.net/hp2ttKct7XEsSX9q3Jnknm.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>Bloatware. You hate it — you’ve heard us complain excessively about it. Asus, Dell, MSI and Acer all ship their budget laptops layered with their own resource-heavy management software, which on an 8GB system is a death sentence.</p><p>Microsoft needs to enforce strict RAM-usage guardrails for laptop makers who create 8GB configurations, ensuring that third-party battery trackers, lighting software and trial anti-virus programs don’t choke that last slot of 2GB remaining after the OS.</p><h2 id="outlook-2">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="oYLxEGMrcPAJTZy2V4Uu8g" name="Acer Swift Air 14" alt="Acer Swift Air 14" src="https://cdn.mos.cms.futurecdn.net/oYLxEGMrcPAJTZy2V4Uu8g.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>PC makers have just proven they can match Apple’s budget hardware pricing. Now, it’s up to Microsoft to prove that Windows 11 can survive the diet Apple forced upon it.</p><p>And sure, there are other things that can be done here, such as smarter compression of background apps, getting on with moving the entire OS over to WinUI 3 framework (the thing that’s removing some of that memory overhead) and much more. But these three items are the main RAM killers here.</p><p>Will it happen? God I hope so, otherwise this fightback against the MacBook Neo is over before it even begins.</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/ive-gone-hands-on-with-every-nvidia-rtx-spark-laptop-coming-this-fall-heres-my-ranked-list-of-the-best-options">I’ve gone hands-on with every Nvidia RTX Spark laptop coming this fall — here’s my brutal tier list of the best options</a></li><li><a href="https://www.tomsguide.com/computing/laptops/msi-prestige-14-flip-ai-vincent-van-gogh-edition-hands-on-review">I just held the most beautiful laptop, but I’m not sure Vincent van Gogh would be happy with his name connected to AI</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></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/laptops/windows-laptops-are-entering-their-macbook-neo-era-but-is-windows-11-actually-ready-for-it-8gb-of-ram-has-me-worried</link>
                                                                            <description>
                            <![CDATA[ Windows laptops are fighting back against the MacBook Neo, but Windows 11 needs to lose weight fast for 8GB of RAM! ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">feEN8u8rHwsygggmoc7r5U</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/TYkv4WneuaJrWRbBapzdyR-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 07 Jun 2026 11:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Laptops]]></category>
                                                    <category><![CDATA[Windows Operating Systems]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Software]]></category>
                                                    <category><![CDATA[Operating Systems]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6.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/TYkv4WneuaJrWRbBapzdyR-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Dell XPS 13 (2026) side by side with the MacBook Neo]]></media:description>                                                            <media:text><![CDATA[The Dell XPS 13 (2026) side by side with the MacBook Neo]]></media:text>
                                <media:title type="plain"><![CDATA[The Dell XPS 13 (2026) side by side with the MacBook Neo]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/TYkv4WneuaJrWRbBapzdyR-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>One thing was clear at <a href="https://www.tomsguide.com/computing/best-of-computex-2026">Computex 2026</a>: every laptop maker is terrified of the <a href="https://www.tomsguide.com/computing/macbooks/apple-macbook-neo-review">MacBook Neo</a>, and they’re <a href="https://www.tomsguide.com/computing/laptops/forget-the-macbook-neo-these-4-windows-laptops-are-just-as-powerful">fighting back in a big way</a>. But I’m worried about whether Windows 11 is <em>actually </em>ready for this shift.</p><p>A $599 machine powered by an A18 Pro chip, Apple has essentially forced the hands of PC manufacturers who had gotten far too comfortable giving us mid systems at this price. But I’m glad the Neo-shaped earthquake has shaken up some change here. The <a href="https://www.tomsguide.com/computing/laptops/i-held-the-macbook-neo-in-one-hand-and-the-new-xps-13-in-the-other-and-dells-affordable-laptop-is-surprisingly-lighter">new Dell XPS 13</a> is looking mighty tasty at that lower price, but with better I/O and a touchscreen display, alongside that aluminum body.</p><p>But there’s a big Windows 11-related question here, because as <a href="https://www.tomsguide.com/computing/macbooks/windows-fans-say-macbook-neos-8gb-ram-is-ridiculous-so-i-tested-it-and-the-results-are-shocking">I found out testing it</a>, the way it's built makes it quite RAM hungry. I caught it using nearly 3X more memory than macOS, and with all the new features announced at <a href="https://www.tomsguide.com/news/live/microsoft-build-2026">Microsoft Build</a>, things could get worse.</p><div ><table><thead><tr><th class="firstcol " ><p><strong>Laptop</strong></p></th><th  ><p>MacBook Neo</p></th><th  ><p>Asus ProArt GoPro Edition</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Google Chrome + 20 Tabs RAM usage</strong></p></td><td  ><p>1.67 GB</p></td><td  ><p>4.76 GB</p></td></tr><tr><td class="firstcol " ><p><strong>Adobe Photoshop RAM usage</strong></p></td><td  ><p>3.86 GB</p></td><td  ><p>3.85 GB</p></td></tr><tr><td class="firstcol " ><p><strong>Apple Music RAM usage</strong></p></td><td  ><p>157.6 MB</p></td><td  ><p>239.1 MB</p></td></tr><tr><td class="firstcol " ><p><strong>System memory usage TOTAL</strong></p></td><td  ><p><strong>7.24 GB</strong></p></td><td  ><p><strong>27.1 GB</strong></p></td></tr></tbody></table></div><p>So while it’s all fair and good in the world of RAMageddon to shift to 8GB (not something I like to see, but something that is necessary given the insane pricing), Windows has to follow suit and trim some of the fat. Here are some ideas.</p><h2 id="give-me-a-compact-mode">Give me a compact mode</h2><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="hqB3iMGH3DpBcLNjw8SSJX" name="Asus ProArt GoPro Edition (PX13)" alt="Asus ProArt GoPro Edition (PX13)" src="https://cdn.mos.cms.futurecdn.net/hqB3iMGH3DpBcLNjw8SSJX.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>Right now, Windows 11 treats a $600 8GB thin-and-light the same way it treats a $3,000 workstation with 64GB of RAM. Yes, the OS’ memory management can be highly dynamic, but the core fundamentals take around 6GB, and the system aggressively caches background apps, so as to not waste any unused RAM.</p><p>This may work if you have a ton of memory, but we’re not in that world at the moment and every precious bit is sacred. So what we need is a modular, adaptive OS shell. If Windows 11 detects 8GB, it should trigger an aggressive “Compact mode” right out of the box to throttle background tasks, pause any non-essential tasks and prioritize anything active in the foreground.</p><h2 id="kill-the-widget-and-web-overhear">Kill the “widget and web” overhear</h2><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="9hJiHSP3dYfHR6gQC88xu5" name="MSI Modern 14S AI+" alt="MSI Modern 14S AI+" src="https://cdn.mos.cms.futurecdn.net/9hJiHSP3dYfHR6gQC88xu5.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>There’s this thing called WebView 2, which is actually the culprit behind some of the most unnecessary bloat within Windows 11 — namely web-heavy dependencies like news widgets you never look at or some of the always-connected elements like Start Menu details or Copilot feeds.</p><p>A user should never have to lose up to 1.5GB of RAM to useless stuff like this, so it needs to be decoupled from the core UI. If a feature isn’t actively on screen (or used) it’s background RAM allocation should be aggressively cut down.</p><h2 id="standardize-the-vanilla-baseline">Standardize the vanilla baseline</h2><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="hp2ttKct7XEsSX9q3Jnknm" name="Asus Zenbook 14" alt="Asus Zenbook 14" src="https://cdn.mos.cms.futurecdn.net/hp2ttKct7XEsSX9q3Jnknm.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>Bloatware. You hate it — you’ve heard us complain excessively about it. Asus, Dell, MSI and Acer all ship their budget laptops layered with their own resource-heavy management software, which on an 8GB system is a death sentence.</p><p>Microsoft needs to enforce strict RAM-usage guardrails for laptop makers who create 8GB configurations, ensuring that third-party battery trackers, lighting software and trial anti-virus programs don’t choke that last slot of 2GB remaining after the OS.</p><h2 id="outlook-2">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="oYLxEGMrcPAJTZy2V4Uu8g" name="Acer Swift Air 14" alt="Acer Swift Air 14" src="https://cdn.mos.cms.futurecdn.net/oYLxEGMrcPAJTZy2V4Uu8g.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>PC makers have just proven they can match Apple’s budget hardware pricing. Now, it’s up to Microsoft to prove that Windows 11 can survive the diet Apple forced upon it.</p><p>And sure, there are other things that can be done here, such as smarter compression of background apps, getting on with moving the entire OS over to WinUI 3 framework (the thing that’s removing some of that memory overhead) and much more. But these three items are the main RAM killers here.</p><p>Will it happen? God I hope so, otherwise this fightback against the MacBook Neo is over before it even begins.</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/ive-gone-hands-on-with-every-nvidia-rtx-spark-laptop-coming-this-fall-heres-my-ranked-list-of-the-best-options">I’ve gone hands-on with every Nvidia RTX Spark laptop coming this fall — here’s my brutal tier list of the best options</a></li><li><a href="https://www.tomsguide.com/computing/laptops/msi-prestige-14-flip-ai-vincent-van-gogh-edition-hands-on-review">I just held the most beautiful laptop, but I’m not sure Vincent van Gogh would be happy with his name connected to AI</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></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The future of Windows 11 — what is Microsoft building next? ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Now that <a href="https://www.tomsguide.com/news/live/microsoft-build-2026">Microsoft Build 2026</a> is officially in the can, a clearer picture of the future of Windows 11 has appeared. Rather than announcing <a href="https://www.tomsguide.com/computing/windows-operating-systems/im-a-windows-user-and-these-are-5-upgrades-i-want-from-windows-12">Windows 12</a>, Microsoft is utterly dedicated to its current OS. That doesn’t mean the operating system you’re currently using is going to remain the same, though. Far from it. </p><p>After CEO Satya Nadella wrapped his keynote, it was hard to shake the feeling that the traditional desktop OS may soon be a thing of the past. Microsoft’s focus seems to be squarely aimed on delivering an AI-centred platform, where agentic systems are cooked into every corner of the Windows 11 experience. </p><p>Perhaps the main takeaway from Build concerning Windows 11’s future is that the OS could well make your day job easier going forward… well, unless you're a trapeze artist or a lion tamer. Using Microsoft IQ and MAI-Thinking-1, always-on AI agents will deploy real workplace knowledge to help users structure their daily workflow. The first of these to be announced was Microsoft Scout, and it could be a legit lifesaver for folks who struggle to organize hectic work schedules.    </p><p>Microsoft is giving developers more tools to assist users with day-to-day tasks. That’s where the GitHub Copilot app (that uses the Big M’s new reasoning model) enters the equation. It’s available in preview to <a href="https://www.microsoft.com/en-us/windowsinsider/" target="_blank">Microsoft Insider Program</a> members now, and it’s just one of a number of productivity-focused features that could transform Windows 11 going forward. Let’s get into what that shiny new future might look like.</p><h2 id="scout-and-about">Scout and 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:1200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qirrUcA4m4GjSrpyJXaaug" name="Microsoft-Scout (credit Microsoft)" alt="Microsoft Build press images" src="https://cdn.mos.cms.futurecdn.net/qirrUcA4m4GjSrpyJXaaug.jpg" mos="" align="middle" fullscreen="" width="1200" height="675" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Following the latest Microsoft Build keynote, there can be little doubt as to where Microsoft’s focus is on when it comes to the future of Windows 11. Productivity-focused AI agents are going to play a key part in the evolution of the operating system, which is where <a href="https://www.microsoft.com/en-us/microsoft-365/blog/2026/06/02/introducing-microsoft-scout-your-always-on-personal-agent/" target="_blank">Microsoft Scout</a> enters the picture. </p><p>Available now to Microsoft Frontier customers, Scout is Microsoft’s first Autopilot agent. Focused on full Microsoft 365 app integration, this “always on” agentic AI can operate across the cloud, web and desktop, allowing users to connect to Outlook, Teams and OneDrive. To put that in more digestible terms, think of Scout as your very own personal assistant; one that constantly organizes your day as it learns and adapts to how you work. </p><p>Whereas traditional agents constantly needed to be prompted, Scout has been designed to work autonomously, allowing it to take proactive actions. This means it can help shape your working day by coordinating your schedule through 365 apps, be it organizing meetings across time zones or monitoring your inbox and Teams to flag any outstanding responses that need to be made. In theory, this should mean you no longer have to constantly flit between emails, docs and browser tabs, as much of this plate-spinning busywork can be delegated to Scout. </p><p>Powered by <a href="https://www.tomsguide.com/ai/openclaw-is-the-viral-ai-assistant-that-lives-on-your-device-what-you-need-to-know">OpenClaw</a>, Scout monitors your working habits through Work IQ, in turn becoming more efficient at helping you complete tasks the more it observes your daily practices. Clearly, Scout is going to be more useful for business environments than Windows 11 users lounging around on the couch. Yet if this Autopilot agent lives up to its virtual co-worker potential, it could genuinely change the way people go about their jobs.</p><h2 id="windows-is-thinking-on-its-feet">Windows is thinking on its feet</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="chUUcacsFZEJ3n3N5vK9pW" name="Microsoft Build 2025" alt="Microsoft Build 2025." src="https://cdn.mos.cms.futurecdn.net/chUUcacsFZEJ3n3N5vK9pW.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Another huge announcement at Build — one that is directly tied to Scout — was the unveiling of <a href="https://microsoft.ai/news/building-a-hillclimbing-machine-launching-seven-new-mai-models/">MAI-Thinking-1</a>. Microsoft’s new reasoning model helps the Autopilot AI out with planning tasks, and senior product manager Tanaya Yadav briefly demoed the tech during the keynote. While the task of training Scout could take hours, the endgame benefit should hopefully be AI agents that prove hugely useful for workflow purposes. </p><p>MAI Thinking could have a big and broad impact across Windows 11 going forward. With the future of Copilot and 365 tied to agentic systems, this reasoning model may shape Microsoft’s AI-focused goals going forward. </p><p>The pivot to MAI is also interesting in that it looks to free Microsoft from being reliant on OpenAI. As Windows 11 continues to evolve, Copilot should primarily take instructions from the Redmond giant’s internal reasoning tech. MAI is just the starting point too, as Microsoft’s AI Superintelligence Team (that must be one seriously cool business card) is also developing a further six in-house reasoning models.</p><h2 id="say-hello-to-solara">Say hello to Solara</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="B7VDkWBHZGqQNifR89nryg" name="Project-Solara (credit Microsoft)" alt="Microsoft Build press images" src="https://cdn.mos.cms.futurecdn.net/B7VDkWBHZGqQNifR89nryg.jpg" mos="" align="middle" fullscreen="" width="1200" height="675" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>One of the most pleasant surprises to come out of Build this year was the announcement of <a href="https://commandline.microsoft.com/project-solara-build-2026/" target="_blank">Project Solara</a>. This chip-to-cloud platform has been built from the ground up to ensure interacting with AI agents works in seamless fashion. </p><p>Probably the coolest feature of Solara is its eye-catching form factor. Because it’s been designed for spaces where traditional PCs and laptops might not be around, Microsoft has focused on delivering products that don’t take up much space. Enter devices which resemble a smart clock, and even more niftily, a work ID badge. </p><p>The clock-aping gizmo is intended to remain stationary, whereas the badge has been designed to be used while you’re on the move. On the latter, it can be unlocked with your fingerprint. The badge can even record video and take voice instructions, and it will subsequently clean up said audio so that you can send the note to colleagues in easily decipherable chunks.    </p><p>Engineered with a new era of AI agents in mind, Project Solara takes cues from Android devices. The daring design of this new agent-focused OS seems to suggest Microsoft is fully committed to a new era of AI that thumbs its nose at traditional hardware by embracing imaginative new forms.</p><h2 id="security-is-being-geared-for-ai-agents">Security is being geared for AI agents</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rCPAPKNcNyTT7HNtYFu6Dh" name="Microsoft-Execution-Containers (credit Windows Forum)" alt="Microsoft Build press images" src="https://cdn.mos.cms.futurecdn.net/rCPAPKNcNyTT7HNtYFu6Dh.jpg" mos="" align="middle" fullscreen="" width="1200" height="675" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>With Microsoft increasingly pivoting towards AI as the future of Windows 11 takes shape, the matter of security becomes ever more vital. While the prospect of Scout mapping out your workday as you sip on your morning mocha is undoubtedly an appealing one for folks who get easily flustered, protections do need to be in place. </p><p>This is where the announcement of <a href="https://blogs.windows.com/windowsdeveloper/2026/06/02/windows-platform-security-for-ai-agents/">Microsoft Execution Containers</a> (MXC) becomes crucial. Now in preview, this security framework allows developers to run containment boundaries that are enforced by Windows 11. Essentially, a dev describes the security parameters it needs its agents to adhere to, then the OS enforces them everywhere these agentic systems run. </p><p>Now, while this probably sounds roughly as exciting to you as the prospect of dining in a restaurant that only serves steamed celery, MXC is important to the future of AI agents. As they become more autonomous, it’s crucial that these agents can’t accidentally access sensitive info or make decisions they’re not permitted to. With MXC in place, admins should be able to rest safe in the knowledge that this agent-native runtime is operating under safe security parameters.</p><h2 id="github-copilot-shifts-the-focus-to-devs">GitHub Copilot shifts the focus to devs</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cGuhwEyqrXLG6iuwGBu29h" name="GitHub-Copilot-(credit Shutterstock)" alt="Microsoft Build press images" src="https://cdn.mos.cms.futurecdn.net/cGuhwEyqrXLG6iuwGBu29h.jpg" mos="" align="middle" fullscreen="" width="1200" height="675" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Now available in preview to developers, the GitHub Copilot app is an AI-assisted engineering platform that brings agentic workflows to native desktop experiences. One of the major Build takeaways concerning the app is how it will work autonomously, though not in an unfettered manner (devs will most definitely still be in control). </p><p>GitHub Copilot will use the newly revealed MAI-Code-1-Flash, an internal coding model that should improve coding performance through latency reduction. The deployment of this MAI model is to ensure the GitHub Copilot app is more aware of good workspace practices. In turn, this allows it to function like a true agentic assistant, rather than a glorified chatbot that continually needs to be prompted. </p><p>Going forward, GitHub Copilot should make developers' lives easier, taking some coding pressures off their shoulders as it tests and deploys code with genuine autonomy thanks to AI agents. In an ideal world, this app will decrease developer workloads, rather than physically replacing them. </p><p>Again, none of this is particularly focused on the Average Joe/Jenny Windows 11 experience. Then again, Build has always been focused on developers over consumers. Ultimately, the agentic benefits of GitHub Copilot that developers receive will ideally lead to smoother OS experiences for all of us.</p><h2 id="the-future-of-windows-11-centers-around-ai">The future of Windows 11 centers around AI</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Yd5Q8e8pXNBAzLmiovivbY" name="Microsoft Build 2025" alt="Microsoft Build 2025." src="https://cdn.mos.cms.futurecdn.net/Yd5Q8e8pXNBAzLmiovivbY.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>If Windows 11 is just a gateway that allows you to jump into the <a href="https://www.tomsguide.com/best-picks/best-PC-games">best PC games</a>, there likely wasn’t much for you to get excited about coming out of Build 2026. Yet if you’re a dev or someone who is looking to use AI tools to coordinate workflows, the latest keynote definitely provided a peek into the future of Microsoft’s OS.</p><p>Rather than revealing <a href="https://www.tomsguide.com/news/windows-12">Windows 12</a>, Microsoft doubled down on its commitment to its current operating system. Moving forward, AI is clearly going to be the cornerstone of everyday Windows functions. With agentic systems like Microsoft Scout leaning on reasoning models to help business-minded folks map out their day by coordinating schedules, and Project Solara devices that have been crafted to replace traditional hardware, the focus is on agents that have real autonomy in order to assist users. The Redmond Giant is going hard on a vision for Windows 11 where agentic AI is baked into its very fabric.</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/windows-operating-systems/15-top-windows-11-tips-everyone-needs-to-know">15 top Windows 11 tips everyone needs to know</a></li><li><a href="https://www.tomsguide.com/computing/laptops/best-windows-laptops">The best Windows laptops of 2026, tested by experts</a></li><li><a href="https://www.tomsguide.com/computing/windows-operating-systems/i-sped-up-my-sluggish-windows-11-pc-with-these-6-free-tricks-heres-how">I sped up my sluggish Windows 11 PC with these 6 free tricks — here's how</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/windows-operating-systems/the-future-of-windows-11-what-is-microsoft-building-next</link>
                                                                            <description>
                            <![CDATA[ The latest Microsoft Build keynote pointed to a future for Windows 11 where the focus is on deeply baked in agentic systems that could transform the way you work. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">VGAvj9wCPSfuDoxq9vbAvQ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/rPdwCgeWPVoHuMhfpUNv5h-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 03 Jun 2026 15:46:18 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Windows Operating Systems]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Software]]></category>
                                                    <category><![CDATA[Operating Systems]]></category>
                                                                                                <author><![CDATA[ dave.meikleham@futurenet.com (Dave Meikleham) ]]></author>                    <dc:creator><![CDATA[ Dave Meikleham ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/Rda8e7jGfyTdZLWYJQQ8VY.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Dave is a computing editor at Tom’s Guide and covers everything from cutting-edge laptops, the latest GPU tech, to ultrawide monitors. When he’s not worrying about dead pixels, Dave enjoys regularly rebuilding his PC for absolutely no reason at all. He built his first rig over 20 years ago, and he’s gone through more motherboards than he’s had hot dinners. Probably. &lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;In a previous life, he worked as a video game journalist during a career spanning the best part of two decades. Over that time he worked across both online and print, with bylines for GamesRadar+, PC Gamer, TechRadar, Edge and the Official UK PlayStation Magazine. He’s almost amassed an immeasurable amount of bad puns.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;An avid PC and console gamer, Dave enjoys breaking out Fraps way too often as he obsesses over frame rates. Despite owning a graphics card that costs roughly the same as your average used car, he still enjoys gaming on the go and is regularly glued to his Switch. Away from tech, most of Dave’s time is taken up by walking his husky, obsessing about his various OLED displays and sweating over the fitness of half a dozen Arsenal players on any given week.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <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/rPdwCgeWPVoHuMhfpUNv5h-1280-80.jpg">
                                                            <media:credit><![CDATA[Microsoft]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Microsoft Build press images]]></media:description>                                                            <media:text><![CDATA[Microsoft Build press images]]></media:text>
                                <media:title type="plain"><![CDATA[Microsoft Build press images]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/rPdwCgeWPVoHuMhfpUNv5h-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Now that <a href="https://www.tomsguide.com/news/live/microsoft-build-2026">Microsoft Build 2026</a> is officially in the can, a clearer picture of the future of Windows 11 has appeared. Rather than announcing <a href="https://www.tomsguide.com/computing/windows-operating-systems/im-a-windows-user-and-these-are-5-upgrades-i-want-from-windows-12">Windows 12</a>, Microsoft is utterly dedicated to its current OS. That doesn’t mean the operating system you’re currently using is going to remain the same, though. Far from it. </p><p>After CEO Satya Nadella wrapped his keynote, it was hard to shake the feeling that the traditional desktop OS may soon be a thing of the past. Microsoft’s focus seems to be squarely aimed on delivering an AI-centred platform, where agentic systems are cooked into every corner of the Windows 11 experience. </p><p>Perhaps the main takeaway from Build concerning Windows 11’s future is that the OS could well make your day job easier going forward… well, unless you're a trapeze artist or a lion tamer. Using Microsoft IQ and MAI-Thinking-1, always-on AI agents will deploy real workplace knowledge to help users structure their daily workflow. The first of these to be announced was Microsoft Scout, and it could be a legit lifesaver for folks who struggle to organize hectic work schedules.    </p><p>Microsoft is giving developers more tools to assist users with day-to-day tasks. That’s where the GitHub Copilot app (that uses the Big M’s new reasoning model) enters the equation. It’s available in preview to <a href="https://www.microsoft.com/en-us/windowsinsider/" target="_blank">Microsoft Insider Program</a> members now, and it’s just one of a number of productivity-focused features that could transform Windows 11 going forward. Let’s get into what that shiny new future might look like.</p><h2 id="scout-and-about">Scout and 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:1200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qirrUcA4m4GjSrpyJXaaug" name="Microsoft-Scout (credit Microsoft)" alt="Microsoft Build press images" src="https://cdn.mos.cms.futurecdn.net/qirrUcA4m4GjSrpyJXaaug.jpg" mos="" align="middle" fullscreen="" width="1200" height="675" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Following the latest Microsoft Build keynote, there can be little doubt as to where Microsoft’s focus is on when it comes to the future of Windows 11. Productivity-focused AI agents are going to play a key part in the evolution of the operating system, which is where <a href="https://www.microsoft.com/en-us/microsoft-365/blog/2026/06/02/introducing-microsoft-scout-your-always-on-personal-agent/" target="_blank">Microsoft Scout</a> enters the picture. </p><p>Available now to Microsoft Frontier customers, Scout is Microsoft’s first Autopilot agent. Focused on full Microsoft 365 app integration, this “always on” agentic AI can operate across the cloud, web and desktop, allowing users to connect to Outlook, Teams and OneDrive. To put that in more digestible terms, think of Scout as your very own personal assistant; one that constantly organizes your day as it learns and adapts to how you work. </p><p>Whereas traditional agents constantly needed to be prompted, Scout has been designed to work autonomously, allowing it to take proactive actions. This means it can help shape your working day by coordinating your schedule through 365 apps, be it organizing meetings across time zones or monitoring your inbox and Teams to flag any outstanding responses that need to be made. In theory, this should mean you no longer have to constantly flit between emails, docs and browser tabs, as much of this plate-spinning busywork can be delegated to Scout. </p><p>Powered by <a href="https://www.tomsguide.com/ai/openclaw-is-the-viral-ai-assistant-that-lives-on-your-device-what-you-need-to-know">OpenClaw</a>, Scout monitors your working habits through Work IQ, in turn becoming more efficient at helping you complete tasks the more it observes your daily practices. Clearly, Scout is going to be more useful for business environments than Windows 11 users lounging around on the couch. Yet if this Autopilot agent lives up to its virtual co-worker potential, it could genuinely change the way people go about their jobs.</p><h2 id="windows-is-thinking-on-its-feet">Windows is thinking on its feet</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="chUUcacsFZEJ3n3N5vK9pW" name="Microsoft Build 2025" alt="Microsoft Build 2025." src="https://cdn.mos.cms.futurecdn.net/chUUcacsFZEJ3n3N5vK9pW.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Another huge announcement at Build — one that is directly tied to Scout — was the unveiling of <a href="https://microsoft.ai/news/building-a-hillclimbing-machine-launching-seven-new-mai-models/">MAI-Thinking-1</a>. Microsoft’s new reasoning model helps the Autopilot AI out with planning tasks, and senior product manager Tanaya Yadav briefly demoed the tech during the keynote. While the task of training Scout could take hours, the endgame benefit should hopefully be AI agents that prove hugely useful for workflow purposes. </p><p>MAI Thinking could have a big and broad impact across Windows 11 going forward. With the future of Copilot and 365 tied to agentic systems, this reasoning model may shape Microsoft’s AI-focused goals going forward. </p><p>The pivot to MAI is also interesting in that it looks to free Microsoft from being reliant on OpenAI. As Windows 11 continues to evolve, Copilot should primarily take instructions from the Redmond giant’s internal reasoning tech. MAI is just the starting point too, as Microsoft’s AI Superintelligence Team (that must be one seriously cool business card) is also developing a further six in-house reasoning models.</p><h2 id="say-hello-to-solara">Say hello to Solara</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="B7VDkWBHZGqQNifR89nryg" name="Project-Solara (credit Microsoft)" alt="Microsoft Build press images" src="https://cdn.mos.cms.futurecdn.net/B7VDkWBHZGqQNifR89nryg.jpg" mos="" align="middle" fullscreen="" width="1200" height="675" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>One of the most pleasant surprises to come out of Build this year was the announcement of <a href="https://commandline.microsoft.com/project-solara-build-2026/" target="_blank">Project Solara</a>. This chip-to-cloud platform has been built from the ground up to ensure interacting with AI agents works in seamless fashion. </p><p>Probably the coolest feature of Solara is its eye-catching form factor. Because it’s been designed for spaces where traditional PCs and laptops might not be around, Microsoft has focused on delivering products that don’t take up much space. Enter devices which resemble a smart clock, and even more niftily, a work ID badge. </p><p>The clock-aping gizmo is intended to remain stationary, whereas the badge has been designed to be used while you’re on the move. On the latter, it can be unlocked with your fingerprint. The badge can even record video and take voice instructions, and it will subsequently clean up said audio so that you can send the note to colleagues in easily decipherable chunks.    </p><p>Engineered with a new era of AI agents in mind, Project Solara takes cues from Android devices. The daring design of this new agent-focused OS seems to suggest Microsoft is fully committed to a new era of AI that thumbs its nose at traditional hardware by embracing imaginative new forms.</p><h2 id="security-is-being-geared-for-ai-agents">Security is being geared for AI agents</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rCPAPKNcNyTT7HNtYFu6Dh" name="Microsoft-Execution-Containers (credit Windows Forum)" alt="Microsoft Build press images" src="https://cdn.mos.cms.futurecdn.net/rCPAPKNcNyTT7HNtYFu6Dh.jpg" mos="" align="middle" fullscreen="" width="1200" height="675" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>With Microsoft increasingly pivoting towards AI as the future of Windows 11 takes shape, the matter of security becomes ever more vital. While the prospect of Scout mapping out your workday as you sip on your morning mocha is undoubtedly an appealing one for folks who get easily flustered, protections do need to be in place. </p><p>This is where the announcement of <a href="https://blogs.windows.com/windowsdeveloper/2026/06/02/windows-platform-security-for-ai-agents/">Microsoft Execution Containers</a> (MXC) becomes crucial. Now in preview, this security framework allows developers to run containment boundaries that are enforced by Windows 11. Essentially, a dev describes the security parameters it needs its agents to adhere to, then the OS enforces them everywhere these agentic systems run. </p><p>Now, while this probably sounds roughly as exciting to you as the prospect of dining in a restaurant that only serves steamed celery, MXC is important to the future of AI agents. As they become more autonomous, it’s crucial that these agents can’t accidentally access sensitive info or make decisions they’re not permitted to. With MXC in place, admins should be able to rest safe in the knowledge that this agent-native runtime is operating under safe security parameters.</p><h2 id="github-copilot-shifts-the-focus-to-devs">GitHub Copilot shifts the focus to devs</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cGuhwEyqrXLG6iuwGBu29h" name="GitHub-Copilot-(credit Shutterstock)" alt="Microsoft Build press images" src="https://cdn.mos.cms.futurecdn.net/cGuhwEyqrXLG6iuwGBu29h.jpg" mos="" align="middle" fullscreen="" width="1200" height="675" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Now available in preview to developers, the GitHub Copilot app is an AI-assisted engineering platform that brings agentic workflows to native desktop experiences. One of the major Build takeaways concerning the app is how it will work autonomously, though not in an unfettered manner (devs will most definitely still be in control). </p><p>GitHub Copilot will use the newly revealed MAI-Code-1-Flash, an internal coding model that should improve coding performance through latency reduction. The deployment of this MAI model is to ensure the GitHub Copilot app is more aware of good workspace practices. In turn, this allows it to function like a true agentic assistant, rather than a glorified chatbot that continually needs to be prompted. </p><p>Going forward, GitHub Copilot should make developers' lives easier, taking some coding pressures off their shoulders as it tests and deploys code with genuine autonomy thanks to AI agents. In an ideal world, this app will decrease developer workloads, rather than physically replacing them. </p><p>Again, none of this is particularly focused on the Average Joe/Jenny Windows 11 experience. Then again, Build has always been focused on developers over consumers. Ultimately, the agentic benefits of GitHub Copilot that developers receive will ideally lead to smoother OS experiences for all of us.</p><h2 id="the-future-of-windows-11-centers-around-ai">The future of Windows 11 centers around AI</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Yd5Q8e8pXNBAzLmiovivbY" name="Microsoft Build 2025" alt="Microsoft Build 2025." src="https://cdn.mos.cms.futurecdn.net/Yd5Q8e8pXNBAzLmiovivbY.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>If Windows 11 is just a gateway that allows you to jump into the <a href="https://www.tomsguide.com/best-picks/best-PC-games">best PC games</a>, there likely wasn’t much for you to get excited about coming out of Build 2026. Yet if you’re a dev or someone who is looking to use AI tools to coordinate workflows, the latest keynote definitely provided a peek into the future of Microsoft’s OS.</p><p>Rather than revealing <a href="https://www.tomsguide.com/news/windows-12">Windows 12</a>, Microsoft doubled down on its commitment to its current operating system. Moving forward, AI is clearly going to be the cornerstone of everyday Windows functions. With agentic systems like Microsoft Scout leaning on reasoning models to help business-minded folks map out their day by coordinating schedules, and Project Solara devices that have been crafted to replace traditional hardware, the focus is on agents that have real autonomy in order to assist users. The Redmond Giant is going hard on a vision for Windows 11 where agentic AI is baked into its very fabric.</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/windows-operating-systems/15-top-windows-11-tips-everyone-needs-to-know">15 top Windows 11 tips everyone needs to know</a></li><li><a href="https://www.tomsguide.com/computing/laptops/best-windows-laptops">The best Windows laptops of 2026, tested by experts</a></li><li><a href="https://www.tomsguide.com/computing/windows-operating-systems/i-sped-up-my-sluggish-windows-11-pc-with-these-6-free-tricks-heres-how">I sped up my sluggish Windows 11 PC with these 6 free tricks — here's how</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I just tested Microsoft Surface Laptop Ultra — Nvidia RTX Spark brings life to one of the best laptops I’ve ever tried ]]></title>
                                                                                                <dc:content><![CDATA[ <p><a href="https://www.tomsguide.com/computing/gaming-laptops/all-8-laptops-launching-with-nvidia-rtx-spark-this-fall-and-what-they-can-do">Eight laptops are launching with Nvidia RTX Spark</a> inside at <a href="https://www.tomsguide.com/news/live/computex-2026">Computex 2026</a>, and the Microsoft Surface Laptop Ultra is easily one of the best — so beautifully designed it almost makes Spark feel like a side character.</p><p>Gunning for the <a href="https://www.tomsguide.com/computing/macbooks/macbook-pro-16-inch-m5-pro-review">16-inch MacBook Pro</a>, Microsoft doesn’t miss with a seriously luxurious build, great I/O for pros, fantastic ergonomics (including a breakthrough touchpad) and a mesmerizing display.</p><p>And you’ve seen what it will be able to do from all the <a href="https://www.tomsguide.com/computing/laptops/nvidia-rtx-spark-hands-on-review">RTX Spark testing</a> I’ve done. This will not be a cheap laptop with that chip inside, so Microsoft has rolled out the red carpet in utilitarian aesthetics. Let me tell you about it.</p><h2 class="article-body__section" id="section-microsoft-surface-laptop-ultra-specs"><span>Microsoft Surface Laptop Ultra: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>Nvidia RTX Spark</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>Up to 128GB LPDDR5X unified memory</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>3x USB-C, 1x USB-A, 1x HDMI, 1x SD card reader, 1x 3.5mm headphone jack</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>15-inch 2880 x 1920-pixel mini-LED PixelSense Ultra, 2000 nits peak HDR brightness</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>4.5 pounds</p></td></tr><tr><td class="firstcol " ><p><strong>Price (rumored)</strong></p></td><td  ><p>$3,000-$7,000</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-a-seriously-good-looker-and-worker"><span>A seriously good looker (and worker)</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="5uYe3aKfrghYpnkxdVKejS" name="Microsoft Surface Laptop Ultra" alt="Microsoft Surface Laptop Ultra" src="https://cdn.mos.cms.futurecdn.net/5uYe3aKfrghYpnkxdVKejS.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>Make no mistake about it — the Surface Laptop Ultra is built different. On the face of it, this is a Surface Laptop if it started bulking for a few months. But once you get into the details, you realize it’s so much more than that.</p><p>It starts with a beefy utilitarian presence atop any desk. This is a hefty machine, but those premium materials and the added bulk makes this feel ready to power through any task you throw at it — just like a MacBook Pro does.</p><p>The similarities also extend to the port selection, but chalk this up as a win for the Ultra with its additional USB-A for wider support. They keyboard feels gorgeous to type on, which is something that Microsoft has really excelled in in the past — giving you a nice tactility to every key press that makes it feel intentful.</p><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="NhBrhfnt7kHM3UTaYCJPnS" name="Microsoft Surface Laptop Ultra" alt="Microsoft Surface Laptop Ultra" src="https://cdn.mos.cms.futurecdn.net/NhBrhfnt7kHM3UTaYCJPnS.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 the real star of the show on that bottom deck is the 30% larger haptic touchpad. It’s an absolute ocean with a smooth gliding surface, with every click giving me those same snappy sensations I love from the MacBook Pro’s trackpad. But as an addition here is the haptics that actually communicate back to you.</p><p>Built directly into Windows 11, you’ll feel small hints of feedback as you do key things like snap apps to sides of the screen. On top of that, the company is working with key developers to give you those same sensations in third party apps like moving your cursor over clips in a video timeline.</p><p>It’s a feeling that when returning to my MacBook Pro, I felt like something was missing! Top it all off with that gorgeously color-accurate and smooth PixelSense display up top that can get seriously bright, and you’ve got a nice-looking beast that’s ready for anything.</p><h3 class="article-body__section" id="section-monstrous-performance"><span>Monstrous performance</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vFUbLWHV4FJFhgWi9FsCqS" name="Microsoft Surface Laptop Ultra" alt="Microsoft Surface Laptop Ultra" src="https://cdn.mos.cms.futurecdn.net/vFUbLWHV4FJFhgWi9FsCqS.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>Speaking of ready for anything, that’s where I get to the fun stuff inside. You’ve seen a lot of the software stuff it will be able to do from the Microsoft Build announcements — in short, expect a lot of agentic AI features to take advantage of that RTX Spark chip.</p><p>And as you saw in my testing of Spark itself, there’s a lot to be had here from the massive local models changing the dynamic of how you interact with a computer from it being a tool you lays idle when you’re not using it, to an active assistant machine.</p><p>But let’s compare apples and oranges and put it up against the MacBook Pro workload. You want your laptop to get the pro stuff done speedily both on and off the charger. After flying around the most dense Unreal Engine map while connected and disconnected, that’s easily proven true. There’s also tie-ins with Adobe to use much more of that built-in RTX 5070-level GPU and turboboost creator tasks beyond levels I’d seen in equivalent Apple laptops.</p><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="uwg94CzoH3VwsikR2fFqoS" name="Microsoft Surface Laptop Ultra" alt="Microsoft Surface Laptop Ultra" src="https://cdn.mos.cms.futurecdn.net/uwg94CzoH3VwsikR2fFqoS.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 the real killer app for me is the ability to use the same laptop to work by day and play by night. Alan Wake 2 is built natively for Arm and can run at 1600p resolution with ray tracing and DLSS 4.5 ray reconstruction at buttery smooth frame rates. Even games that are not built for this architecture like Pragmata go through the Prism emulator layer and play smoothly too. And yes, both of these were on and off the charger too!</p><p>The big unanswered question here is power efficiency, which could be affected by that emulation layer. Speaking to Nvidia, they’re not giving anything away, but did give me a cheeky smile when I started talking about what all-day battery life really means. We could be in for something special here.</p><h2 class="article-body__section" id="section-outlook"><span>Outlook</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9yfWzrhKcu2Vq669dcijxS" name="Microsoft Surface Laptop Ultra" alt="Microsoft Surface Laptop Ultra" src="https://cdn.mos.cms.futurecdn.net/9yfWzrhKcu2Vq669dcijxS.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>Ignoring the larger USB-C port mystery (my theory is it’s a magnetic breakaway USB-C socket that replaces the missing Surface Connect), what you’re left with here is a phenomenal laptop that <em>feels </em>powerful.</p><p>The aesthetics are clean, the ergonomics are fantastic, the display is mesmerizing and the power under the hood is awesome! Of course, there’s a big question on price, which rumors here at Computex point to a starting cost of $3,000.</p><p>This is definitely for the pros who know how to make the most of that power, and no longer is the MacBook Pro the default option at this price. A new player has come to town.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/i-spoke-to-nvidia-ceo-jensen-huang-about-rtx-spark-he-is-willing-to-work-on-an-rtx-gaming-handheld-n2x-and-n3x-are-already-planned-and-the-chip-is-more-like-r2d2-than-a-laptop-cpu">I spoke to Nvidia CEO Jensen Huang about RTX Spark — he tells us why this is less of a laptop chip and more like 'R2-D2,' and shares future plans on N2X and N3X</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><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></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/laptops/microsoft-surface-laptop-ultra-rtx-spark-hands-on-review</link>
                                                                            <description>
                            <![CDATA[ Microsoft Surface Laptop Ultra is easily one of the best laptops I've tested — so beautifully designed it almost makes RTX Spark feel like a side character. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">7ZgAshoDUGewRYqNbiuhRN</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/C77AV3dtd7mJBPRExw6wgS-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 03 Jun 2026 04:02:48 +0000</pubDate>                                                                                                                                <updated>Wed, 03 Jun 2026 17:52:39 +0000</updated>
                                                                                                                                            <category><![CDATA[Laptops]]></category>
                                                    <category><![CDATA[Computing]]></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/C77AV3dtd7mJBPRExw6wgS-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Microsoft Surface Laptop Ultra]]></media:description>                                                            <media:text><![CDATA[Microsoft Surface Laptop Ultra]]></media:text>
                                <media:title type="plain"><![CDATA[Microsoft Surface Laptop Ultra]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/C77AV3dtd7mJBPRExw6wgS-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p><a href="https://www.tomsguide.com/computing/gaming-laptops/all-8-laptops-launching-with-nvidia-rtx-spark-this-fall-and-what-they-can-do">Eight laptops are launching with Nvidia RTX Spark</a> inside at <a href="https://www.tomsguide.com/news/live/computex-2026">Computex 2026</a>, and the Microsoft Surface Laptop Ultra is easily one of the best — so beautifully designed it almost makes Spark feel like a side character.</p><p>Gunning for the <a href="https://www.tomsguide.com/computing/macbooks/macbook-pro-16-inch-m5-pro-review">16-inch MacBook Pro</a>, Microsoft doesn’t miss with a seriously luxurious build, great I/O for pros, fantastic ergonomics (including a breakthrough touchpad) and a mesmerizing display.</p><p>And you’ve seen what it will be able to do from all the <a href="https://www.tomsguide.com/computing/laptops/nvidia-rtx-spark-hands-on-review">RTX Spark testing</a> I’ve done. This will not be a cheap laptop with that chip inside, so Microsoft has rolled out the red carpet in utilitarian aesthetics. Let me tell you about it.</p><h2 class="article-body__section" id="section-microsoft-surface-laptop-ultra-specs"><span>Microsoft Surface Laptop Ultra: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>Nvidia RTX Spark</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>Up to 128GB LPDDR5X unified memory</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>3x USB-C, 1x USB-A, 1x HDMI, 1x SD card reader, 1x 3.5mm headphone jack</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>15-inch 2880 x 1920-pixel mini-LED PixelSense Ultra, 2000 nits peak HDR brightness</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>4.5 pounds</p></td></tr><tr><td class="firstcol " ><p><strong>Price (rumored)</strong></p></td><td  ><p>$3,000-$7,000</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-a-seriously-good-looker-and-worker"><span>A seriously good looker (and worker)</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="5uYe3aKfrghYpnkxdVKejS" name="Microsoft Surface Laptop Ultra" alt="Microsoft Surface Laptop Ultra" src="https://cdn.mos.cms.futurecdn.net/5uYe3aKfrghYpnkxdVKejS.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>Make no mistake about it — the Surface Laptop Ultra is built different. On the face of it, this is a Surface Laptop if it started bulking for a few months. But once you get into the details, you realize it’s so much more than that.</p><p>It starts with a beefy utilitarian presence atop any desk. This is a hefty machine, but those premium materials and the added bulk makes this feel ready to power through any task you throw at it — just like a MacBook Pro does.</p><p>The similarities also extend to the port selection, but chalk this up as a win for the Ultra with its additional USB-A for wider support. They keyboard feels gorgeous to type on, which is something that Microsoft has really excelled in in the past — giving you a nice tactility to every key press that makes it feel intentful.</p><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="NhBrhfnt7kHM3UTaYCJPnS" name="Microsoft Surface Laptop Ultra" alt="Microsoft Surface Laptop Ultra" src="https://cdn.mos.cms.futurecdn.net/NhBrhfnt7kHM3UTaYCJPnS.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 the real star of the show on that bottom deck is the 30% larger haptic touchpad. It’s an absolute ocean with a smooth gliding surface, with every click giving me those same snappy sensations I love from the MacBook Pro’s trackpad. But as an addition here is the haptics that actually communicate back to you.</p><p>Built directly into Windows 11, you’ll feel small hints of feedback as you do key things like snap apps to sides of the screen. On top of that, the company is working with key developers to give you those same sensations in third party apps like moving your cursor over clips in a video timeline.</p><p>It’s a feeling that when returning to my MacBook Pro, I felt like something was missing! Top it all off with that gorgeously color-accurate and smooth PixelSense display up top that can get seriously bright, and you’ve got a nice-looking beast that’s ready for anything.</p><h3 class="article-body__section" id="section-monstrous-performance"><span>Monstrous performance</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vFUbLWHV4FJFhgWi9FsCqS" name="Microsoft Surface Laptop Ultra" alt="Microsoft Surface Laptop Ultra" src="https://cdn.mos.cms.futurecdn.net/vFUbLWHV4FJFhgWi9FsCqS.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>Speaking of ready for anything, that’s where I get to the fun stuff inside. You’ve seen a lot of the software stuff it will be able to do from the Microsoft Build announcements — in short, expect a lot of agentic AI features to take advantage of that RTX Spark chip.</p><p>And as you saw in my testing of Spark itself, there’s a lot to be had here from the massive local models changing the dynamic of how you interact with a computer from it being a tool you lays idle when you’re not using it, to an active assistant machine.</p><p>But let’s compare apples and oranges and put it up against the MacBook Pro workload. You want your laptop to get the pro stuff done speedily both on and off the charger. After flying around the most dense Unreal Engine map while connected and disconnected, that’s easily proven true. There’s also tie-ins with Adobe to use much more of that built-in RTX 5070-level GPU and turboboost creator tasks beyond levels I’d seen in equivalent Apple laptops.</p><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="uwg94CzoH3VwsikR2fFqoS" name="Microsoft Surface Laptop Ultra" alt="Microsoft Surface Laptop Ultra" src="https://cdn.mos.cms.futurecdn.net/uwg94CzoH3VwsikR2fFqoS.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 the real killer app for me is the ability to use the same laptop to work by day and play by night. Alan Wake 2 is built natively for Arm and can run at 1600p resolution with ray tracing and DLSS 4.5 ray reconstruction at buttery smooth frame rates. Even games that are not built for this architecture like Pragmata go through the Prism emulator layer and play smoothly too. And yes, both of these were on and off the charger too!</p><p>The big unanswered question here is power efficiency, which could be affected by that emulation layer. Speaking to Nvidia, they’re not giving anything away, but did give me a cheeky smile when I started talking about what all-day battery life really means. We could be in for something special here.</p><h2 class="article-body__section" id="section-outlook"><span>Outlook</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9yfWzrhKcu2Vq669dcijxS" name="Microsoft Surface Laptop Ultra" alt="Microsoft Surface Laptop Ultra" src="https://cdn.mos.cms.futurecdn.net/9yfWzrhKcu2Vq669dcijxS.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>Ignoring the larger USB-C port mystery (my theory is it’s a magnetic breakaway USB-C socket that replaces the missing Surface Connect), what you’re left with here is a phenomenal laptop that <em>feels </em>powerful.</p><p>The aesthetics are clean, the ergonomics are fantastic, the display is mesmerizing and the power under the hood is awesome! Of course, there’s a big question on price, which rumors here at Computex point to a starting cost of $3,000.</p><p>This is definitely for the pros who know how to make the most of that power, and no longer is the MacBook Pro the default option at this price. A new player has come to town.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/i-spoke-to-nvidia-ceo-jensen-huang-about-rtx-spark-he-is-willing-to-work-on-an-rtx-gaming-handheld-n2x-and-n3x-are-already-planned-and-the-chip-is-more-like-r2d2-than-a-laptop-cpu">I spoke to Nvidia CEO Jensen Huang about RTX Spark — he tells us why this is less of a laptop chip and more like 'R2-D2,' and shares future plans on N2X and N3X</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><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></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Biggest Microsoft Build 2026 announcements — agentic AI, RTX Spark Dev Box, GitHub Copilot app, new MAI models, and more ]]></title>
                                                                                                <dc:content><![CDATA[ <div class="live-content"><p>Microsoft Build 2026 is over, and as expected, Satya Nadella’s keynote was all about agentic systems, or AI that acts on your behalf without direct supervision. To that end, several features and applications were introduced.</p><p>This includes Microsoft IQ, which is now generally available across GitHub Copilot, Foundry, and Copilot Studios. It’s the new context layer that feeds AI agents real workplace knowledge (Work IQ from M365 Signals), structured business data (Fabric IQ), and fast web grounding via the new Web IQ. Frontier Tuning, available in private preview, allows agents to learn how your business operates within your compliance boundaries.</p><p>Developers got some practical upgrades to the tooling. For instance, the GitHub Copilot app (now available in preview) brings agentic workflows to a native desktop experience. Project Rayfin (also in preview) tackles the prototype-to-production gap by providing developers with a managed backend-as-a-service on Microsoft Fabric, built on GitHub-defined workflows.</p><p>We also got to see some hardware in the form of the Surface RTX Spark Dev Box, which targets sustained workloads, with up to 1 petaflop of AI compute and 128GB of unified memory, capable of running 120B-parameter models locally without driving up costs.</p><p>Seven new MAI models were introduced, including the MAI-Thinking-1 reasoning model and MAI-Code-1, which is tuned specifically for GitHub and VS Code. Speaking of multi-model support, Azure AI Foundry can also pick the right model for a task, so you won’t be locked in.</p><p>Now that the presentation is over, feel free to watch the embedded video and read my posts. For more details, you can also read <a href="https://blogs.windows.com/windowsdeveloper/2026/06/02/build-2026-furthering-windows-as-the-trusted-platform-for-development/" target="_blank"><u>Microsoft’s Build 2026 recap post</u></a>.</p><h3 class="article-body__section" id="section-microsoft-build-2026-highlights"><span>Microsoft Build 2026 highlights</span></h3><ul><li>Microsoft IQ is now available</li><li>Seven new MAI models announced</li><li><a href="https://blogs.windows.com/devices/2026/06/02/building-the-next-generation-of-devices-for-developers-surface-rtx-spark-dev-box/" target="_blank">Surface RTX Spark Dev Box</a> brings serious AI horsepower</li><li>GitHub Copilot app enters preview</li><li>Agent 365 delivers quick fixes</li></ul><h3 class="article-body__section" id="section-watch-microsoft-build-2026-with-us"><span>Watch Microsoft Build 2026 with us</span></h3><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/HG0twQJ7aG4" allowfullscreen></iframe></div></div><h3 class="article-body__section" id="section-live-latest-updates"><span>Live: Latest updates</span></h3></div><div class="live-content"><time datetime="2026-06-01T15:09:22+00:00">June 1, 2026 – 11:09 AM</time><h2 id="microsoft-build-2026-is-almost-here">Microsoft Build 2026 is almost here</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3423px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="KQbE8W9xF5htWqfEL2b2K5" name="Microsoft HQ" alt="View of Microsoft Romania headquarters in City Gate Towers situated in Free Press Square, in Bucharest, Romania" src="https://cdn.mos.cms.futurecdn.net/KQbE8W9xF5htWqfEL2b2K5.jpg" mos="" align="middle" fullscreen="" width="3423" height="1925" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Getty Images)</span></figcaption></figure><p>Hello, everyone, and welcome to our live coverage of Microsoft Build 2026. This year promises to deliver a ton of AI-focused panels and announcements, and we'll be covering it all as it happens. There's going to be a bunch of tech talk, but we'll be here breaking it all down and detailing what is (or isn't) important for you.</p></div><div class="live-content"><time datetime="2026-06-02T13:07:14+00:00">June 2, 2026 – 9:07 AM</time><h2 id="agentic-ai">Agentic AI</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2688px;"><p class="vanilla-image-block" style="padding-top:57.14%;"><img id="PigKd6oZErkfFE9uMqNjLZ" name="claude4" alt="Claude 4" src="https://cdn.mos.cms.futurecdn.net/PigKd6oZErkfFE9uMqNjLZ.png" mos="" align="middle" fullscreen="" width="2688" height="1536" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Freepik)</span></figcaption></figure><p>AI will be the main focus this year at Build, but Microsoft will specifically nail down on "agentic AI." That's a term you'll hear all throughout the show, so here's a breakdown of what that is.<br><br>Right now, people use LLMs like <a href="https://www.tomsguide.com/ai/what-is-chat-gpt-5">ChatGPT</a> to ask questions. AI agents, however, can take proactive actions on your behalf. For instance, they can resolve scheduling conflicts in your calendar, collaborate with other AI agents, and handle other complex tasks.</p><p>Reports suggest that Microsoft will be bringing agents to Windows 11, which should be beneficial for developers and enthusiasts. It'll be interesting to see how Microsoft's agentic AI differs from others.</p></div><div class="live-content"><time datetime="2026-06-02T13:15:05+00:00">June 2, 2026 – 9:15 AM</time><h2 id="github-copilot">GitHub Copilot</h2><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:66.67%;"><img id="cs4j62PBe76y8WNcjEmDNK" name="GitHub Copilot" alt="GitHub Copilot" src="https://cdn.mos.cms.futurecdn.net/cs4j62PBe76y8WNcjEmDNK.jpg" mos="" align="middle" fullscreen="" width="6000" height="4000" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>GitHub is an important platform for developers, and it could become even more useful with AI agents. We could see deeper integrations with Visual Studio, VS Code, and the full dev lifecycle.</p><p>For the regular person, this could lead to higher-quality apps and faster updates. I expect to see a sizeable portion of today's show focus on GitHub Copilot.</p></div><div class="live-content"><time datetime="2026-06-02T13:22:14+00:00">June 2, 2026 – 9:22 AM</time><h2 id="nadella-s-sneak-peak">Nadella's sneak peak</h2><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2061650162460839954"><p lang="en" dir="ltr">A sneak peek at tomorrow's keynote...Tune in here at 9:30am PT: https://t.co/U30neby5yv pic.twitter.com/IQUBdL0Axc<a href="https://twitter.com/cantworkitout/status/2061650162460839954">June 2, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>On X, Microsoft CEO Satya Nadella posted a few behind-the-scenes photos of Microsoft Build. One is an offstage shot of Nadella rehearsing, and another is a shot of a filming camera. Alongside what appears to be a child cooking (likely code).</p><p>There's also an intriguing shot of something with a Microsoft logo. It's interesting because that appears to be the top of an Xbox Series X/S. I'm sure the internet will run wild speculating what that could be.</p></div><div class="live-content"><time datetime="2026-06-02T13:30:06+00:00">June 2, 2026 – 9:30 AM</time><h2 id="nvidia-rtx-spark">Nvidia RTX Spark</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="93W5viiyB7MymgN2KV3S7L" name="n1x2" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/93W5viiyB7MymgN2KV3S7L.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></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 Build is generally focused on development tools, I have to believe we'll get some talk about the recently announced Nvidia Spark CPU.</p><p>Given that the processor is meant to facilitate on-device AI, it just makes sense for Windows developers to discuss their plans for Nvidia's CPU. And let's not forget that the recently announced Microsoft Surface Laptop Ultra has an RTX Spark chip, so it's almost guaranteed we'll hear more about it.</p></div><div class="live-content"><time datetime="2026-06-02T13:45:12+00:00">June 2, 2026 – 9:45 AM</time><h2 id="windows-foundry">Windows Foundry</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1260px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="dXYZBbidZQyWFaDAfukxCM" name="Copilot" alt="Copilot" src="https://cdn.mos.cms.futurecdn.net/dXYZBbidZQyWFaDAfukxCM.png" mos="" align="middle" fullscreen="" width="1260" height="709" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Speaking of running on-device AI models, Windows Foundry is the platform that allows developers to do so on laptops and PCs using the machine's NPU, GPU, or CPU. On-device AI is important if you're working on something you'd rather not share in the cloud. I expect to see some live demos featuring on-device inference and other developer-optimized experiences.</p></div><div class="live-content"><time datetime="2026-06-02T14:00:05+00:00">June 2, 2026 – 10:00 AM</time><h2 id="copilot-super-app">Copilot super 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="733Z7yJprPYWPwPswtAudW" name="shutterstock_2496924109-16x9" alt="Copilot  on a phone with earbuds on a desk" src="https://cdn.mos.cms.futurecdn.net/733Z7yJprPYWPwPswtAudW.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>As <a href="https://x.com/testingcatalog/status/2061770738093158486" target="_blank">@testingcatalog</a> posted on X, Microsoft could debut a Copilot "super app" at Build. According to the account, this app would combine Copilot, Cowork, GitHub Copilot, and introduce a new Autopilot Scout Agent.</p><p>Take that with a grain of salt, but a Copilot super app seems like a no-brainer for developers, letting them keep all their work in one place.</p></div><div class="live-content"><time datetime="2026-06-02T14:20:06+00:00">June 2, 2026 – 10:20 AM</time><h2 id="what-about-windows-12">What about Windows 12?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="UbLuvifftVYwS8AYGbcQmJ" name="Windows 12.shutterstock_2307949187.jpg" alt="Windows 12 logo concept" src="https://cdn.mos.cms.futurecdn.net/UbLuvifftVYwS8AYGbcQmJ.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>While we’ve heard rumblings about <a href="https://www.tomsguide.com/news/windows-12">Windows 12</a> for years, there has not been official confirmation from Microsoft. Build isn’t usually an event where major software is announced, so it’s unlikely that the company will unveil Windows 12 there. However, we’ll no doubt see elements of what could end up in the operating system at the various sessions. What actually makes it into Windows 12 is anyone’s guess, however.</p></div><div class="live-content"><time datetime="2026-06-02T14:40:13+00:00">June 2, 2026 – 10:40 AM</time><h2 id="surface-laptop-ultra">Surface Laptop Ultra</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jPf82R6ASS76yFSsoeyR4A" name="Surface Laptop Ultra lede" alt="Microsoft Surface Laptop Ultra" src="https://cdn.mos.cms.futurecdn.net/jPf82R6ASS76yFSsoeyR4A.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Microsoft Build is generally about development tools, but we might get more information about the Surface Laptop Ultra. After all, it is being billed as a mobile workstation thanks to the power of Nvidia RTX Spark. I don't expect an entire segment on Microsoft's upcoming laptop, but I'd also be surprised if it wasn't brought up in some capacity.</p></div><div class="live-content"><time datetime="2026-06-02T15:10:28+00:00">June 2, 2026 – 11:10 AM</time><h2 id="azure-ai-platform">Azure AI platform</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:66.65%;"><img id="EhLfgvvziKu8toTaH5n7HX" name="Microsoft Azure" alt="Microsoft Azure" src="https://cdn.mos.cms.futurecdn.net/EhLfgvvziKu8toTaH5n7HX.jpg" mos="" align="middle" fullscreen="" width="2000" height="1333" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>While on-device AI will be a major talking point during Build, Microsoft won't neglect its cloud-based Azure platform.</p><p>To that end, expect discussions on the latest developments, including sessions detailing things like training and fine-tuning models efficiently, multi-model orchestration, and moving prototypes to production in a more cost-effective manner.</p></div><div class="live-content"><time datetime="2026-06-02T15:30:05+00:00">June 2, 2026 – 11:30 AM</time><h2 id="nvidia-at-microsoft-build">Nvidia @ Microsoft 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:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VavrDU7C56RdmnwhmHkQjM" name="Nvidia" alt="Nvidia" src="https://cdn.mos.cms.futurecdn.net/VavrDU7C56RdmnwhmHkQjM.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>It shouldn't come as a surprise that <a href="https://www.nvidia.com/en-us/events/microsoft-build/?ncid=so-twit-479557&linkId=100000424679236" target="_blank">Nvidia will be at Microsoft Build this year</a>. As I posted earlier, Team Green's new RTX Spark chip is all about on-device AI, and should be a boon for both developers and enthusiasts who want to get work done without going to the cloud.</p><p>"Join us online or in person to watch the keynote and discover how we're partnering with Microsoft to accelerate development and deployment of AI," posted the Nvidia Infrastructure account on X.</p><p>It'll be interesting to see live demos, but even if we don't, learning more about the partnership should be interesting.</p></div><div class="live-content"><time datetime="2026-06-02T16:00:07+00:00">June 2, 2026 – 12:00 PM</time><h2 id="30-minutes-left">30 minutes left!</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:720px;"><p class="vanilla-image-block" style="padding-top:69.17%;"><img id="WyjhEyKqgGvrhU5AViPL6b" name="nadella-microsoft-getty.jpg" alt="Microsoft CEO Satya Nadella standing in front of a screen displaying the Microsoft logo." src="https://cdn.mos.cms.futurecdn.net/WyjhEyKqgGvrhU5AViPL6b.jpg" mos="" align="middle" fullscreen="" width="720" height="498" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Justin Sullivan/Getty Images)</span></figcaption></figure><p>We're just half an hour from the big show! Satya Nadella will start things off with the keynote speech, and we'll then be in for a heap of AI news and updates for developers. Get. Ready!</p></div><div class="live-content"><time datetime="2026-06-02T16:15:18+00:00">June 2, 2026 – 12:15 PM</time><h2 id="setting-expectations">Setting expectations</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1688px;"><p class="vanilla-image-block" style="padding-top:66.65%;"><img id="X7NHNrLg4WLwzMxaiWpoe6" name="MSFT_earnings_2026_BLOGHERO" alt="A composite shot with Satya Nadella on the left and a Microsoft store on the right" src="https://cdn.mos.cms.futurecdn.net/X7NHNrLg4WLwzMxaiWpoe6.jpg" mos="" align="middle" fullscreen="" width="1688" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Fabrice Coffrini/Getty)</span></figcaption></figure><p>I know it's fun to get hyped over events, but I wanted to set expectations for Microsoft Build, so you won't be disappointed.</p><p>While new hardware or consumer features might be announced, the core of Build is centered on developers. This year specifically, we'll see a lot of talk about AI tools and agentic AI. Sure, this won't be an event like WWDC or Google I/O, but it's fascinating to learn about the tools that devs will use to make the apps we use work better.</p></div><div class="live-content"><time datetime="2026-06-02T16:25:40+00:00">June 2, 2026 – 12:25 PM</time><h2 id="5-minutes">5 minutes!</h2><p>I hope you've got yourself a nice snack, a tasty drink, and a comfortable seat, because the show is about to start!</p></div><div class="live-content"><time datetime="2026-06-02T16:33:14+00:00">June 2, 2026 – 12:33 PM</time><h2 id="microsoft-build-2026-is-officially-underway">Microsoft Build 2026 is officially underway!</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="7GFfQwRgbZWKZPtAtiRNXS" name="Microsoft Build 2026 logo" alt="Microsoft Build 2026 logo" src="https://cdn.mos.cms.futurecdn.net/7GFfQwRgbZWKZPtAtiRNXS.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Microsoft Build 2026 has started! Keep it locked here for all the latest updates as they happen.</p></div><div class="live-content"><time datetime="2026-06-02T16:36:00+00:00">June 2, 2026 – 12:36 PM</time><h2 id="satya-hits-the-stage">Satya hits the stage!</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4P5qERFHQHGjFQdxEtwGz4" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 23-40 screenshot" alt="Microsoft Build 2026 CEO on stage" src="https://cdn.mos.cms.futurecdn.net/4P5qERFHQHGjFQdxEtwGz4.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Only a few minutes late, Satya Nadella finally hits the stage for Microsoft Build 2026.</p><p>He says the key takeaway is how developers manage in this new AI frontier. The conference will discuss the tech stack, including infrastructure, models, agent runtime, and developer tools.</p></div><div class="live-content"><time datetime="2026-06-02T16:39:49+00:00">June 2, 2026 – 12:39 PM</time><h2 id="unmetered-intelligence">Unmetered intelligence</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="MjB6oZ25NvguPxzrF6gRRX" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 27-54 screenshot" alt="Microsoft Build 2026 surface" src="https://cdn.mos.cms.futurecdn.net/MjB6oZ25NvguPxzrF6gRRX.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Nadella is now discussing the company's vision for on-device AI, which will take AI use and development away from the cloud and to one's PC. To that end, Microsoft is expanding Windows AI APIs to more PCs.</p><p>A new program called Aion 1.0 Plan will have local reasoning and tools calling for agentic apps. Processors from AMD, Intel, and Qualcomm will make this happen. And of course, Nvidia RTX Spark. One of the first devices built for on-device AI will be the Surface Laptop Ultra.</p></div><div class="live-content"><time datetime="2026-06-02T16:43:04+00:00">June 2, 2026 – 12:43 PM</time><h2 id="pushing-the-architecture-to-the-limit">Pushing the architecture to the limit</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ouHBHSkyjsh8bMzVvAUTUo" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 30-16 screenshot" alt="Microsoft Build 2026 Surface CEO" src="https://cdn.mos.cms.futurecdn.net/ouHBHSkyjsh8bMzVvAUTUo.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Surface RTX Spark dev box has been unveiled. This was that Xbox-like image we saw from Nadella's post on X earlier today. So, no, it's not Project Helix.</p><p>This device will have 1 petaflop of AI compute, 20 CPU cores, and 128GB of unified RAM. Those are some of the expected specs for RTX Spark. Expect 1 trillion parameters of local compute, which is pretty wild. It's basically a data center on your desktop.</p></div><div class="live-content"><time datetime="2026-06-02T16:46:35+00:00">June 2, 2026 – 12:46 PM</time><h2 id="a-live-demo">A live demo</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="7kVEtHdydCjs4SPbxaVEnS" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 34-23 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/7kVEtHdydCjs4SPbxaVEnS.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft )</span></figcaption></figure><p>Kayla Cinnamon takes the stage to show some live demonstrations for developers to use on the Surface RTX Spark dev box. Python and other dev tools will be available on the RTX Spark dev box and on other Windows machines.</p></div><div class="live-content"><time datetime="2026-06-02T16:49:40+00:00">June 2, 2026 – 12:49 PM</time><h2 id="using-ai-agents-for-development">Using AI agents for development</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="D9johNJvLqCZfEGcLB5Z7c" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 35-52 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/D9johNJvLqCZfEGcLB5Z7c.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>We see Kayla using an agent to help her on a development project. You can use simple commands to make otherwise complex tasks easier. Many tools will come preconfigured. Not only can devs issue typed commands, but they can also issue voice commands.</p></div><div class="live-content"><time datetime="2026-06-02T16:53:43+00:00">June 2, 2026 – 12:53 PM</time><h2 id="using-the-cloud-and-minimizing-the-impact-of-ai-use">Using the cloud and minimizing the impact of AI use</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bMCV95m33W7s68Fs4F24VM" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 40-43 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/bMCV95m33W7s68Fs4F24VM.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft Build 2026)</span></figcaption></figure><p>Satya Nadella returns, and now we're talking about the cloud. There's a lot that goes into using AI, and some of it can get downright expensive. To that end, Microsoft has a community-first plan to minimize the impact on the environment and on people's electricity bills.</p></div><div class="live-content"><time datetime="2026-06-02T16:56:04+00:00">June 2, 2026 – 12:56 PM</time><h2 id="an-ai-super-center">An AI super center</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="UXqNH2SYEjcTSvqA7eeDwZ" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 42-40 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/UXqNH2SYEjcTSvqA7eeDwZ.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft Build 2026)</span></figcaption></figure><p>Nadella is now discussing how to build data centers that have minimal environmental impact. This means minimizing water usage to what a single restaurant would use, for example. Again, this will be done in partnership with AMD, Intel, and Nvidia.</p></div><div class="live-content"><time datetime="2026-06-02T16:58:57+00:00">June 2, 2026 – 12:58 PM</time><h2 id="cobalt-200">Cobalt 200</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="T4mBi8NX88vqAfSbPeT94m" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 44-24 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/T4mBi8NX88vqAfSbPeT94m.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft Build 2026)</span></figcaption></figure><p>New Azure Cobalt 200 VMs deliver a 50% performance improvement and are fully optimized for modern agentic AI workloads.</p><p>"Cobalt 200 is purpose-built from silicon to servers to services—integrating Microsoft’s latest innovations in security, networking, storage, and offload to outperform traditional Arm-based compute," says a <a href="https://azure.microsoft.com/en-us/blog/new-azure-cobalt-200-vms-deliver-50-performance-improvement-fully-optimized-for-modern-agentic-ai-workloads/" target="_blank">blog post</a> on Microsoft Azure website.</p></div><div class="live-content"><time datetime="2026-06-02T17:02:06+00:00">June 2, 2026 – 1:02 PM</time><h2 id="jensen-huang-makes-a-guest-appearance">Jensen Huang makes a guest appearance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kPDyNXPMYqc9KjbTF9CPGX" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 49-22 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/kPDyNXPMYqc9KjbTF9CPGX.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Nvidia CEO Jensen Huang makes a guest appearance to discuss Nvidia RTX Spark.</p><p>Jensen details how Nvidia has created a chip that's purpose-built for AI. Using Windows apps, RTX Spark-powered machines could be the next major step in computing. Users can have agents perform tasks on their behalf without being there. Jensen says the personal PC has become a personal AI.</p></div><div class="live-content"><time datetime="2026-06-02T17:06:03+00:00">June 2, 2026 – 1:06 PM</time><h2 id="discussing-the-evolution-of-ai-development">Discussing the evolution of AI development</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="tPhJVsmiJz9SgzrDp6Z9uM" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 47-57 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/tPhJVsmiJz9SgzrDp6Z9uM.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft )</span></figcaption></figure><p>Nvidia and Microsoft have worked to make AI more efficient and also use less energy, all while making AI more useful. This is how we have arrived at AI agents that can run on a user's PC rather than in the cloud, which is facilitated by giant AI data centers.</p></div><div class="live-content"><time datetime="2026-06-02T17:09:51+00:00">June 2, 2026 – 1:09 PM</time><h2 id="agentic-ai-is-the-next-step">Agentic AI is the next step</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="y8FpeJgckppnC89MABJkbJ" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 47-24 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/y8FpeJgckppnC89MABJkbJ.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Until now, AI has involved asking questions. With agents, users can effectively have an assistant working on their behalf. Jensen says the aim is to make agents faster and ultimately make using them profitable.</p></div><div class="live-content"><time datetime="2026-06-02T17:15:39+00:00">June 2, 2026 – 1:15 PM</time><h2 id="new-form-factors-for-the-agent-era">New form factors for the agent era</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="TJfeg7PvBNBYhUeiPfY8z4" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 59-35 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/TJfeg7PvBNBYhUeiPfY8z4.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Project Solara is a new chip-to-cloud platform designed to make using agents more seamless. The devices in question resemble a smart clock and a work ID badge rather than traditional PCs or laptops. This is designed for places where traditional devices aren't available or aren't optimal. Azure will tie all this together.</p></div><div class="live-content"><time datetime="2026-06-02T17:18:17+00:00">June 2, 2026 – 1:18 PM</time><h2 id="project-solara-devices">Project Solara devices</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="TrtGEGQFzaNsZYPacDHKth" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 1-5-23 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/TrtGEGQFzaNsZYPacDHKth.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>The smart clock-like device is meant to remain stationary, while the ID badge is meant to go with you. You can use your fingerprint to unlock the latter, which is pretty cool. You can even record video with the badge and give it voice instructions. It will clean up whatever you said and send it to your team.</p></div><div class="live-content"><time datetime="2026-06-02T17:23:09+00:00">June 2, 2026 – 1:23 PM</time><h2 id="a-chat-with-qualcomm-s-ceo">A chat with Qualcomm's CEO</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="T6rhtvGWGdjycWX8nEZaCK" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 1-8-59 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/T6rhtvGWGdjycWX8nEZaCK.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Qualcomm CEO Cristiano Amon sits down with Satya Nadella to discuss AI agents across different devices, including the ID badge prototype. Amon says this will change the definition of wearables and AI form factors in general. The smartphone might have a great design, but it may not be ideal for every use case.</p></div><div class="live-content"><time datetime="2026-06-02T17:28:17+00:00">June 2, 2026 – 1:28 PM</time><h2 id="discussing-models">Discussing Models</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GbnAj8ZBNuBoJFKs6n7YRB" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 1-14-48 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/GbnAj8ZBNuBoJFKs6n7YRB.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>We're now on to the next layer in the stack: models. Right now, Windows Foundry has 11,000 models. When building an agentic system, it's important that it supports various models depending on specific needs or preferences.</p><p>A new service called Azure HorizonDB has been announced. It can scale with the projects it works on, which should help developers.</p></div><div class="live-content"><time datetime="2026-06-02T17:32:32+00:00">June 2, 2026 – 1:32 PM</time><h2 id="web-iq-announced">Web IQ announced</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="BHcZSX6wbj2akoVisQZZYe" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 1-19-13 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/BHcZSX6wbj2akoVisQZZYe.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>WebIQ has been updated to support AI agents that use the web to deliver the latest updates, helping devs build agentic systems.</p><p>Elijah Straight takes the stage to detail how WebIQ works. The long-running agent will produce a brief for the user to respond accordingly. The agent was built in Foundry and was then published to 365 for the entire team to use. When asked a question, WebIQ sources the web to deliver the latest information.</p></div><div class="live-content"><time datetime="2026-06-02T17:35:59+00:00">June 2, 2026 – 1:35 PM</time><h2 id="bespoke-answers">Bespoke answers</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="tuNQAgHR3SUd6uVajcpnZ" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 1-20-40 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/tuNQAgHR3SUd6uVajcpnZ.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>WebIQ won't just give you generic answers, but will use your knowledge (such as your company's guidelines) to give you applicable answers.</p></div><div class="live-content"><time datetime="2026-06-02T17:42:15+00:00">June 2, 2026 – 1:42 PM</time><h2 id="openclaw-on-windows">OpenClaw on Windows</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="dAuXV6mBq9dQLT84fNqPvG" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 1-30-7 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/dAuXV6mBq9dQLT84fNqPvG.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>OpenClaw is coming to Windows. Scott Hanselman and Samantha Song are on stage discussing how they each use their OpenClaw agents and are doing a live demo. We see everything the OpenClaw is tackling, along with other options you can configure to make the agent do exactly what you need.</p></div><div class="live-content"><time datetime="2026-06-02T17:44:55+00:00">June 2, 2026 – 1:44 PM</time><h2 id="using-openclaw-to-clean-your-desktop">Using OpenClaw to clean your desktop</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="TwoBjacwmLvBoz83Uw7XC7" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 1-28-26 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/TwoBjacwmLvBoz83Uw7XC7.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>During the demo, we see how you can have an OpenClaw agent clean up your desktop. It's a small thing, but it goes to show how agents are ready to help you with any task... no matter how trivial they might seem.</p></div><div class="live-content"><time datetime="2026-06-02T17:48:28+00:00">June 2, 2026 – 1:48 PM</time><h2 id="openclaw-founder-takes-the-stage">OpenClaw founder takes the stage</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4q3cgxDDdwiForz3TZsc5n" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 1-34-41 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/4q3cgxDDdwiForz3TZsc5n.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>OpenClaw founder Peter Steinberger briefly takes the stage to discuss OpenClaw coming to Windows. To bring the point home, Scott said this was the first time we have seen OpenClaw running on the Surface Laptop Ultra... which is true, since that device was just announced.</p></div><div class="live-content"><time datetime="2026-06-02T17:51:18+00:00">June 2, 2026 – 1:51 PM</time><h2 id="developer-tools">Developer tools</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="sjnWFhoE2vmwDeWNvpGkVM" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 1-37-55 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/sjnWFhoE2vmwDeWNvpGkVM.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>We're now talking about Developer Tools. This is where GitHub comes into play, as it has been a great resource for developers.</p></div><div class="live-content"><time datetime="2026-06-02T17:54:58+00:00">June 2, 2026 – 1:54 PM</time><h2 id="github-copilot-app-announced">GitHub Copilot app announced</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="j67VhT4fCfi4HtCFLh5QFo" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 1-42-2 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/j67VhT4fCfi4HtCFLh5QFo.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>As rumors suggested, GitHub Copilot is getting an app. Development tools are now being rolled out.</p><p>Cassidy Williams takes the stage to show the app. This app will be the home base for developers. In the demo, Cassidy has the app work on multiple projects at once without agents stepping on each other. You can then use agent merge to bring it all together.</p></div><div class="live-content"><time datetime="2026-06-02T17:58:31+00:00">June 2, 2026 – 1:58 PM</time><h2 id="canvas-demo">Canvas demo</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XxiYmpcvGrvAUFSbeYsQZS" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 1-45-50 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/XxiYmpcvGrvAUFSbeYsQZS.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>We see a demo of the agent using a live video feed of Cassidy, which showcases the multimodal capabilities of the GitHub Copilot app.</p></div><div class="live-content"><time datetime="2026-06-02T18:01:47+00:00">June 2, 2026 – 2:01 PM</time><h2 id="security">Security</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RpxtQZ7HWGAr23zPLQBWgn" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 1-48-34 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/RpxtQZ7HWGAr23zPLQBWgn.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Now, let's discuss security and safety when using AI agents. Agent 365 SDK will be one of the tools to help with this.</p><p>Amanda Foster takes the stage to show how this works. With a simple prompt, all the agents are protected and will also keep one's data secure.</p></div><div class="live-content"><time datetime="2026-06-02T18:05:05+00:00">June 2, 2026 – 2:05 PM</time><h2 id="agents-get-better-the-more-they-re-used">Agents get better the more they're used</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="y3hztquNqU5LJyLAJfphrH" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 1-51-34 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/y3hztquNqU5LJyLAJfphrH.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>One interesting thing is that agents will learn from experience and improve themselves through updates, depending on the tasks they are asked to do. All of this has to be approved by admins, so agents can't just do whatever they want.</p></div><div class="live-content"><time datetime="2026-06-02T18:09:09+00:00">June 2, 2026 – 2:09 PM</time><h2 id="security-with-ai">Security with AI</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GceqdBHxyVJCBXvsvGWJT6" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 1-57-5 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/GceqdBHxyVJCBXvsvGWJT6.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Sarah Young, Director of Security, takes the stage to show how AI can be used for security. Agents work together to analyze potential scams and determine which vulnerability was exploited to gain access to a system. You can then use these agents to clean up the code and see what it has done. This can be done locally and uploaded to GitHub Security.</p></div><div class="live-content"><time datetime="2026-06-02T18:13:49+00:00">June 2, 2026 – 2:13 PM</time><h2 id="chainsmokers-take-the-stage">Chainsmokers take the stage</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LJovVkqYpaAAz9nbvJFcyP" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 1-59-51 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/LJovVkqYpaAAz9nbvJFcyP.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Alex Pall and Drew Taggart from the Chainsmokers take the stage. In case you don't know (which I certainly don't), they're musicians who are also developers. This seems like the obligatory celebrity cameo, but it seems the folks watching live appreciate it.</p></div><div class="live-content"><time datetime="2026-06-02T18:18:50+00:00">June 2, 2026 – 2:18 PM</time><h2 id="autopilots">Autopilots</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="MDrGE4aNGrtTTNSTATEcW7" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 2-4-25 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/MDrGE4aNGrtTTNSTATEcW7.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Autopilots are enterprise-grade, long-running agents. The first one being introduced is called Scout. The sizzle reel shows a user asking Scout to handle several tasks simultaneously. Scout works where you work, no matter what app it might be. It's available today to developers.</p></div><div class="live-content"><time datetime="2026-06-02T18:26:38+00:00">June 2, 2026 – 2:26 PM</time><h2 id="microsoft-ai">Microsoft AI</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9QKPSWHezJ5sP2VZbuJH2T" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 2-14-27 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/9QKPSWHezJ5sP2VZbuJH2T.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Mustafa Suleyman, chief of Microsoft AI, takes the stage to discuss Microsoft AI. He discusses how AI has grown over the years and how it will continue to grow. Mustafa says it has to be AI that prioritizes humans.</p><p>A family of new models will help with this, all under the MAI umbrella. This includes MAI Image 2.5 for visual work, MAI Transcribe 1.5 for transcribing (in multiple languages), and more. All of this is rolling out right now.</p></div><div class="live-content"><time datetime="2026-06-02T18:30:24+00:00">June 2, 2026 – 2:30 PM</time><h2 id="mai-models-coming-to-rtx-spark">MAI models coming to RTX Spark</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="oMUFtqgEr2ng54eqN9hwRW" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 2-14-46 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/oMUFtqgEr2ng54eqN9hwRW.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Despite calling it "N1X," Mustafa said these MAI models will be available for RTX Spark machines. Given the different use cases for MAI, such as voice, text, and video generation, it'll be interesting to see what RTX Spark can do.</p></div><div class="live-content"><time datetime="2026-06-02T18:34:42+00:00">June 2, 2026 – 2:34 PM</time><h2 id="microsoft-mayo-clinic">Microsoft + Mayo Clinic</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="tXKUX7e22faB7pYFz38v5J" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 2-20-20 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/tXKUX7e22faB7pYFz38v5J.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>President and CEO of the Mayo Clinic, Gianrico Farrugia, takes the stage to discuss the company's partnership with Microsoft. The aim is to build a frontier model to help patients.</p></div><div class="live-content"><time datetime="2026-06-02T18:37:45+00:00">June 2, 2026 – 2:37 PM</time><h2 id="mai-thinking-demo">MAI Thinking demo</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jRRyesE2vT977L37ZnaGp6" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 2-25-44 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/jRRyesE2vT977L37ZnaGp6.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Tanaya Yadav, senior product manager, takes the stage to show how MAI Thinking works. The demo focuses on training agents to do what you need them to do. This can take hours, but it should result in agents that are more useful.</p></div><div class="live-content"><time datetime="2026-06-02T18:46:47+00:00">June 2, 2026 – 2:46 PM</time><h2 id="microsoft-discovery-for-science">Microsoft Discovery for science</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="w6YP3CPoVsjknw323fqjD3" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 2-32-17 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/w6YP3CPoVsjknw323fqjD3.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>David Carmona takes the stage to discuss how Microsoft Discovery is being used to help scientists improve plastic recycling. The agents use scientific principles to figure this out, and David said it could take hours or days, just like real scientists would. This shows how agents can be tailored to perform specific tasks and not just dish out generic (and wrong) answers.</p></div><div class="live-content"><time datetime="2026-06-02T18:50:21+00:00">June 2, 2026 – 2:50 PM</time><h2 id="a-science-class-on-stage">A science class on stage</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RGgwa9zhQBxKzHPagZcbVB" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 2-33-34 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/RGgwa9zhQBxKzHPagZcbVB.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>I don't know about you, but chemistry goes way over my head. Still, it's impressive to see scientists using these tools to help mankind.</p></div><div class="live-content"><time datetime="2026-06-02T18:53:12+00:00">June 2, 2026 – 2:53 PM</time><h2 id="quantum-computing">Quantum computing</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="dhQLgMhjX5Wms8JYffvHn7" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 2-40-1 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/dhQLgMhjX5Wms8JYffvHn7.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Now we're talking about quantum computing, which is likely the next frontier in computing. Majorana 2 is a processor that will be used for creating scalable quantum computing. It's capable of 1-microsecond operations, which is something that's quite mind-boggling.</p></div><div class="live-content"><time datetime="2026-06-02T18:56:02+00:00">June 2, 2026 – 2:56 PM</time><h2 id="and-that-s-a-wrap">And that's a wrap</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="yoF85xEbk87P5JuAyCBpZR" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 2-43-2 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/yoF85xEbk87P5JuAyCBpZR.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Microsoft Build is officially over! That was certainly a firehose of information, but hopefully it will help developers actually make folks' lives easier and do so affordably.</p></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/news/live/microsoft-build-2026</link>
                                                                            <description>
                            <![CDATA[ Microsoft Build 2026 has just concluded, delivering a slew of agentic AI tools for developers. Here are the biggest highlights. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">5aRThMzBZ9qJsZCT9kScXK</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/h9wzPwfnmJUo5J9J6F3VNj-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 02 Jun 2026 13:00:09 +0000</pubDate>                                                                                                                                <updated>Tue, 02 Jun 2026 21:50:20 +0000</updated>
                                                                                                                                            <category><![CDATA[Computing]]></category>
                                                                                                <author><![CDATA[ tony.polanco@futurenet.com (Tony Polanco) ]]></author>                    <dc:creator><![CDATA[ Tony Polanco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/atzRNqFt5wYgEUPBDahWsD.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/h9wzPwfnmJUo5J9J6F3VNj-1280-80.jpg">
                                                            <media:credit><![CDATA[Microsoft]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Microsoft Build 2026]]></media:description>                                                            <media:text><![CDATA[Microsoft Build 2026]]></media:text>
                                <media:title type="plain"><![CDATA[Microsoft Build 2026]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/h9wzPwfnmJUo5J9J6F3VNj-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div class="live-content"><p>Microsoft Build 2026 is over, and as expected, Satya Nadella’s keynote was all about agentic systems, or AI that acts on your behalf without direct supervision. To that end, several features and applications were introduced.</p><p>This includes Microsoft IQ, which is now generally available across GitHub Copilot, Foundry, and Copilot Studios. It’s the new context layer that feeds AI agents real workplace knowledge (Work IQ from M365 Signals), structured business data (Fabric IQ), and fast web grounding via the new Web IQ. Frontier Tuning, available in private preview, allows agents to learn how your business operates within your compliance boundaries.</p><p>Developers got some practical upgrades to the tooling. For instance, the GitHub Copilot app (now available in preview) brings agentic workflows to a native desktop experience. Project Rayfin (also in preview) tackles the prototype-to-production gap by providing developers with a managed backend-as-a-service on Microsoft Fabric, built on GitHub-defined workflows.</p><p>We also got to see some hardware in the form of the Surface RTX Spark Dev Box, which targets sustained workloads, with up to 1 petaflop of AI compute and 128GB of unified memory, capable of running 120B-parameter models locally without driving up costs.</p><p>Seven new MAI models were introduced, including the MAI-Thinking-1 reasoning model and MAI-Code-1, which is tuned specifically for GitHub and VS Code. Speaking of multi-model support, Azure AI Foundry can also pick the right model for a task, so you won’t be locked in.</p><p>Now that the presentation is over, feel free to watch the embedded video and read my posts. For more details, you can also read <a href="https://blogs.windows.com/windowsdeveloper/2026/06/02/build-2026-furthering-windows-as-the-trusted-platform-for-development/" target="_blank"><u>Microsoft’s Build 2026 recap post</u></a>.</p><h3 class="article-body__section" id="section-microsoft-build-2026-highlights"><span>Microsoft Build 2026 highlights</span></h3><ul><li>Microsoft IQ is now available</li><li>Seven new MAI models announced</li><li><a href="https://blogs.windows.com/devices/2026/06/02/building-the-next-generation-of-devices-for-developers-surface-rtx-spark-dev-box/" target="_blank">Surface RTX Spark Dev Box</a> brings serious AI horsepower</li><li>GitHub Copilot app enters preview</li><li>Agent 365 delivers quick fixes</li></ul><h3 class="article-body__section" id="section-watch-microsoft-build-2026-with-us"><span>Watch Microsoft Build 2026 with us</span></h3><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/HG0twQJ7aG4" allowfullscreen></iframe></div></div><h3 class="article-body__section" id="section-live-latest-updates"><span>Live: Latest updates</span></h3></div><div class="live-content"><time datetime="2026-06-01T15:09:22+00:00">June 1, 2026 – 11:09 AM</time><h2 id="microsoft-build-2026-is-almost-here">Microsoft Build 2026 is almost here</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3423px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="KQbE8W9xF5htWqfEL2b2K5" name="Microsoft HQ" alt="View of Microsoft Romania headquarters in City Gate Towers situated in Free Press Square, in Bucharest, Romania" src="https://cdn.mos.cms.futurecdn.net/KQbE8W9xF5htWqfEL2b2K5.jpg" mos="" align="middle" fullscreen="" width="3423" height="1925" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Getty Images)</span></figcaption></figure><p>Hello, everyone, and welcome to our live coverage of Microsoft Build 2026. This year promises to deliver a ton of AI-focused panels and announcements, and we'll be covering it all as it happens. There's going to be a bunch of tech talk, but we'll be here breaking it all down and detailing what is (or isn't) important for you.</p></div><div class="live-content"><time datetime="2026-06-02T13:07:14+00:00">June 2, 2026 – 9:07 AM</time><h2 id="agentic-ai">Agentic AI</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2688px;"><p class="vanilla-image-block" style="padding-top:57.14%;"><img id="PigKd6oZErkfFE9uMqNjLZ" name="claude4" alt="Claude 4" src="https://cdn.mos.cms.futurecdn.net/PigKd6oZErkfFE9uMqNjLZ.png" mos="" align="middle" fullscreen="" width="2688" height="1536" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Freepik)</span></figcaption></figure><p>AI will be the main focus this year at Build, but Microsoft will specifically nail down on "agentic AI." That's a term you'll hear all throughout the show, so here's a breakdown of what that is.<br><br>Right now, people use LLMs like <a href="https://www.tomsguide.com/ai/what-is-chat-gpt-5">ChatGPT</a> to ask questions. AI agents, however, can take proactive actions on your behalf. For instance, they can resolve scheduling conflicts in your calendar, collaborate with other AI agents, and handle other complex tasks.</p><p>Reports suggest that Microsoft will be bringing agents to Windows 11, which should be beneficial for developers and enthusiasts. It'll be interesting to see how Microsoft's agentic AI differs from others.</p></div><div class="live-content"><time datetime="2026-06-02T13:15:05+00:00">June 2, 2026 – 9:15 AM</time><h2 id="github-copilot">GitHub Copilot</h2><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:66.67%;"><img id="cs4j62PBe76y8WNcjEmDNK" name="GitHub Copilot" alt="GitHub Copilot" src="https://cdn.mos.cms.futurecdn.net/cs4j62PBe76y8WNcjEmDNK.jpg" mos="" align="middle" fullscreen="" width="6000" height="4000" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>GitHub is an important platform for developers, and it could become even more useful with AI agents. We could see deeper integrations with Visual Studio, VS Code, and the full dev lifecycle.</p><p>For the regular person, this could lead to higher-quality apps and faster updates. I expect to see a sizeable portion of today's show focus on GitHub Copilot.</p></div><div class="live-content"><time datetime="2026-06-02T13:22:14+00:00">June 2, 2026 – 9:22 AM</time><h2 id="nadella-s-sneak-peak">Nadella's sneak peak</h2><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2061650162460839954"><p lang="en" dir="ltr">A sneak peek at tomorrow's keynote...Tune in here at 9:30am PT: https://t.co/U30neby5yv pic.twitter.com/IQUBdL0Axc<a href="https://twitter.com/cantworkitout/status/2061650162460839954">June 2, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>On X, Microsoft CEO Satya Nadella posted a few behind-the-scenes photos of Microsoft Build. One is an offstage shot of Nadella rehearsing, and another is a shot of a filming camera. Alongside what appears to be a child cooking (likely code).</p><p>There's also an intriguing shot of something with a Microsoft logo. It's interesting because that appears to be the top of an Xbox Series X/S. I'm sure the internet will run wild speculating what that could be.</p></div><div class="live-content"><time datetime="2026-06-02T13:30:06+00:00">June 2, 2026 – 9:30 AM</time><h2 id="nvidia-rtx-spark">Nvidia RTX Spark</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="93W5viiyB7MymgN2KV3S7L" name="n1x2" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/93W5viiyB7MymgN2KV3S7L.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></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 Build is generally focused on development tools, I have to believe we'll get some talk about the recently announced Nvidia Spark CPU.</p><p>Given that the processor is meant to facilitate on-device AI, it just makes sense for Windows developers to discuss their plans for Nvidia's CPU. And let's not forget that the recently announced Microsoft Surface Laptop Ultra has an RTX Spark chip, so it's almost guaranteed we'll hear more about it.</p></div><div class="live-content"><time datetime="2026-06-02T13:45:12+00:00">June 2, 2026 – 9:45 AM</time><h2 id="windows-foundry">Windows Foundry</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1260px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="dXYZBbidZQyWFaDAfukxCM" name="Copilot" alt="Copilot" src="https://cdn.mos.cms.futurecdn.net/dXYZBbidZQyWFaDAfukxCM.png" mos="" align="middle" fullscreen="" width="1260" height="709" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Speaking of running on-device AI models, Windows Foundry is the platform that allows developers to do so on laptops and PCs using the machine's NPU, GPU, or CPU. On-device AI is important if you're working on something you'd rather not share in the cloud. I expect to see some live demos featuring on-device inference and other developer-optimized experiences.</p></div><div class="live-content"><time datetime="2026-06-02T14:00:05+00:00">June 2, 2026 – 10:00 AM</time><h2 id="copilot-super-app">Copilot super 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="733Z7yJprPYWPwPswtAudW" name="shutterstock_2496924109-16x9" alt="Copilot  on a phone with earbuds on a desk" src="https://cdn.mos.cms.futurecdn.net/733Z7yJprPYWPwPswtAudW.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>As <a href="https://x.com/testingcatalog/status/2061770738093158486" target="_blank">@testingcatalog</a> posted on X, Microsoft could debut a Copilot "super app" at Build. According to the account, this app would combine Copilot, Cowork, GitHub Copilot, and introduce a new Autopilot Scout Agent.</p><p>Take that with a grain of salt, but a Copilot super app seems like a no-brainer for developers, letting them keep all their work in one place.</p></div><div class="live-content"><time datetime="2026-06-02T14:20:06+00:00">June 2, 2026 – 10:20 AM</time><h2 id="what-about-windows-12">What about Windows 12?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="UbLuvifftVYwS8AYGbcQmJ" name="Windows 12.shutterstock_2307949187.jpg" alt="Windows 12 logo concept" src="https://cdn.mos.cms.futurecdn.net/UbLuvifftVYwS8AYGbcQmJ.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>While we’ve heard rumblings about <a href="https://www.tomsguide.com/news/windows-12">Windows 12</a> for years, there has not been official confirmation from Microsoft. Build isn’t usually an event where major software is announced, so it’s unlikely that the company will unveil Windows 12 there. However, we’ll no doubt see elements of what could end up in the operating system at the various sessions. What actually makes it into Windows 12 is anyone’s guess, however.</p></div><div class="live-content"><time datetime="2026-06-02T14:40:13+00:00">June 2, 2026 – 10:40 AM</time><h2 id="surface-laptop-ultra">Surface Laptop Ultra</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jPf82R6ASS76yFSsoeyR4A" name="Surface Laptop Ultra lede" alt="Microsoft Surface Laptop Ultra" src="https://cdn.mos.cms.futurecdn.net/jPf82R6ASS76yFSsoeyR4A.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Microsoft Build is generally about development tools, but we might get more information about the Surface Laptop Ultra. After all, it is being billed as a mobile workstation thanks to the power of Nvidia RTX Spark. I don't expect an entire segment on Microsoft's upcoming laptop, but I'd also be surprised if it wasn't brought up in some capacity.</p></div><div class="live-content"><time datetime="2026-06-02T15:10:28+00:00">June 2, 2026 – 11:10 AM</time><h2 id="azure-ai-platform">Azure AI platform</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:66.65%;"><img id="EhLfgvvziKu8toTaH5n7HX" name="Microsoft Azure" alt="Microsoft Azure" src="https://cdn.mos.cms.futurecdn.net/EhLfgvvziKu8toTaH5n7HX.jpg" mos="" align="middle" fullscreen="" width="2000" height="1333" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>While on-device AI will be a major talking point during Build, Microsoft won't neglect its cloud-based Azure platform.</p><p>To that end, expect discussions on the latest developments, including sessions detailing things like training and fine-tuning models efficiently, multi-model orchestration, and moving prototypes to production in a more cost-effective manner.</p></div><div class="live-content"><time datetime="2026-06-02T15:30:05+00:00">June 2, 2026 – 11:30 AM</time><h2 id="nvidia-at-microsoft-build">Nvidia @ Microsoft 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:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VavrDU7C56RdmnwhmHkQjM" name="Nvidia" alt="Nvidia" src="https://cdn.mos.cms.futurecdn.net/VavrDU7C56RdmnwhmHkQjM.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>It shouldn't come as a surprise that <a href="https://www.nvidia.com/en-us/events/microsoft-build/?ncid=so-twit-479557&linkId=100000424679236" target="_blank">Nvidia will be at Microsoft Build this year</a>. As I posted earlier, Team Green's new RTX Spark chip is all about on-device AI, and should be a boon for both developers and enthusiasts who want to get work done without going to the cloud.</p><p>"Join us online or in person to watch the keynote and discover how we're partnering with Microsoft to accelerate development and deployment of AI," posted the Nvidia Infrastructure account on X.</p><p>It'll be interesting to see live demos, but even if we don't, learning more about the partnership should be interesting.</p></div><div class="live-content"><time datetime="2026-06-02T16:00:07+00:00">June 2, 2026 – 12:00 PM</time><h2 id="30-minutes-left">30 minutes left!</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:720px;"><p class="vanilla-image-block" style="padding-top:69.17%;"><img id="WyjhEyKqgGvrhU5AViPL6b" name="nadella-microsoft-getty.jpg" alt="Microsoft CEO Satya Nadella standing in front of a screen displaying the Microsoft logo." src="https://cdn.mos.cms.futurecdn.net/WyjhEyKqgGvrhU5AViPL6b.jpg" mos="" align="middle" fullscreen="" width="720" height="498" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Justin Sullivan/Getty Images)</span></figcaption></figure><p>We're just half an hour from the big show! Satya Nadella will start things off with the keynote speech, and we'll then be in for a heap of AI news and updates for developers. Get. Ready!</p></div><div class="live-content"><time datetime="2026-06-02T16:15:18+00:00">June 2, 2026 – 12:15 PM</time><h2 id="setting-expectations">Setting expectations</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1688px;"><p class="vanilla-image-block" style="padding-top:66.65%;"><img id="X7NHNrLg4WLwzMxaiWpoe6" name="MSFT_earnings_2026_BLOGHERO" alt="A composite shot with Satya Nadella on the left and a Microsoft store on the right" src="https://cdn.mos.cms.futurecdn.net/X7NHNrLg4WLwzMxaiWpoe6.jpg" mos="" align="middle" fullscreen="" width="1688" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Fabrice Coffrini/Getty)</span></figcaption></figure><p>I know it's fun to get hyped over events, but I wanted to set expectations for Microsoft Build, so you won't be disappointed.</p><p>While new hardware or consumer features might be announced, the core of Build is centered on developers. This year specifically, we'll see a lot of talk about AI tools and agentic AI. Sure, this won't be an event like WWDC or Google I/O, but it's fascinating to learn about the tools that devs will use to make the apps we use work better.</p></div><div class="live-content"><time datetime="2026-06-02T16:25:40+00:00">June 2, 2026 – 12:25 PM</time><h2 id="5-minutes">5 minutes!</h2><p>I hope you've got yourself a nice snack, a tasty drink, and a comfortable seat, because the show is about to start!</p></div><div class="live-content"><time datetime="2026-06-02T16:33:14+00:00">June 2, 2026 – 12:33 PM</time><h2 id="microsoft-build-2026-is-officially-underway">Microsoft Build 2026 is officially underway!</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="7GFfQwRgbZWKZPtAtiRNXS" name="Microsoft Build 2026 logo" alt="Microsoft Build 2026 logo" src="https://cdn.mos.cms.futurecdn.net/7GFfQwRgbZWKZPtAtiRNXS.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Microsoft Build 2026 has started! Keep it locked here for all the latest updates as they happen.</p></div><div class="live-content"><time datetime="2026-06-02T16:36:00+00:00">June 2, 2026 – 12:36 PM</time><h2 id="satya-hits-the-stage">Satya hits the stage!</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4P5qERFHQHGjFQdxEtwGz4" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 23-40 screenshot" alt="Microsoft Build 2026 CEO on stage" src="https://cdn.mos.cms.futurecdn.net/4P5qERFHQHGjFQdxEtwGz4.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Only a few minutes late, Satya Nadella finally hits the stage for Microsoft Build 2026.</p><p>He says the key takeaway is how developers manage in this new AI frontier. The conference will discuss the tech stack, including infrastructure, models, agent runtime, and developer tools.</p></div><div class="live-content"><time datetime="2026-06-02T16:39:49+00:00">June 2, 2026 – 12:39 PM</time><h2 id="unmetered-intelligence">Unmetered intelligence</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="MjB6oZ25NvguPxzrF6gRRX" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 27-54 screenshot" alt="Microsoft Build 2026 surface" src="https://cdn.mos.cms.futurecdn.net/MjB6oZ25NvguPxzrF6gRRX.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Nadella is now discussing the company's vision for on-device AI, which will take AI use and development away from the cloud and to one's PC. To that end, Microsoft is expanding Windows AI APIs to more PCs.</p><p>A new program called Aion 1.0 Plan will have local reasoning and tools calling for agentic apps. Processors from AMD, Intel, and Qualcomm will make this happen. And of course, Nvidia RTX Spark. One of the first devices built for on-device AI will be the Surface Laptop Ultra.</p></div><div class="live-content"><time datetime="2026-06-02T16:43:04+00:00">June 2, 2026 – 12:43 PM</time><h2 id="pushing-the-architecture-to-the-limit">Pushing the architecture to the limit</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ouHBHSkyjsh8bMzVvAUTUo" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 30-16 screenshot" alt="Microsoft Build 2026 Surface CEO" src="https://cdn.mos.cms.futurecdn.net/ouHBHSkyjsh8bMzVvAUTUo.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Surface RTX Spark dev box has been unveiled. This was that Xbox-like image we saw from Nadella's post on X earlier today. So, no, it's not Project Helix.</p><p>This device will have 1 petaflop of AI compute, 20 CPU cores, and 128GB of unified RAM. Those are some of the expected specs for RTX Spark. Expect 1 trillion parameters of local compute, which is pretty wild. It's basically a data center on your desktop.</p></div><div class="live-content"><time datetime="2026-06-02T16:46:35+00:00">June 2, 2026 – 12:46 PM</time><h2 id="a-live-demo">A live demo</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="7kVEtHdydCjs4SPbxaVEnS" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 34-23 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/7kVEtHdydCjs4SPbxaVEnS.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft )</span></figcaption></figure><p>Kayla Cinnamon takes the stage to show some live demonstrations for developers to use on the Surface RTX Spark dev box. Python and other dev tools will be available on the RTX Spark dev box and on other Windows machines.</p></div><div class="live-content"><time datetime="2026-06-02T16:49:40+00:00">June 2, 2026 – 12:49 PM</time><h2 id="using-ai-agents-for-development">Using AI agents for development</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="D9johNJvLqCZfEGcLB5Z7c" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 35-52 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/D9johNJvLqCZfEGcLB5Z7c.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>We see Kayla using an agent to help her on a development project. You can use simple commands to make otherwise complex tasks easier. Many tools will come preconfigured. Not only can devs issue typed commands, but they can also issue voice commands.</p></div><div class="live-content"><time datetime="2026-06-02T16:53:43+00:00">June 2, 2026 – 12:53 PM</time><h2 id="using-the-cloud-and-minimizing-the-impact-of-ai-use">Using the cloud and minimizing the impact of AI use</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bMCV95m33W7s68Fs4F24VM" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 40-43 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/bMCV95m33W7s68Fs4F24VM.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft Build 2026)</span></figcaption></figure><p>Satya Nadella returns, and now we're talking about the cloud. There's a lot that goes into using AI, and some of it can get downright expensive. To that end, Microsoft has a community-first plan to minimize the impact on the environment and on people's electricity bills.</p></div><div class="live-content"><time datetime="2026-06-02T16:56:04+00:00">June 2, 2026 – 12:56 PM</time><h2 id="an-ai-super-center">An AI super center</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="UXqNH2SYEjcTSvqA7eeDwZ" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 42-40 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/UXqNH2SYEjcTSvqA7eeDwZ.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft Build 2026)</span></figcaption></figure><p>Nadella is now discussing how to build data centers that have minimal environmental impact. This means minimizing water usage to what a single restaurant would use, for example. Again, this will be done in partnership with AMD, Intel, and Nvidia.</p></div><div class="live-content"><time datetime="2026-06-02T16:58:57+00:00">June 2, 2026 – 12:58 PM</time><h2 id="cobalt-200">Cobalt 200</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="T4mBi8NX88vqAfSbPeT94m" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 44-24 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/T4mBi8NX88vqAfSbPeT94m.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft Build 2026)</span></figcaption></figure><p>New Azure Cobalt 200 VMs deliver a 50% performance improvement and are fully optimized for modern agentic AI workloads.</p><p>"Cobalt 200 is purpose-built from silicon to servers to services—integrating Microsoft’s latest innovations in security, networking, storage, and offload to outperform traditional Arm-based compute," says a <a href="https://azure.microsoft.com/en-us/blog/new-azure-cobalt-200-vms-deliver-50-performance-improvement-fully-optimized-for-modern-agentic-ai-workloads/" target="_blank">blog post</a> on Microsoft Azure website.</p></div><div class="live-content"><time datetime="2026-06-02T17:02:06+00:00">June 2, 2026 – 1:02 PM</time><h2 id="jensen-huang-makes-a-guest-appearance">Jensen Huang makes a guest appearance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kPDyNXPMYqc9KjbTF9CPGX" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 49-22 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/kPDyNXPMYqc9KjbTF9CPGX.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Nvidia CEO Jensen Huang makes a guest appearance to discuss Nvidia RTX Spark.</p><p>Jensen details how Nvidia has created a chip that's purpose-built for AI. Using Windows apps, RTX Spark-powered machines could be the next major step in computing. Users can have agents perform tasks on their behalf without being there. Jensen says the personal PC has become a personal AI.</p></div><div class="live-content"><time datetime="2026-06-02T17:06:03+00:00">June 2, 2026 – 1:06 PM</time><h2 id="discussing-the-evolution-of-ai-development">Discussing the evolution of AI development</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="tPhJVsmiJz9SgzrDp6Z9uM" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 47-57 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/tPhJVsmiJz9SgzrDp6Z9uM.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft )</span></figcaption></figure><p>Nvidia and Microsoft have worked to make AI more efficient and also use less energy, all while making AI more useful. This is how we have arrived at AI agents that can run on a user's PC rather than in the cloud, which is facilitated by giant AI data centers.</p></div><div class="live-content"><time datetime="2026-06-02T17:09:51+00:00">June 2, 2026 – 1:09 PM</time><h2 id="agentic-ai-is-the-next-step">Agentic AI is the next step</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="y8FpeJgckppnC89MABJkbJ" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 47-24 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/y8FpeJgckppnC89MABJkbJ.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Until now, AI has involved asking questions. With agents, users can effectively have an assistant working on their behalf. Jensen says the aim is to make agents faster and ultimately make using them profitable.</p></div><div class="live-content"><time datetime="2026-06-02T17:15:39+00:00">June 2, 2026 – 1:15 PM</time><h2 id="new-form-factors-for-the-agent-era">New form factors for the agent era</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="TJfeg7PvBNBYhUeiPfY8z4" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 59-35 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/TJfeg7PvBNBYhUeiPfY8z4.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Project Solara is a new chip-to-cloud platform designed to make using agents more seamless. The devices in question resemble a smart clock and a work ID badge rather than traditional PCs or laptops. This is designed for places where traditional devices aren't available or aren't optimal. Azure will tie all this together.</p></div><div class="live-content"><time datetime="2026-06-02T17:18:17+00:00">June 2, 2026 – 1:18 PM</time><h2 id="project-solara-devices">Project Solara devices</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="TrtGEGQFzaNsZYPacDHKth" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 1-5-23 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/TrtGEGQFzaNsZYPacDHKth.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>The smart clock-like device is meant to remain stationary, while the ID badge is meant to go with you. You can use your fingerprint to unlock the latter, which is pretty cool. You can even record video with the badge and give it voice instructions. It will clean up whatever you said and send it to your team.</p></div><div class="live-content"><time datetime="2026-06-02T17:23:09+00:00">June 2, 2026 – 1:23 PM</time><h2 id="a-chat-with-qualcomm-s-ceo">A chat with Qualcomm's CEO</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="T6rhtvGWGdjycWX8nEZaCK" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 1-8-59 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/T6rhtvGWGdjycWX8nEZaCK.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Qualcomm CEO Cristiano Amon sits down with Satya Nadella to discuss AI agents across different devices, including the ID badge prototype. Amon says this will change the definition of wearables and AI form factors in general. The smartphone might have a great design, but it may not be ideal for every use case.</p></div><div class="live-content"><time datetime="2026-06-02T17:28:17+00:00">June 2, 2026 – 1:28 PM</time><h2 id="discussing-models">Discussing Models</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GbnAj8ZBNuBoJFKs6n7YRB" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 1-14-48 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/GbnAj8ZBNuBoJFKs6n7YRB.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>We're now on to the next layer in the stack: models. Right now, Windows Foundry has 11,000 models. When building an agentic system, it's important that it supports various models depending on specific needs or preferences.</p><p>A new service called Azure HorizonDB has been announced. It can scale with the projects it works on, which should help developers.</p></div><div class="live-content"><time datetime="2026-06-02T17:32:32+00:00">June 2, 2026 – 1:32 PM</time><h2 id="web-iq-announced">Web IQ announced</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="BHcZSX6wbj2akoVisQZZYe" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 1-19-13 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/BHcZSX6wbj2akoVisQZZYe.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>WebIQ has been updated to support AI agents that use the web to deliver the latest updates, helping devs build agentic systems.</p><p>Elijah Straight takes the stage to detail how WebIQ works. The long-running agent will produce a brief for the user to respond accordingly. The agent was built in Foundry and was then published to 365 for the entire team to use. When asked a question, WebIQ sources the web to deliver the latest information.</p></div><div class="live-content"><time datetime="2026-06-02T17:35:59+00:00">June 2, 2026 – 1:35 PM</time><h2 id="bespoke-answers">Bespoke answers</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="tuNQAgHR3SUd6uVajcpnZ" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 1-20-40 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/tuNQAgHR3SUd6uVajcpnZ.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>WebIQ won't just give you generic answers, but will use your knowledge (such as your company's guidelines) to give you applicable answers.</p></div><div class="live-content"><time datetime="2026-06-02T17:42:15+00:00">June 2, 2026 – 1:42 PM</time><h2 id="openclaw-on-windows">OpenClaw on Windows</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="dAuXV6mBq9dQLT84fNqPvG" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 1-30-7 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/dAuXV6mBq9dQLT84fNqPvG.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>OpenClaw is coming to Windows. Scott Hanselman and Samantha Song are on stage discussing how they each use their OpenClaw agents and are doing a live demo. We see everything the OpenClaw is tackling, along with other options you can configure to make the agent do exactly what you need.</p></div><div class="live-content"><time datetime="2026-06-02T17:44:55+00:00">June 2, 2026 – 1:44 PM</time><h2 id="using-openclaw-to-clean-your-desktop">Using OpenClaw to clean your desktop</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="TwoBjacwmLvBoz83Uw7XC7" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 1-28-26 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/TwoBjacwmLvBoz83Uw7XC7.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>During the demo, we see how you can have an OpenClaw agent clean up your desktop. It's a small thing, but it goes to show how agents are ready to help you with any task... no matter how trivial they might seem.</p></div><div class="live-content"><time datetime="2026-06-02T17:48:28+00:00">June 2, 2026 – 1:48 PM</time><h2 id="openclaw-founder-takes-the-stage">OpenClaw founder takes the stage</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4q3cgxDDdwiForz3TZsc5n" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 1-34-41 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/4q3cgxDDdwiForz3TZsc5n.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>OpenClaw founder Peter Steinberger briefly takes the stage to discuss OpenClaw coming to Windows. To bring the point home, Scott said this was the first time we have seen OpenClaw running on the Surface Laptop Ultra... which is true, since that device was just announced.</p></div><div class="live-content"><time datetime="2026-06-02T17:51:18+00:00">June 2, 2026 – 1:51 PM</time><h2 id="developer-tools">Developer tools</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="sjnWFhoE2vmwDeWNvpGkVM" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 1-37-55 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/sjnWFhoE2vmwDeWNvpGkVM.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>We're now talking about Developer Tools. This is where GitHub comes into play, as it has been a great resource for developers.</p></div><div class="live-content"><time datetime="2026-06-02T17:54:58+00:00">June 2, 2026 – 1:54 PM</time><h2 id="github-copilot-app-announced">GitHub Copilot app announced</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="j67VhT4fCfi4HtCFLh5QFo" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 1-42-2 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/j67VhT4fCfi4HtCFLh5QFo.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>As rumors suggested, GitHub Copilot is getting an app. Development tools are now being rolled out.</p><p>Cassidy Williams takes the stage to show the app. This app will be the home base for developers. In the demo, Cassidy has the app work on multiple projects at once without agents stepping on each other. You can then use agent merge to bring it all together.</p></div><div class="live-content"><time datetime="2026-06-02T17:58:31+00:00">June 2, 2026 – 1:58 PM</time><h2 id="canvas-demo">Canvas demo</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XxiYmpcvGrvAUFSbeYsQZS" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 1-45-50 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/XxiYmpcvGrvAUFSbeYsQZS.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>We see a demo of the agent using a live video feed of Cassidy, which showcases the multimodal capabilities of the GitHub Copilot app.</p></div><div class="live-content"><time datetime="2026-06-02T18:01:47+00:00">June 2, 2026 – 2:01 PM</time><h2 id="security">Security</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RpxtQZ7HWGAr23zPLQBWgn" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 1-48-34 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/RpxtQZ7HWGAr23zPLQBWgn.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Now, let's discuss security and safety when using AI agents. Agent 365 SDK will be one of the tools to help with this.</p><p>Amanda Foster takes the stage to show how this works. With a simple prompt, all the agents are protected and will also keep one's data secure.</p></div><div class="live-content"><time datetime="2026-06-02T18:05:05+00:00">June 2, 2026 – 2:05 PM</time><h2 id="agents-get-better-the-more-they-re-used">Agents get better the more they're used</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="y3hztquNqU5LJyLAJfphrH" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 1-51-34 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/y3hztquNqU5LJyLAJfphrH.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>One interesting thing is that agents will learn from experience and improve themselves through updates, depending on the tasks they are asked to do. All of this has to be approved by admins, so agents can't just do whatever they want.</p></div><div class="live-content"><time datetime="2026-06-02T18:09:09+00:00">June 2, 2026 – 2:09 PM</time><h2 id="security-with-ai">Security with AI</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GceqdBHxyVJCBXvsvGWJT6" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 1-57-5 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/GceqdBHxyVJCBXvsvGWJT6.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Sarah Young, Director of Security, takes the stage to show how AI can be used for security. Agents work together to analyze potential scams and determine which vulnerability was exploited to gain access to a system. You can then use these agents to clean up the code and see what it has done. This can be done locally and uploaded to GitHub Security.</p></div><div class="live-content"><time datetime="2026-06-02T18:13:49+00:00">June 2, 2026 – 2:13 PM</time><h2 id="chainsmokers-take-the-stage">Chainsmokers take the stage</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LJovVkqYpaAAz9nbvJFcyP" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 1-59-51 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/LJovVkqYpaAAz9nbvJFcyP.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Alex Pall and Drew Taggart from the Chainsmokers take the stage. In case you don't know (which I certainly don't), they're musicians who are also developers. This seems like the obligatory celebrity cameo, but it seems the folks watching live appreciate it.</p></div><div class="live-content"><time datetime="2026-06-02T18:18:50+00:00">June 2, 2026 – 2:18 PM</time><h2 id="autopilots">Autopilots</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="MDrGE4aNGrtTTNSTATEcW7" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 2-4-25 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/MDrGE4aNGrtTTNSTATEcW7.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Autopilots are enterprise-grade, long-running agents. The first one being introduced is called Scout. The sizzle reel shows a user asking Scout to handle several tasks simultaneously. Scout works where you work, no matter what app it might be. It's available today to developers.</p></div><div class="live-content"><time datetime="2026-06-02T18:26:38+00:00">June 2, 2026 – 2:26 PM</time><h2 id="microsoft-ai">Microsoft AI</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9QKPSWHezJ5sP2VZbuJH2T" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 2-14-27 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/9QKPSWHezJ5sP2VZbuJH2T.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Mustafa Suleyman, chief of Microsoft AI, takes the stage to discuss Microsoft AI. He discusses how AI has grown over the years and how it will continue to grow. Mustafa says it has to be AI that prioritizes humans.</p><p>A family of new models will help with this, all under the MAI umbrella. This includes MAI Image 2.5 for visual work, MAI Transcribe 1.5 for transcribing (in multiple languages), and more. All of this is rolling out right now.</p></div><div class="live-content"><time datetime="2026-06-02T18:30:24+00:00">June 2, 2026 – 2:30 PM</time><h2 id="mai-models-coming-to-rtx-spark">MAI models coming to RTX Spark</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="oMUFtqgEr2ng54eqN9hwRW" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 2-14-46 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/oMUFtqgEr2ng54eqN9hwRW.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Despite calling it "N1X," Mustafa said these MAI models will be available for RTX Spark machines. Given the different use cases for MAI, such as voice, text, and video generation, it'll be interesting to see what RTX Spark can do.</p></div><div class="live-content"><time datetime="2026-06-02T18:34:42+00:00">June 2, 2026 – 2:34 PM</time><h2 id="microsoft-mayo-clinic">Microsoft + Mayo Clinic</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="tXKUX7e22faB7pYFz38v5J" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 2-20-20 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/tXKUX7e22faB7pYFz38v5J.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>President and CEO of the Mayo Clinic, Gianrico Farrugia, takes the stage to discuss the company's partnership with Microsoft. The aim is to build a frontier model to help patients.</p></div><div class="live-content"><time datetime="2026-06-02T18:37:45+00:00">June 2, 2026 – 2:37 PM</time><h2 id="mai-thinking-demo">MAI Thinking demo</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jRRyesE2vT977L37ZnaGp6" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 2-25-44 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/jRRyesE2vT977L37ZnaGp6.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Tanaya Yadav, senior product manager, takes the stage to show how MAI Thinking works. The demo focuses on training agents to do what you need them to do. This can take hours, but it should result in agents that are more useful.</p></div><div class="live-content"><time datetime="2026-06-02T18:46:47+00:00">June 2, 2026 – 2:46 PM</time><h2 id="microsoft-discovery-for-science">Microsoft Discovery for science</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="w6YP3CPoVsjknw323fqjD3" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 2-32-17 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/w6YP3CPoVsjknw323fqjD3.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>David Carmona takes the stage to discuss how Microsoft Discovery is being used to help scientists improve plastic recycling. The agents use scientific principles to figure this out, and David said it could take hours or days, just like real scientists would. This shows how agents can be tailored to perform specific tasks and not just dish out generic (and wrong) answers.</p></div><div class="live-content"><time datetime="2026-06-02T18:50:21+00:00">June 2, 2026 – 2:50 PM</time><h2 id="a-science-class-on-stage">A science class on stage</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RGgwa9zhQBxKzHPagZcbVB" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 2-33-34 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/RGgwa9zhQBxKzHPagZcbVB.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>I don't know about you, but chemistry goes way over my head. Still, it's impressive to see scientists using these tools to help mankind.</p></div><div class="live-content"><time datetime="2026-06-02T18:53:12+00:00">June 2, 2026 – 2:53 PM</time><h2 id="quantum-computing">Quantum computing</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="dhQLgMhjX5Wms8JYffvHn7" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 2-40-1 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/dhQLgMhjX5Wms8JYffvHn7.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Now we're talking about quantum computing, which is likely the next frontier in computing. Majorana 2 is a processor that will be used for creating scalable quantum computing. It's capable of 1-microsecond operations, which is something that's quite mind-boggling.</p></div><div class="live-content"><time datetime="2026-06-02T18:56:02+00:00">June 2, 2026 – 2:56 PM</time><h2 id="and-that-s-a-wrap">And that's a wrap</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="yoF85xEbk87P5JuAyCBpZR" name="Microsoft Build 2026 Day 1 LIVE _ Opening Keynote, Live Coding & Demos 2-43-2 screenshot" alt="Microsoft Build 2026" src="https://cdn.mos.cms.futurecdn.net/yoF85xEbk87P5JuAyCBpZR.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Microsoft Build is officially over! That was certainly a firehose of information, but hopefully it will help developers actually make folks' lives easier and do so affordably.</p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Microsoft’s Surface Laptop Ultra packs an Nvidia Spark chip — and it could be a MacBook Pro killer ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Microsoft Surface Laptop Ultra is the company’s answer to the MacBook Pro. Announced during Nvidia’s <a href="https://www.tomsguide.com/computing/what-to-expect-at-computex-2026-nvidia-n1x-intels-next-gen-gaming-handhelds-and-an-industrys-fightback-against-ramageddon">Computex 2026</a> presentation, this laptop is among the first to feature the newly announced Nvidia RTX Spark chip. It promises to be powerful enough to handle creative workloads, development, local AI use, and gaming.</p><p>Besides the Laptop Studio, Surface devices are generally designed for average use. That won't be the case with the Surface Laptop Ultra, as it will pack up to 128GB of unified memory. Microsoft also claims it can run AI models locally and that the chip delivers power comparable to a mobile RTX 5070 GPU.</p><p>If the Surface Laptop Ultra is everything Microsoft claims, it will easily be the most powerful Surface device yet — and could give the likes of the MacBook Pro stiff competition. Here’s everything you need to know about the Microsoft Surface Laptop Ultra.</p><h2 id="microsoft-surface-laptop-ultra-design">Microsoft Surface Laptop Ultra: 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="pfaqsD9urEPKtfmrprzck" name="Surface Laptop Ultra Image" alt="Microsoft Surface Laptop Ultra" src="https://cdn.mos.cms.futurecdn.net/pfaqsD9urEPKtfmrprzck.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>The Microsoft Surface Laptop Ultra will include some of the features you’d expect from a premium notebook. For starters, it has a 15-inch mini-LED PixelSense Ultra display that can reportedly reach 2,000 nits of peak HDR brightness, making it the brightest display of any Surface device ever. Microsoft says it will have strong color accuracy for creative work.</p><p>You’ll also get a full set of ports, including HDMI, USB-C, USB-A, an SD card reader, and a headphone jack. The haptic touchpad is the largest Microsoft has ever used on a Surface, and the laptop is designed to run quietly even under load.</p><p>The Surface Laptop Ultra will reportedly have “all-day” battery life, which is a claim I’m eager to verify in our lab tests. Expect it to come in Platinum and Nightfall finishes.</p><h2 id="microsoft-surface-laptop-ultra-nvidia-rtx-spark">Microsoft Surface Laptop Ultra: Nvidia RTX Spark</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="s5f22pfBckuYNWno3osm7B" name="Surface Laptop Ultra Image 2" alt="Microsoft Surface Laptop Ultra" src="https://cdn.mos.cms.futurecdn.net/s5f22pfBckuYNWno3osm7B.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>The Microsoft Surface Laptop Ultra announcement alone is noteworthy, but it’s even more interesting because it’s one of the first laptops to feature the Nvidia RTX Spark chip. In case you were wondering, yes, it’s the processor long known as the “N1X.” Different moniker aside, the chip should be a major boon for the Surface Laptop Ultra.</p><div ><table><caption>Nvidia Spark specs</caption><tbody><tr><td class="firstcol " ><p><strong>Architecture</strong></p></td><td  ><p>TSMC’s 3nm process</p></td></tr><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>Up to 20-core Grace CPU</p></td></tr><tr><td class="firstcol " ><p><strong>GPU</strong></p></td><td  ><p>Blackwell architecture with up to 6,144 CUDA cores</p></td></tr><tr><td class="firstcol " ><p><strong>Memory</strong></p></td><td  ><p>16GB-128GB Unified LPDDR5X with 300GB bandwidth</p></td></tr><tr><td class="firstcol " ><p><strong>I/O support</strong></p></td><td  ><p>USB4 and Thunderbolt</p></td></tr><tr><td class="firstcol " ><p><strong>Power</strong></p></td><td  ><p>Up to 80 watts TDP</p></td></tr></tbody></table></div><p>The chip packs up to 6,144 Blackwell RTX cores, 20 efficient Arm CPU cores, and up to 128GB of unified memory. That adds up to 1 petaflop of AI performance, enough to run 120-billion-parameter models right on the laptop without choking. The claimed power of an RTX 5070 laptop GPU should mean smoother 3D rendering, faster video exports, and potentially higher-end gaming.</p><p>If all those numbers went over your head, it means the Surface Laptop Ultra should feel like a legitimate workstation you can carry around. We’d need to benchmark this laptop and live with it to see what it can do, but RTX Spark should give it some serious power.</p><h2 id="microsoft-surface-laptop-ultra-outlook">Microsoft Surface Laptop Ultra: Outlook</h2><p>The Microsoft Surface Laptop Ultra is set to launch later this year, so it might be a while until we can go hands-on with this machine. I’m certainly looking forward to that, but given how expensive electronics have become thanks to the RAM crisis, I’m not eager to see how much this thing will cost.</p><p>We’ll have more information on the Microsoft Surface Laptop Ultra as soon as we hear it, so stay tuned!</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/gaming/handheld-gaming/msi-claw-8-ex-ai-plus-hands-on-review">I just tested the MSI Claw 8 EX AI+ — Intel Arc G3 is a breakthrough for handheld gaming, but at what cost?</a></li><li><a href="https://www.tomsguide.com/gaming/handheld-gaming/intel-arc-g3-is-here-to-shake-up-handheld-gaming-and-amd-should-be-terrified-acer-predator-atlas-8-is-the-first-out-the-gate">Intel Arc G3 is here to shake up handheld gaming, and AMD should be terrified — Acer Predator Atlas 8, a new MSI Claw and more launching soon</a></li><li><a href="https://www.tomsguide.com/computing/macbooks/im-bored-of-waiting-for-a-touchscreen-macbook-so-i-made-one-myself-with-this-snap-on-magic-screen">I built a touchscreen MacBook Pro using this snap-on accessory, and I'm baffled why Apple hasn't made its own for years</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/laptops/microsofts-surface-laptop-ultra-packs-an-nvidia-spark-chip-and-it-could-be-a-macbook-pro-killer</link>
                                                                            <description>
                            <![CDATA[ During Computex 2026, we got our first details of the new Microsoft Surface Laptop Ultra. Here's everything you need to know. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">7YhgJztcfMF58M3EdSv2mT</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/jPf82R6ASS76yFSsoeyR4A-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 01 Jun 2026 04:42:33 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Laptops]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                                                                <author><![CDATA[ tony.polanco@futurenet.com (Tony Polanco) ]]></author>                    <dc:creator><![CDATA[ Tony Polanco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/atzRNqFt5wYgEUPBDahWsD.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/jPf82R6ASS76yFSsoeyR4A-1280-80.jpg">
                                                            <media:credit><![CDATA[Microsoft]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Microsoft Surface Laptop Ultra]]></media:description>                                                            <media:text><![CDATA[Microsoft Surface Laptop Ultra]]></media:text>
                                <media:title type="plain"><![CDATA[Microsoft Surface Laptop Ultra]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/jPf82R6ASS76yFSsoeyR4A-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Microsoft Surface Laptop Ultra is the company’s answer to the MacBook Pro. Announced during Nvidia’s <a href="https://www.tomsguide.com/computing/what-to-expect-at-computex-2026-nvidia-n1x-intels-next-gen-gaming-handhelds-and-an-industrys-fightback-against-ramageddon">Computex 2026</a> presentation, this laptop is among the first to feature the newly announced Nvidia RTX Spark chip. It promises to be powerful enough to handle creative workloads, development, local AI use, and gaming.</p><p>Besides the Laptop Studio, Surface devices are generally designed for average use. That won't be the case with the Surface Laptop Ultra, as it will pack up to 128GB of unified memory. Microsoft also claims it can run AI models locally and that the chip delivers power comparable to a mobile RTX 5070 GPU.</p><p>If the Surface Laptop Ultra is everything Microsoft claims, it will easily be the most powerful Surface device yet — and could give the likes of the MacBook Pro stiff competition. Here’s everything you need to know about the Microsoft Surface Laptop Ultra.</p><h2 id="microsoft-surface-laptop-ultra-design">Microsoft Surface Laptop Ultra: 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="pfaqsD9urEPKtfmrprzck" name="Surface Laptop Ultra Image" alt="Microsoft Surface Laptop Ultra" src="https://cdn.mos.cms.futurecdn.net/pfaqsD9urEPKtfmrprzck.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>The Microsoft Surface Laptop Ultra will include some of the features you’d expect from a premium notebook. For starters, it has a 15-inch mini-LED PixelSense Ultra display that can reportedly reach 2,000 nits of peak HDR brightness, making it the brightest display of any Surface device ever. Microsoft says it will have strong color accuracy for creative work.</p><p>You’ll also get a full set of ports, including HDMI, USB-C, USB-A, an SD card reader, and a headphone jack. The haptic touchpad is the largest Microsoft has ever used on a Surface, and the laptop is designed to run quietly even under load.</p><p>The Surface Laptop Ultra will reportedly have “all-day” battery life, which is a claim I’m eager to verify in our lab tests. Expect it to come in Platinum and Nightfall finishes.</p><h2 id="microsoft-surface-laptop-ultra-nvidia-rtx-spark">Microsoft Surface Laptop Ultra: Nvidia RTX Spark</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="s5f22pfBckuYNWno3osm7B" name="Surface Laptop Ultra Image 2" alt="Microsoft Surface Laptop Ultra" src="https://cdn.mos.cms.futurecdn.net/s5f22pfBckuYNWno3osm7B.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>The Microsoft Surface Laptop Ultra announcement alone is noteworthy, but it’s even more interesting because it’s one of the first laptops to feature the Nvidia RTX Spark chip. In case you were wondering, yes, it’s the processor long known as the “N1X.” Different moniker aside, the chip should be a major boon for the Surface Laptop Ultra.</p><div ><table><caption>Nvidia Spark specs</caption><tbody><tr><td class="firstcol " ><p><strong>Architecture</strong></p></td><td  ><p>TSMC’s 3nm process</p></td></tr><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>Up to 20-core Grace CPU</p></td></tr><tr><td class="firstcol " ><p><strong>GPU</strong></p></td><td  ><p>Blackwell architecture with up to 6,144 CUDA cores</p></td></tr><tr><td class="firstcol " ><p><strong>Memory</strong></p></td><td  ><p>16GB-128GB Unified LPDDR5X with 300GB bandwidth</p></td></tr><tr><td class="firstcol " ><p><strong>I/O support</strong></p></td><td  ><p>USB4 and Thunderbolt</p></td></tr><tr><td class="firstcol " ><p><strong>Power</strong></p></td><td  ><p>Up to 80 watts TDP</p></td></tr></tbody></table></div><p>The chip packs up to 6,144 Blackwell RTX cores, 20 efficient Arm CPU cores, and up to 128GB of unified memory. That adds up to 1 petaflop of AI performance, enough to run 120-billion-parameter models right on the laptop without choking. The claimed power of an RTX 5070 laptop GPU should mean smoother 3D rendering, faster video exports, and potentially higher-end gaming.</p><p>If all those numbers went over your head, it means the Surface Laptop Ultra should feel like a legitimate workstation you can carry around. We’d need to benchmark this laptop and live with it to see what it can do, but RTX Spark should give it some serious power.</p><h2 id="microsoft-surface-laptop-ultra-outlook">Microsoft Surface Laptop Ultra: Outlook</h2><p>The Microsoft Surface Laptop Ultra is set to launch later this year, so it might be a while until we can go hands-on with this machine. I’m certainly looking forward to that, but given how expensive electronics have become thanks to the RAM crisis, I’m not eager to see how much this thing will cost.</p><p>We’ll have more information on the Microsoft Surface Laptop Ultra as soon as we hear it, so stay tuned!</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/gaming/handheld-gaming/msi-claw-8-ex-ai-plus-hands-on-review">I just tested the MSI Claw 8 EX AI+ — Intel Arc G3 is a breakthrough for handheld gaming, but at what cost?</a></li><li><a href="https://www.tomsguide.com/gaming/handheld-gaming/intel-arc-g3-is-here-to-shake-up-handheld-gaming-and-amd-should-be-terrified-acer-predator-atlas-8-is-the-first-out-the-gate">Intel Arc G3 is here to shake up handheld gaming, and AMD should be terrified — Acer Predator Atlas 8, a new MSI Claw and more launching soon</a></li><li><a href="https://www.tomsguide.com/computing/macbooks/im-bored-of-waiting-for-a-touchscreen-macbook-so-i-made-one-myself-with-this-snap-on-magic-screen">I built a touchscreen MacBook Pro using this snap-on accessory, and I'm baffled why Apple hasn't made its own for years</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Microsoft Build 2026 preview — all the big announcements to expect ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Microsoft Build 2026 takes place on June 2-3 and promises to showcase the latest innovations the company is cooking up. Taking place at the Fort Mason Center in San Francisco, this developer-focused event likely won’t feature bombshell announcements like <a href="https://www.tomsguide.com/news/windows-12">Windows 12</a>, but instead spotlight the latest and upcoming AI tools.</p><p>The <a href="https://build.microsoft.com/en-US/sessions" target="_blank">full session catalog</a> is already live, with sessions based around agentic AI, Azure cloud smarts, GitHub Copilot, Windows development, and responsible AI. That might not sound exciting, but what we learn during the two-day event will give us a glimpse of updates that will trickle down to the apps, PCs, and services you and I use every day.</p><p>You can watch Microsoft Build 2026 online for free by registering at the official Microsoft <a href="https://build.microsoft.com/en-US/home" target="_blank"><u>Build 2026 website</u></a>. We’ll be covering the show as well, so make sure to keep it locked here as we break down all the technical jargon and explain what is (or isn’t) important.</p><p>Here are the biggest announcements happening at Microsoft Build 2026.</p><h2 id="agentic-ai-and-multi-agent-systems">Agentic AI and multi-agent systems</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="g79pJgU9L7zKfNaECp3hUP" name="msofficeagentlead" alt="Agent mode in Microsoft Excel" src="https://cdn.mos.cms.futurecdn.net/g79pJgU9L7zKfNaECp3hUP.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>One term we expect to hear a lot during Build is “agentic AI.” Right now, people use LLMs like <a href="https://www.tomsguide.com/ai/what-is-chat-gpt-5">ChatGPT</a> to ask questions. AI agents, however, can take proactive actions on your behalf. For instance, they can resolve scheduling conflicts in your calendar, collaborate with other AI agents, and handle other complex tasks. Microsoft Foundry (the evolved version of the Azure AI platform) should be the basis for this.</p><p>To that end, expect Build sessions to cover topics such as agent orchestration and debugging, and perhaps even get real-world production stories. For instance, we could see a demo of an agent researching flights, while another books hotels, and another checks your budget. This would happen without anyone micromanaging the agents.</p><p>We’ve heard horror stories about agents deleting important documents and emails, so I hope to see Microsoft address this very real concern. But if these agents work as advertised and don't torch your work, they should act as digital assistants to take some of the stress off your daily grind.</p><h2 id="a-more-autonomous-github-copilot">A more autonomous GitHub Copilot</h2><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:66.67%;"><img id="cs4j62PBe76y8WNcjEmDNK" name="GitHub Copilot" alt="GitHub Copilot" src="https://cdn.mos.cms.futurecdn.net/cs4j62PBe76y8WNcjEmDNK.jpg" mos="" align="middle" fullscreen="" width="6000" height="4000" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Related to the previous point, GitHub Copilot could also start doing things on your behalf. This platform has already been a boon for developers, and could become even more indispensable. We could see deeper integrations with Visual Studio, VS Code, and the full dev lifecycle.</p><p>If developers have an easier time creating app or fixing code, this could result in higher-quality apps for folks like us. Think smoother interfaces on streaming platforms, bug-free banking apps, or even smarter fitness trackers. Developers shipping code more quickly and with fewer bugs means faster app updates.</p><h2 id="azure-ai-platform-2">Azure AI platform</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:66.65%;"><img id="EhLfgvvziKu8toTaH5n7HX" name="Microsoft Azure" alt="Microsoft Azure" src="https://cdn.mos.cms.futurecdn.net/EhLfgvvziKu8toTaH5n7HX.jpg" mos="" align="middle" fullscreen="" width="2000" height="1333" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Microsoft’s Azure platform is what does the heavy lifting, so expect Build to discuss the latest on the cloud-based platform. We’ll see sessions diving into things like training and fine-tuning models efficiently, multi-model orchestration, and moving prototypes to production without giant bills.</p><p>For non-developers, this could mean keeping AI features affordable, which could result in the price of subscriptions for services we use staying low. That could be wishful thinking on my part, but if the developers are saving money, then perhaps we might as well.</p><h2 id="windows-ai-foundry">Windows AI Foundry</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1583px;"><p class="vanilla-image-block" style="padding-top:56.85%;"><img id="43feUogzceEtWd5Y4KTf7e" name="windows key.jpg" alt="How to disable the Windows key" src="https://cdn.mos.cms.futurecdn.net/43feUogzceEtWd5Y4KTf7e.jpg" mos="" align="middle" fullscreen="" width="1583" height="900" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Windows AI Foundry lets developers build apps that can run AI models on-device on laptops and PCs using the NPU, GPU, or CPU. This is beneficial if you’re working on something sensitive and don’t want to do it on the cloud.</p><p>To that end, we should see sessions featuring on-device inference, WinUI 3 with agents, WSL improvements, and other developer-optimized experiences. This builds on Copilot+ PCs but works broadly, all on-device.</p><p>Local AI means faster response times since there’s no internet lag. And as mentioned above, it also means better privacy for both personal and business files. Privacy is a growing concern with AI, so I expect Microsoft to really push on-device AI during Build.</p><h2 id="what-not-to-expect">What not to expect</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="UbLuvifftVYwS8AYGbcQmJ" name="Windows 12.shutterstock_2307949187.jpg" alt="Windows 12 logo concept" src="https://cdn.mos.cms.futurecdn.net/UbLuvifftVYwS8AYGbcQmJ.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Let’s get the big one out of the way. While we’ve heard rumblings about Windows 12 for years, there has not been official confirmation from Microsoft. Build isn’t usually an event where major software is announced, so it’s unlikely that the company will unveil Windows 12 there. However, we’ll no doubt see elements of what could end up in the operating system at the various sessions. What actually makes it into Windows 12 is anyone’s guess, however.</p><p>Similarly, we doubt that Microsoft will make any significant hardware announcements. Surface devices for business have already launched, such as the <a href="https://www.tomsguide.com/computing/laptops/the-new-microsoft-surface-laptop-8-is-great-but-its-hard-to-recommend-to-most-people">Surface Laptop 8</a> I reviewed, so any kind of mention would be redundant. We also don’t think Microsoft will unveil or discuss <a href="https://www.tomsguide.com/gaming/xbox/next-xbox-will-play-your-xbox-and-pc-games-new-ceo-promises">Xbox Project Helix</a>. </p><p>If anything, we could hear something about the next Xbox during Summer Game Fest that’s also happening next week—but that’s a whole different story.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eBjx8e"></div>                            </div>                            <script src="https://kwizly.com/embed/eBjx8e.js" async></script><h2 id="microsoft-build-2026-outlook">Microsoft Build 2026: Outlook</h2><p>Microsoft Build 2026 won’t be a big fancy event like <a href="https://www.tomsguide.com/phones/iphones/wwdc-2026">WWDC</a> or <a href="https://www.tomsguide.com/news/live/google-io-2026-live-news-updates">Google I/O</a>, but it will give us some insight into the tools developers will use to (hopefully) build more useful applications and features for regular users. From agentic systems that handle your work to local AI that lets you work more privately, there’s a lot to look forward to.</p><p>We’ll be covering Microsoft Build 2026 live as it happens, so keep it locked here for all the latest developments from Microsoft’s big developer conference.</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/forget-apple-embrace-your-inner-pc-nerd-with-these-microsoft-mastery-challenges">Forget Apple, embrace your inner PC nerd with these Microsoft mastery challenges</a></li><li><a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-admits-windows-users-experienced-some-challenges-with-the-forced-copilot-key-now-its-finally-doing-something-about-it">Microsoft admits Windows users 'experienced some challenges' with the forced CoPilot key — now it's finally doing something about it</a></li><li><a href="https://www.tomsguide.com/ai/i-tested-the-viral-ai-agent-that-could-replace-apps-and-it-made-me-appreciate-my-computer-without-it">I let a viral AI agent take over my PC — and now I see why apps are dying</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/microsoft-build-2026-preview</link>
                                                                            <description>
                            <![CDATA[ Microsoft Build 2026 should be a showcase for the company's latest and upcoming AI efforts. Here are some of the big announcements we expect to see. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">urCtp5gtDihTTV3iAJYpbb</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/mEYb8gQe8eCgfJRqqbunbE-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 29 May 2026 10:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[AI]]></category>
                                                    <category><![CDATA[Copilot]]></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/mEYb8gQe8eCgfJRqqbunbE-1280-80.jpg">
                                                            <media:credit><![CDATA[Getty Images]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Satya Nadella in front of Microsoft logo at CES 2024]]></media:description>                                                            <media:text><![CDATA[Satya Nadella in front of Microsoft logo at CES 2024]]></media:text>
                                <media:title type="plain"><![CDATA[Satya Nadella in front of Microsoft logo at CES 2024]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/mEYb8gQe8eCgfJRqqbunbE-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Microsoft Build 2026 takes place on June 2-3 and promises to showcase the latest innovations the company is cooking up. Taking place at the Fort Mason Center in San Francisco, this developer-focused event likely won’t feature bombshell announcements like <a href="https://www.tomsguide.com/news/windows-12">Windows 12</a>, but instead spotlight the latest and upcoming AI tools.</p><p>The <a href="https://build.microsoft.com/en-US/sessions" target="_blank">full session catalog</a> is already live, with sessions based around agentic AI, Azure cloud smarts, GitHub Copilot, Windows development, and responsible AI. That might not sound exciting, but what we learn during the two-day event will give us a glimpse of updates that will trickle down to the apps, PCs, and services you and I use every day.</p><p>You can watch Microsoft Build 2026 online for free by registering at the official Microsoft <a href="https://build.microsoft.com/en-US/home" target="_blank"><u>Build 2026 website</u></a>. We’ll be covering the show as well, so make sure to keep it locked here as we break down all the technical jargon and explain what is (or isn’t) important.</p><p>Here are the biggest announcements happening at Microsoft Build 2026.</p><h2 id="agentic-ai-and-multi-agent-systems">Agentic AI and multi-agent systems</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="g79pJgU9L7zKfNaECp3hUP" name="msofficeagentlead" alt="Agent mode in Microsoft Excel" src="https://cdn.mos.cms.futurecdn.net/g79pJgU9L7zKfNaECp3hUP.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>One term we expect to hear a lot during Build is “agentic AI.” Right now, people use LLMs like <a href="https://www.tomsguide.com/ai/what-is-chat-gpt-5">ChatGPT</a> to ask questions. AI agents, however, can take proactive actions on your behalf. For instance, they can resolve scheduling conflicts in your calendar, collaborate with other AI agents, and handle other complex tasks. Microsoft Foundry (the evolved version of the Azure AI platform) should be the basis for this.</p><p>To that end, expect Build sessions to cover topics such as agent orchestration and debugging, and perhaps even get real-world production stories. For instance, we could see a demo of an agent researching flights, while another books hotels, and another checks your budget. This would happen without anyone micromanaging the agents.</p><p>We’ve heard horror stories about agents deleting important documents and emails, so I hope to see Microsoft address this very real concern. But if these agents work as advertised and don't torch your work, they should act as digital assistants to take some of the stress off your daily grind.</p><h2 id="a-more-autonomous-github-copilot">A more autonomous GitHub Copilot</h2><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:66.67%;"><img id="cs4j62PBe76y8WNcjEmDNK" name="GitHub Copilot" alt="GitHub Copilot" src="https://cdn.mos.cms.futurecdn.net/cs4j62PBe76y8WNcjEmDNK.jpg" mos="" align="middle" fullscreen="" width="6000" height="4000" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Related to the previous point, GitHub Copilot could also start doing things on your behalf. This platform has already been a boon for developers, and could become even more indispensable. We could see deeper integrations with Visual Studio, VS Code, and the full dev lifecycle.</p><p>If developers have an easier time creating app or fixing code, this could result in higher-quality apps for folks like us. Think smoother interfaces on streaming platforms, bug-free banking apps, or even smarter fitness trackers. Developers shipping code more quickly and with fewer bugs means faster app updates.</p><h2 id="azure-ai-platform-2">Azure AI platform</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:66.65%;"><img id="EhLfgvvziKu8toTaH5n7HX" name="Microsoft Azure" alt="Microsoft Azure" src="https://cdn.mos.cms.futurecdn.net/EhLfgvvziKu8toTaH5n7HX.jpg" mos="" align="middle" fullscreen="" width="2000" height="1333" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Microsoft’s Azure platform is what does the heavy lifting, so expect Build to discuss the latest on the cloud-based platform. We’ll see sessions diving into things like training and fine-tuning models efficiently, multi-model orchestration, and moving prototypes to production without giant bills.</p><p>For non-developers, this could mean keeping AI features affordable, which could result in the price of subscriptions for services we use staying low. That could be wishful thinking on my part, but if the developers are saving money, then perhaps we might as well.</p><h2 id="windows-ai-foundry">Windows AI Foundry</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1583px;"><p class="vanilla-image-block" style="padding-top:56.85%;"><img id="43feUogzceEtWd5Y4KTf7e" name="windows key.jpg" alt="How to disable the Windows key" src="https://cdn.mos.cms.futurecdn.net/43feUogzceEtWd5Y4KTf7e.jpg" mos="" align="middle" fullscreen="" width="1583" height="900" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Windows AI Foundry lets developers build apps that can run AI models on-device on laptops and PCs using the NPU, GPU, or CPU. This is beneficial if you’re working on something sensitive and don’t want to do it on the cloud.</p><p>To that end, we should see sessions featuring on-device inference, WinUI 3 with agents, WSL improvements, and other developer-optimized experiences. This builds on Copilot+ PCs but works broadly, all on-device.</p><p>Local AI means faster response times since there’s no internet lag. And as mentioned above, it also means better privacy for both personal and business files. Privacy is a growing concern with AI, so I expect Microsoft to really push on-device AI during Build.</p><h2 id="what-not-to-expect">What not to expect</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="UbLuvifftVYwS8AYGbcQmJ" name="Windows 12.shutterstock_2307949187.jpg" alt="Windows 12 logo concept" src="https://cdn.mos.cms.futurecdn.net/UbLuvifftVYwS8AYGbcQmJ.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Let’s get the big one out of the way. While we’ve heard rumblings about Windows 12 for years, there has not been official confirmation from Microsoft. Build isn’t usually an event where major software is announced, so it’s unlikely that the company will unveil Windows 12 there. However, we’ll no doubt see elements of what could end up in the operating system at the various sessions. What actually makes it into Windows 12 is anyone’s guess, however.</p><p>Similarly, we doubt that Microsoft will make any significant hardware announcements. Surface devices for business have already launched, such as the <a href="https://www.tomsguide.com/computing/laptops/the-new-microsoft-surface-laptop-8-is-great-but-its-hard-to-recommend-to-most-people">Surface Laptop 8</a> I reviewed, so any kind of mention would be redundant. We also don’t think Microsoft will unveil or discuss <a href="https://www.tomsguide.com/gaming/xbox/next-xbox-will-play-your-xbox-and-pc-games-new-ceo-promises">Xbox Project Helix</a>. </p><p>If anything, we could hear something about the next Xbox during Summer Game Fest that’s also happening next week—but that’s a whole different story.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eBjx8e"></div>                            </div>                            <script src="https://kwizly.com/embed/eBjx8e.js" async></script><h2 id="microsoft-build-2026-outlook">Microsoft Build 2026: Outlook</h2><p>Microsoft Build 2026 won’t be a big fancy event like <a href="https://www.tomsguide.com/phones/iphones/wwdc-2026">WWDC</a> or <a href="https://www.tomsguide.com/news/live/google-io-2026-live-news-updates">Google I/O</a>, but it will give us some insight into the tools developers will use to (hopefully) build more useful applications and features for regular users. From agentic systems that handle your work to local AI that lets you work more privately, there’s a lot to look forward to.</p><p>We’ll be covering Microsoft Build 2026 live as it happens, so keep it locked here for all the latest developments from Microsoft’s big developer conference.</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/forget-apple-embrace-your-inner-pc-nerd-with-these-microsoft-mastery-challenges">Forget Apple, embrace your inner PC nerd with these Microsoft mastery challenges</a></li><li><a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-admits-windows-users-experienced-some-challenges-with-the-forced-copilot-key-now-its-finally-doing-something-about-it">Microsoft admits Windows users 'experienced some challenges' with the forced CoPilot key — now it's finally doing something about it</a></li><li><a href="https://www.tomsguide.com/ai/i-tested-the-viral-ai-agent-that-could-replace-apps-and-it-made-me-appreciate-my-computer-without-it">I let a viral AI agent take over my PC — and now I see why apps are dying</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Even the people building AI don't know exactly where it's going  ]]></title>
                                                                                                <dc:content><![CDATA[ <p>For the past two years, the AI industry has sounded remarkably certain about the future. <a href="https://www.tomsguide.com/ai/anthropic-ceo-claims-ai-will-cause-mass-unemployment-in-the-next-5-years-heres-why">Dario Amodei</a>, Anthropic's CEO suggested AI would cause massive unemployment, <a href="https://www.tomsguide.com/ai/bill-gates-just-predicted-the-death-of-every-job-thanks-to-ai-except-for-these-three">Bill Gates </a>predicted the end of nearly every job and even Microsoft <a href="https://www.tomsguide.com/ai/microsoft-reveals-the-40-jobs-ai-is-most-likely-to-replace-and-40-that-are-safe-for-now">revealed a list of jobs </a>that AI is most likely to replace. </p><p>Now, some of the same people that made those predictions are begining to walk back their statements or at the very least reframe them. Honestly, this feels like the clearest sign yet that nobody truly knows where AI technology is headed. <br><br>The latest example comes from a <a href="https://www.reuters.com/world/asia-pacific/openais-altman-says-ai-unlikely-lead-jobs-apocalypse-2026-05-26/" target="_blank">Reuters</a> report highlighting comments from Sam Altman, who recently admitted he may have overestimated how quickly AI would eliminate entry-level white-collar jobs. Just months ago, much of the conversation around generative AI focused on mass disruption and automation. Now, the tone coming from some of the industry’s biggest leaders sounds noticeably more cautious and far less certain.<br><br>That shift matters because AI has increasingly been marketed not just as a useful tool, but as an unstoppable economic force. The messaging helped fuel an <a href="https://www.tomsguide.com/ai/trump-scrapped-a-major-ai-safety-plan-heres-why-that-matters-for-chatgpt-users">arms race</a> involving <a href="https://www.tomsguide.com/ai/big-tech-is-pouring-usd650-billion-into-ai-and-its-about-to-affect-almost-everything-you-use">billions of dollars in infrastructure </a>spending, <a href="https://www.tomsguide.com/ai/this-ai-data-center-will-be-bigger-than-2-000-walmarts-and-dump-23-atom-bombs-worth-of-energy-into-the-environment-every-day-and-locals-are-terrified">data centers</a> and AI adoption across nearly every major tech company.</p><p>But as the technology moves from hype to reality, predictions keep colliding with actual human behavior.</p><h2 id="ai-keeps-changing-but-society-moves-slower">AI keeps changing but society moves slower</h2><p>One of the biggest surprises of the AI boom is that people haven’t adapted as quickly or as uniformly as many experts predicted.</p><p>Yes, tools like ChatGPT, Google Gemini and Claude have become mainstream. <a href="https://www.tomsguide.com/ai/chatgpt/openai-says-more-than-200-million-people-use-chatgpt-every-week-doubling-in-a-year">Millions of people</a> now use AI to write emails, summarize meetings, brainstorm ideas and analyze information. But widespread adoption doesn’t automatically translate into immediate replacement.</p><p>Many companies still struggle with hallucinations, <a href="https://www.tomsguide.com/ai/i-guessed-instead-of-verifying-claude-ai-agent-wipes-companys-entire-database-in-9-seconds-then-apologizes">failures</a>, trust issues, legal concerns and workflow integration. Workers continue finding ways to use AI alongside existing jobs instead of fully automating them away. And consumers often use AI in far more casual or limited ways than the industry originally expected.</p><p>This results in a strange contradiction of AI useage. While the models keep getting dramatically better, according to <a href="https://www.pewresearch.org/short-reads/2026/03/12/key-findings-about-how-americans-view-artificial-intelligence/" target="_blank">Pew Research</a>, just 10% of society say they are more excited than concerned about AI. </p><h2 id="the-ai-narrative-keeps-changing">The AI narrative keeps changing </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5873px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="kzCjkSD7PgGYT4eVWmdsgj" name="GettyImages-2265991722 (1)" alt="Sam Altman" src="https://cdn.mos.cms.futurecdn.net/kzCjkSD7PgGYT4eVWmdsgj.jpg" mos="" align="middle" fullscreen="" width="5873" height="3304" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Getty Images)</span></figcaption></figure><p>According to the film, <a href="https://target.georiot.com/Proxy.ashx?tsid=45724&GR_URL=https%3A%2F%2Famazon.com%2FAI-Doc-How-Became-Apocaloptimist%2Fdp%2FB0GMK2XCZ9%3Ftag%3Dftr-tomsguide-us-20%26ascsubtag%3Dtomsguide-us-6559284757421352611-20" target="_blank" rel="sponsored">The AI Doc: Or How I Became an Apocaloptimist</a> on Amazon Prime, more than 20,000 people are currently working on <a href="https://www.tomsguide.com/ai/i-think-weve-achieved-agi-nvidias-ceo-believes-weve-finally-achieved-artificial-general-intelligence">AGI</a> — artificial general intelligence — while fewer than 200 are focused specifically on AI safety. Whether that exact number is perfectly accurate almost feels beside the point. The statistic captures something that increasingly defines the AI era: the technology is moving much faster than society’s ability to fully understand, regulate or adapt to it.</p><p>Just a year ago, some executives warned that <a href="https://www.tomsguide.com/ai/i-reclaimed-15-hours-this-week-with-ai-agents-here-is-the-exact-setup-i-used-to-automate-my-workflow">AI agents</a> would soon automate massive portions of knowledge work. Today, AI agents still exist mostly as early experiments for many users.</p><p>For a while, <a href="https://www.tomsguide.com/ai/the-one-prompt-i-tell-everyone-new-to-ai-to-start-with-and-why-it-changes-everything">prompt engineering</a> was described as the “job of the future.” Now many AI companies are actively building systems designed to require fewer specialized prompts altogether.</p><p>Search was supposedly on the verge of collapse. Instead, the internet has entered a strange transitional phase where AI Overviews, chatbots and traditional websites awkwardly coexist.</p><p>Even timelines for AGI seem to change constantly depending on who is speaking — and what month it is. That doesn’t necessarily mean AI companies are intentionally misleading people. It points to that predicting technological change at this scale is incredibly difficult. Especially when billions of people, governments, businesses and cultural habits are involved.</p><h2 id="ai-is-absolutely-changing-the-world-but-slower-than-expected">AI is absolutely changing the world, but slower than expected</h2><p>One of the biggest myths surrounding the current AI boom is the idea that anyone, including Silicon Valley executives, fully understands what happens next. The technology is evolving too quickly, society is adapting unevenly and the long-term effects remain deeply unpredictable.</p><p>So when you hear bold declarations about exactly how AI will reshape work, creativity or daily life, it’s worth realizing that there's a good chance those predictions will be revised again six months from now.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom’s Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/i-used-the-chatgpt-butter-prompt-for-deep-research-and-my-results-got-way-better"><strong>I used the ChatGPT ‘butter’ prompt for deep research — and my results got way better</strong></a></li><li><a href="https://www.tomsguide.com/ai/chatgpt-might-be-quietly-rewarding-people-who-know-how-to-think-clearly-these-prompts-can-help"><strong>ChatGPT might be quietly rewarding people who know how to think clearly — these prompts can help</strong></a></li><li><a href="https://www.tomsguide.com/ai/i-tested-chatgpt-claude-and-gemini-with-canva-to-build-a-resume-and-one-completely-failed"><strong>I tested ChatGPT vs Claude vs Gemini to build a resume with Canva — and there's a clear winner</strong></a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/ai/even-the-people-building-ai-dont-know-exactly-where-its-going</link>
                                                                            <description>
                            <![CDATA[ Big Tech leaders are softening their once-certain timelines for AI automation, proving that predicting societal tech shifts is harder than it looks. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">SkuNCUz3sDqVDgHNRcF6rS</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/MCkQwgCLKjbf4wcTKaYB9V-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 27 May 2026 16:16:29 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[AI]]></category>
                                                                                                <author><![CDATA[ amanda.caswell@futurenet.com (Amanda Caswell) ]]></author>                    <dc:creator><![CDATA[ Amanda Caswell ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/zYjevim2q7FjQiefqpjZRB.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/MCkQwgCLKjbf4wcTKaYB9V-1280-80.jpg">
                                                            <media:credit><![CDATA[Credit: Tom’s Guide/David Paul Morris/Kyle Grillot/Bloomberg/Chance Yeh/Getty]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Tim Cook, Cario Amodei, and Sam Altman]]></media:description>                                                            <media:text><![CDATA[Tim Cook, Cario Amodei, and Sam Altman]]></media:text>
                                <media:title type="plain"><![CDATA[Tim Cook, Cario Amodei, and Sam Altman]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/MCkQwgCLKjbf4wcTKaYB9V-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>For the past two years, the AI industry has sounded remarkably certain about the future. <a href="https://www.tomsguide.com/ai/anthropic-ceo-claims-ai-will-cause-mass-unemployment-in-the-next-5-years-heres-why">Dario Amodei</a>, Anthropic's CEO suggested AI would cause massive unemployment, <a href="https://www.tomsguide.com/ai/bill-gates-just-predicted-the-death-of-every-job-thanks-to-ai-except-for-these-three">Bill Gates </a>predicted the end of nearly every job and even Microsoft <a href="https://www.tomsguide.com/ai/microsoft-reveals-the-40-jobs-ai-is-most-likely-to-replace-and-40-that-are-safe-for-now">revealed a list of jobs </a>that AI is most likely to replace. </p><p>Now, some of the same people that made those predictions are begining to walk back their statements or at the very least reframe them. Honestly, this feels like the clearest sign yet that nobody truly knows where AI technology is headed. <br><br>The latest example comes from a <a href="https://www.reuters.com/world/asia-pacific/openais-altman-says-ai-unlikely-lead-jobs-apocalypse-2026-05-26/" target="_blank">Reuters</a> report highlighting comments from Sam Altman, who recently admitted he may have overestimated how quickly AI would eliminate entry-level white-collar jobs. Just months ago, much of the conversation around generative AI focused on mass disruption and automation. Now, the tone coming from some of the industry’s biggest leaders sounds noticeably more cautious and far less certain.<br><br>That shift matters because AI has increasingly been marketed not just as a useful tool, but as an unstoppable economic force. The messaging helped fuel an <a href="https://www.tomsguide.com/ai/trump-scrapped-a-major-ai-safety-plan-heres-why-that-matters-for-chatgpt-users">arms race</a> involving <a href="https://www.tomsguide.com/ai/big-tech-is-pouring-usd650-billion-into-ai-and-its-about-to-affect-almost-everything-you-use">billions of dollars in infrastructure </a>spending, <a href="https://www.tomsguide.com/ai/this-ai-data-center-will-be-bigger-than-2-000-walmarts-and-dump-23-atom-bombs-worth-of-energy-into-the-environment-every-day-and-locals-are-terrified">data centers</a> and AI adoption across nearly every major tech company.</p><p>But as the technology moves from hype to reality, predictions keep colliding with actual human behavior.</p><h2 id="ai-keeps-changing-but-society-moves-slower">AI keeps changing but society moves slower</h2><p>One of the biggest surprises of the AI boom is that people haven’t adapted as quickly or as uniformly as many experts predicted.</p><p>Yes, tools like ChatGPT, Google Gemini and Claude have become mainstream. <a href="https://www.tomsguide.com/ai/chatgpt/openai-says-more-than-200-million-people-use-chatgpt-every-week-doubling-in-a-year">Millions of people</a> now use AI to write emails, summarize meetings, brainstorm ideas and analyze information. But widespread adoption doesn’t automatically translate into immediate replacement.</p><p>Many companies still struggle with hallucinations, <a href="https://www.tomsguide.com/ai/i-guessed-instead-of-verifying-claude-ai-agent-wipes-companys-entire-database-in-9-seconds-then-apologizes">failures</a>, trust issues, legal concerns and workflow integration. Workers continue finding ways to use AI alongside existing jobs instead of fully automating them away. And consumers often use AI in far more casual or limited ways than the industry originally expected.</p><p>This results in a strange contradiction of AI useage. While the models keep getting dramatically better, according to <a href="https://www.pewresearch.org/short-reads/2026/03/12/key-findings-about-how-americans-view-artificial-intelligence/" target="_blank">Pew Research</a>, just 10% of society say they are more excited than concerned about AI. </p><h2 id="the-ai-narrative-keeps-changing">The AI narrative keeps changing </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5873px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="kzCjkSD7PgGYT4eVWmdsgj" name="GettyImages-2265991722 (1)" alt="Sam Altman" src="https://cdn.mos.cms.futurecdn.net/kzCjkSD7PgGYT4eVWmdsgj.jpg" mos="" align="middle" fullscreen="" width="5873" height="3304" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Getty Images)</span></figcaption></figure><p>According to the film, <a href="https://target.georiot.com/Proxy.ashx?tsid=45724&GR_URL=https%3A%2F%2Famazon.com%2FAI-Doc-How-Became-Apocaloptimist%2Fdp%2FB0GMK2XCZ9%3Ftag%3Dftr-tomsguide-us-20%26ascsubtag%3Dtomsguide-us-6559284757421352611-20" target="_blank" rel="sponsored">The AI Doc: Or How I Became an Apocaloptimist</a> on Amazon Prime, more than 20,000 people are currently working on <a href="https://www.tomsguide.com/ai/i-think-weve-achieved-agi-nvidias-ceo-believes-weve-finally-achieved-artificial-general-intelligence">AGI</a> — artificial general intelligence — while fewer than 200 are focused specifically on AI safety. Whether that exact number is perfectly accurate almost feels beside the point. The statistic captures something that increasingly defines the AI era: the technology is moving much faster than society’s ability to fully understand, regulate or adapt to it.</p><p>Just a year ago, some executives warned that <a href="https://www.tomsguide.com/ai/i-reclaimed-15-hours-this-week-with-ai-agents-here-is-the-exact-setup-i-used-to-automate-my-workflow">AI agents</a> would soon automate massive portions of knowledge work. Today, AI agents still exist mostly as early experiments for many users.</p><p>For a while, <a href="https://www.tomsguide.com/ai/the-one-prompt-i-tell-everyone-new-to-ai-to-start-with-and-why-it-changes-everything">prompt engineering</a> was described as the “job of the future.” Now many AI companies are actively building systems designed to require fewer specialized prompts altogether.</p><p>Search was supposedly on the verge of collapse. Instead, the internet has entered a strange transitional phase where AI Overviews, chatbots and traditional websites awkwardly coexist.</p><p>Even timelines for AGI seem to change constantly depending on who is speaking — and what month it is. That doesn’t necessarily mean AI companies are intentionally misleading people. It points to that predicting technological change at this scale is incredibly difficult. Especially when billions of people, governments, businesses and cultural habits are involved.</p><h2 id="ai-is-absolutely-changing-the-world-but-slower-than-expected">AI is absolutely changing the world, but slower than expected</h2><p>One of the biggest myths surrounding the current AI boom is the idea that anyone, including Silicon Valley executives, fully understands what happens next. The technology is evolving too quickly, society is adapting unevenly and the long-term effects remain deeply unpredictable.</p><p>So when you hear bold declarations about exactly how AI will reshape work, creativity or daily life, it’s worth realizing that there's a good chance those predictions will be revised again six months from now.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom’s Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/i-used-the-chatgpt-butter-prompt-for-deep-research-and-my-results-got-way-better"><strong>I used the ChatGPT ‘butter’ prompt for deep research — and my results got way better</strong></a></li><li><a href="https://www.tomsguide.com/ai/chatgpt-might-be-quietly-rewarding-people-who-know-how-to-think-clearly-these-prompts-can-help"><strong>ChatGPT might be quietly rewarding people who know how to think clearly — these prompts can help</strong></a></li><li><a href="https://www.tomsguide.com/ai/i-tested-chatgpt-claude-and-gemini-with-canva-to-build-a-resume-and-one-completely-failed"><strong>I tested ChatGPT vs Claude vs Gemini to build a resume with Canva — and there's a clear winner</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The new Microsoft Surface Laptop 8 is great — but it's hard to recommend to most people ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Microsoft Surface Laptop 8 (starting at $1,949), or Microsoft Surface Laptop for Business, as it is officially called, updates the company’s eponymous notebook with the latest Intel CPU, an updated haptic touchpad, and an optional built-in anti-glare privacy screen. Though designed as a business laptop, it’s a solid device overall for anyone willing to pay its steep price.</p><p>Like the <a href="https://www.tomsguide.com/computing/laptops/microsoft-surface-laptop-7-review">Surface Laptop 7</a>, the new Surface Laptop is a sleek ultraportable you can easily carry. It’s just slightly larger and heavier than the 13-inch <a href="https://www.tomsguide.com/computing/macbooks/macbook-air-m5-review">MacBook Air M5</a>, which is very impressive. Despite its slim profile, it packs at least one USB-A port for legacy devices and a pair of USB-C ports.</p><p>One major upgrade is the optional built-in anti-glare privacy screen. The former is especially useful if you don’t want wandering eyes to see what you’re working on in a public spot. The anti-glare coating does a fantastic job of ensuring the display is visible even in direct sunlight. These are highlights of what is an otherwise average laptop panel.</p><p>Thanks to the Intel Core Ultra Series 3 “<a href="https://www.tomsguide.com/computing/cpus/intel-panther-lake-cpus-promise-insane-gains-50-percent-faster-with-a-breakthrough-gpu">Panther Lake</a>” chip inside, the Surface Laptop 8 delivers stunning performance and solid battery life. Not only do you get enough power for everyday work, but you can even run some modern games for when you’re off the clock. And while battery life might not be as impressive as on a MacBook, you’re getting well over a full day of use.</p><p>Given its status as a business laptop and its high starting price, you might want to consider a regular consumer laptop with similar specs. However, if you’re a longtime Surface Laptop fan and are willing to spend big for the best iteration of that device yet, this is a machine worth considering. Find out in my full review.</p><h3 class="article-body__section" id="section-microsoft-surface-laptop-8-review-cheat-sheet"><span>Microsoft Surface Laptop 8 review: Cheat sheet</span></h3><ul><li><strong>What is it?</strong> The Microsoft Surface Laptop 8 is a business laptop packing the latest Intel Panther Lake chip.</li><li><strong>Who is it for?</strong> For workers who need a reliable notebook for everyday work.</li><li><strong>What does it cost?</strong> The Surface Laptop 8 starts at $1,949.</li><li><strong>What do we like?</strong> We like the slim design, strong performance, anti-glare display option, and strong battery life.</li><li><strong>What don’t we like?</strong> We don’t like that it costs nearly $1,000 more than the previous model.</li></ul><h3 class="article-body__section" id="section-microsoft-surface-laptop-8-review-specs"><span>Microsoft Surface Laptop 8 review: Specs</span></h3><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Microsoft Surface Laptop 8</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price (starting)</strong></p></td><td  ><p>$1,949</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>13.8-inch (2304x1536) 120Hz</p></td></tr><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>Intel Core Ultra x7 368 H</p></td></tr><tr><td class="firstcol " ><p><strong>GPU</strong></p></td><td  ><p>Intel Arc Graphics</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>32GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>512GB</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Wi-Fi 7, Bluetooth 5.4</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>2x USB-C, 1x USB-A, 1x SD card slot, 1x 3.5mm headphone jack</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>11.85 x 8.67 x 0.69 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>2.97 pounds</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-microsoft-surface-laptop-8-review-the-ups"><span>Microsoft Surface Laptop 8 review: The ups</span></h3><p>The Microsoft Surface Laptop 8 has a lot going for it, thanks to its strong Panther Lake performance, ultraportable design, and long battery life.</p><h2 id="elegant-design">Elegant 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="xW6sk6frPNnwt6oxE5Txia" name="Microsoft Surface Laptop (2026)-10" alt="Microsoft Surface Laptop 8" src="https://cdn.mos.cms.futurecdn.net/xW6sk6frPNnwt6oxE5Txia.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></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 Surface Laptop 8 hasn’t received a major design overhaul since the last model, which is fine, considering we still get a slim yet sturdy machine. The dark aluminum alloy chassis not only looks great but also has a soft surface that feels nice in the hand. </p><p>As before, it has a slightly tapered design, which can be seen as a throwback compared to the flatter laptops we currently see, but I like 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="Z7xKHcgMm8RszgxvHZ6MER" name="Microsoft Surface Laptop (2026)-8" alt="Microsoft Surface Laptop 8" src="https://cdn.mos.cms.futurecdn.net/Z7xKHcgMm8RszgxvHZ6MER.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></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 get an enjoyable typing experience thanks to the relatively roomy keyboard deck. The thick keycaps and their short travel distance allow you to type with little resistance. I’m also fond of the touchpad, which delivers satisfying haptic feedback when pressed. With some apps, you will even feel haptics when hovering over the X button on a window, which is quite fun and intuitive.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6TC9VRQEnerD56fMurJgZW" name="Microsoft Surface Laptop (2026)-4" alt="Microsoft Surface Laptop 8" src="https://cdn.mos.cms.futurecdn.net/6TC9VRQEnerD56fMurJgZW.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There are a decent number of ports for such a slim laptop. This includes a pair of USB-C ports, a 3.5mm headphone jack, and a full SD card slot. I especially appreciate the lone USB-A port, which lets me connect legacy wired devices.</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="cATjpQmL7iBc8qG8HE4Jfi" name="Microsoft Surface Laptop (2026)-7" alt="Microsoft Surface Laptop 8" src="https://cdn.mos.cms.futurecdn.net/cATjpQmL7iBc8qG8HE4Jfi.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></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 Surface Laptop 8 might not have the most impressive display, but it’s plenty bright and colorful for everyday work and even recreation.</p><p>When watching a YouTube video, I had no problem seeing even the smallest details of a colorful, sun-drenched beach. Naturally, websites also look and run well thanks to the sharp 2304x1536 resolution and smooth 120Hz refresh rate.</p><div ><table><caption>Display benchmark results</caption><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Microsoft Surface Laptop 8</strong></p></th><th  ><p><strong>MacBook Air 13-inch M5</strong></p></th><th  ><p><strong>MSI Prestige 14 Flip</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Nits (brightness)</strong></p></td><td  ><p>432 (SDR) | 481 (HDR)</p></td><td  ><p>458 (SDR) | 468 (HDR)</p></td><td  ><p>248 (SDR)</p></td></tr><tr><td class="firstcol " ><p><strong>sRGB</strong></p></td><td  ><p>108.3%</p></td><td  ><p>117.3%</p></td><td  ><p>130.4%</p></td></tr><tr><td class="firstcol " ><p><strong>DCI-P3</strong></p></td><td  ><p>76.7%</p></td><td  ><p>83.1%</p></td><td  ><p>92.4%</p></td></tr><tr><td class="firstcol " ><p><strong>Delta-E</strong></p></td><td  ><p>0.29</p></td><td  ><p>0.21</p></td><td  ><p>0.22</p></td></tr></tbody></table></div><p>Our lab tests corroborate what my eyes experienced. As you can see in the table above, Microsoft’s notebook delivers a good level of SDR and HDR brightness, though both fall short of 500 nits. That’s not terrible, considering how the MacBook Air couldn’t hit that mark either. The <a href="https://www.tomsguide.com/computing/laptops/msi-prestige-14-flip-ai-review">MSI Prestige 14 Flip AI+ </a>also fell behind the Surface Laptop’s intensity.</p><p>Color representation (sRGB and DCI-P3) is roughly on par with the MacBook Air, which is reflected in how good the colors can look. Color accuracy (Delta-E) isn’t what it should be (closer to 0 is best), but it’s also not terrible. The Prestige 14 Flip delivers slightly oversaturated colors in comparison.</p><p>The anti-glare and privacy screens on the model I reviewed are equally impressive. Even under direct sunlight, the anti-glare technology allowed me to view the display reasonably well. I also liked how effective the privacy screen is, since you can’t see much unless the display is directly in front of you. If you’re working with sensitive documents, this privacy screen will be extremely beneficial.</p><h2 id="fast-performance">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="dMwUdeVcgTcgchLUnQgpQ3" name="Microsoft Surface Laptop (2026)-5" alt="Microsoft Surface Laptop 8" src="https://cdn.mos.cms.futurecdn.net/dMwUdeVcgTcgchLUnQgpQ3.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></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 Surface Laptop 8 I reviewed packs an Intel Core Ultra x7 368H “Panther Lake” CPU and 32GB of RAM. Thanks to that, the laptop easily handled my average workflow, which usually consists of dozens of open Chrome tabs and the occasional YouTube video. This is just another example of Panther Lake’s stunning performance.</p><div ><table><caption>Performance benchmarks</caption><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Microsoft Surface Laptop 8</strong></p></th><th  ><p><strong>MacBook Air 13-inch M5</strong></p></th><th  ><p><strong>MSI Prestige 14 Flip</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Geekbench (single/multi-core)</strong></p></td><td  ><p>2939 / 17,213</p></td><td  ><p>4168 / 17,067</p></td><td  ><p>2839 / 16,558</p></td></tr><tr><td class="firstcol " ><p><strong>Handbrake</strong></p></td><td  ><p>5:08</p></td><td  ><p>5:08</p></td><td  ><p>6:03</p></td></tr></tbody></table></div><p>As you can see above, the Surface Laptop 8 keeps pace with the M5-driven MacBook Air in multi-threaded performance, though Apple’s notebook is more adept with single-core tasks. The Prestige 14 Flip, which has similar specs to the Surface Laptop 8, fell just slightly behind.</p><p>In the Handbrake test, the Surface Laptop 8 took 5 minutes and 8 seconds to transcode a 4K video to 1080p. That’s the equivalent of the MacBook Air’s time, which is nearly one minute faster than the Prestige 14 Flip.</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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xDEnqnGZeD8AyVAgYCV2XB" name="Microsoft Surface Laptop (2026)-9" alt="Microsoft Surface Laptop 8" src="https://cdn.mos.cms.futurecdn.net/xDEnqnGZeD8AyVAgYCV2XB.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></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 our battery test, which involves continuous web surfing over Wi-Fi with the display set to 150 nits of brightness, the Surface Pro 8 lasted for 12 hours and 26 minutes.</p><div ><table><caption>Battery life results</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Time (hours:mins)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Microsoft Surface Laptop 7</strong></p></td><td  ><p>12:26</p></td></tr><tr><td class="firstcol " ><p><strong>MacBook Air 13-inch M5</strong></p></td><td  ><p>15:28</p></td></tr><tr><td class="firstcol " ><p><strong>MSI Prestige 14 Flip</strong></p></td><td  ><p>20:26</p></td></tr></tbody></table></div><p>Of course, the two laptops I compared lasted much longer. The big winner here is the Prestige 14 Flip, which is one of the longest-lasting laptops we’ve tested. However, it’s important to note that this laptop has a slightly less powerful, less energy-intensive Panther Lake chip, which accounts for its impressive endurance.</p><p>I should note that we were only able to run one battery test on the Surface Laptop. We may see better numbers after we run three tests as usual, but not by much. I’ll update this review with the fresh numbers once we have them.</p><h3 class="article-body__section" id="section-microsoft-surface-laptop-8-review-the-downs"><span>Microsoft Surface Laptop 8 review: The downs</span></h3><p>There’s a lot to like about the Surface Laptop, but it has one glaring flaw that can make it unattractive to regular users.</p><h2 id="steep-asking-price">Steep asking 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="scUTKofH5GCXddaZka43pH" name="Microsoft Surface Laptop (2026)-2" alt="Microsoft Surface Laptop 8" src="https://cdn.mos.cms.futurecdn.net/scUTKofH5GCXddaZka43pH.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>With a starting price of $1,949, the Surface Laptop 8 costs nearly $1,000 more than its predecessor. While it’s perhaps unrealistic to expect a comparable price thanks to <a href="https://www.tomsguide.com/computing/ram-price-crisis-2026-everything-you-need-to-know">RAMageddon</a>, that’s still a serious amount of cash to plunk down.</p><p>In fairness, the former and current Surface Laptops are for different users. The older model was marketed toward average consumers, so it needed to be priced competitively. However, as a business laptop, it’s understandable that the new model costs more, even if its updates are mostly iterative.</p><p>If you’re lucky enough to have your company spring for a new Surface Laptop 8, then you’ll be sitting pretty. But if you decide to buy one of these for yourself, be prepared to pay a premium.</p><h3 class="article-body__section" id="section-microsoft-surface-laptop-8-review-verdict"><span>Microsoft Surface Laptop 8 review: Verdict</span></h3><p>I don’t often review business laptops, but I jumped at the chance to test the Microsoft Surface Laptop 8 since I’ve always admired this series. It’s arguably the best one yet, even though this notebook is meant for enterprise.</p><p>Though I’m impressed by what it offers, it’s hard to recommend this notebook to the average reader I normally write for. You’re better off with something like the 13-inch MacBook Air or MSI Prestige 14 Flip AI+, which cost $1,099 and $1,299 (respectively). You’ll get a comparable or better experience for hundreds less.</p><p>Price aside, the Microsoft Surface Laptop 8 delivers where it matters. If you’re looking for a dependable business notebook and have the cash for it, you won’t go wrong.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/laptops/the-new-microsoft-surface-laptop-8-is-great-but-its-hard-to-recommend-to-most-people</link>
                                                                            <description>
                            <![CDATA[ The Microsoft Surface Laptop 8 offers strong performance and long battery life. However, its high $1,949 asking price is a lot to ask for the average consumer. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">XiDjoogzMCmhvCnpBgwic3</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/EVvuB7jhT5G2QWBGtYr2XQ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 19 May 2026 13:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Laptops]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                                                                <author><![CDATA[ tony.polanco@futurenet.com (Tony Polanco) ]]></author>                    <dc:creator><![CDATA[ Tony Polanco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/atzRNqFt5wYgEUPBDahWsD.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/EVvuB7jhT5G2QWBGtYr2XQ-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Microsoft Surface Laptop 8 on a desk.]]></media:description>                                                            <media:text><![CDATA[Microsoft Surface Laptop 8 on a desk.]]></media:text>
                                <media:title type="plain"><![CDATA[Microsoft Surface Laptop 8 on a desk.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/EVvuB7jhT5G2QWBGtYr2XQ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Microsoft Surface Laptop 8 (starting at $1,949), or Microsoft Surface Laptop for Business, as it is officially called, updates the company’s eponymous notebook with the latest Intel CPU, an updated haptic touchpad, and an optional built-in anti-glare privacy screen. Though designed as a business laptop, it’s a solid device overall for anyone willing to pay its steep price.</p><p>Like the <a href="https://www.tomsguide.com/computing/laptops/microsoft-surface-laptop-7-review">Surface Laptop 7</a>, the new Surface Laptop is a sleek ultraportable you can easily carry. It’s just slightly larger and heavier than the 13-inch <a href="https://www.tomsguide.com/computing/macbooks/macbook-air-m5-review">MacBook Air M5</a>, which is very impressive. Despite its slim profile, it packs at least one USB-A port for legacy devices and a pair of USB-C ports.</p><p>One major upgrade is the optional built-in anti-glare privacy screen. The former is especially useful if you don’t want wandering eyes to see what you’re working on in a public spot. The anti-glare coating does a fantastic job of ensuring the display is visible even in direct sunlight. These are highlights of what is an otherwise average laptop panel.</p><p>Thanks to the Intel Core Ultra Series 3 “<a href="https://www.tomsguide.com/computing/cpus/intel-panther-lake-cpus-promise-insane-gains-50-percent-faster-with-a-breakthrough-gpu">Panther Lake</a>” chip inside, the Surface Laptop 8 delivers stunning performance and solid battery life. Not only do you get enough power for everyday work, but you can even run some modern games for when you’re off the clock. And while battery life might not be as impressive as on a MacBook, you’re getting well over a full day of use.</p><p>Given its status as a business laptop and its high starting price, you might want to consider a regular consumer laptop with similar specs. However, if you’re a longtime Surface Laptop fan and are willing to spend big for the best iteration of that device yet, this is a machine worth considering. Find out in my full review.</p><h3 class="article-body__section" id="section-microsoft-surface-laptop-8-review-cheat-sheet"><span>Microsoft Surface Laptop 8 review: Cheat sheet</span></h3><ul><li><strong>What is it?</strong> The Microsoft Surface Laptop 8 is a business laptop packing the latest Intel Panther Lake chip.</li><li><strong>Who is it for?</strong> For workers who need a reliable notebook for everyday work.</li><li><strong>What does it cost?</strong> The Surface Laptop 8 starts at $1,949.</li><li><strong>What do we like?</strong> We like the slim design, strong performance, anti-glare display option, and strong battery life.</li><li><strong>What don’t we like?</strong> We don’t like that it costs nearly $1,000 more than the previous model.</li></ul><h3 class="article-body__section" id="section-microsoft-surface-laptop-8-review-specs"><span>Microsoft Surface Laptop 8 review: Specs</span></h3><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Microsoft Surface Laptop 8</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price (starting)</strong></p></td><td  ><p>$1,949</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>13.8-inch (2304x1536) 120Hz</p></td></tr><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>Intel Core Ultra x7 368 H</p></td></tr><tr><td class="firstcol " ><p><strong>GPU</strong></p></td><td  ><p>Intel Arc Graphics</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>32GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>512GB</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Wi-Fi 7, Bluetooth 5.4</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>2x USB-C, 1x USB-A, 1x SD card slot, 1x 3.5mm headphone jack</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>11.85 x 8.67 x 0.69 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>2.97 pounds</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-microsoft-surface-laptop-8-review-the-ups"><span>Microsoft Surface Laptop 8 review: The ups</span></h3><p>The Microsoft Surface Laptop 8 has a lot going for it, thanks to its strong Panther Lake performance, ultraportable design, and long battery life.</p><h2 id="elegant-design">Elegant 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="xW6sk6frPNnwt6oxE5Txia" name="Microsoft Surface Laptop (2026)-10" alt="Microsoft Surface Laptop 8" src="https://cdn.mos.cms.futurecdn.net/xW6sk6frPNnwt6oxE5Txia.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></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 Surface Laptop 8 hasn’t received a major design overhaul since the last model, which is fine, considering we still get a slim yet sturdy machine. The dark aluminum alloy chassis not only looks great but also has a soft surface that feels nice in the hand. </p><p>As before, it has a slightly tapered design, which can be seen as a throwback compared to the flatter laptops we currently see, but I like 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="Z7xKHcgMm8RszgxvHZ6MER" name="Microsoft Surface Laptop (2026)-8" alt="Microsoft Surface Laptop 8" src="https://cdn.mos.cms.futurecdn.net/Z7xKHcgMm8RszgxvHZ6MER.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></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 get an enjoyable typing experience thanks to the relatively roomy keyboard deck. The thick keycaps and their short travel distance allow you to type with little resistance. I’m also fond of the touchpad, which delivers satisfying haptic feedback when pressed. With some apps, you will even feel haptics when hovering over the X button on a window, which is quite fun and intuitive.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6TC9VRQEnerD56fMurJgZW" name="Microsoft Surface Laptop (2026)-4" alt="Microsoft Surface Laptop 8" src="https://cdn.mos.cms.futurecdn.net/6TC9VRQEnerD56fMurJgZW.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There are a decent number of ports for such a slim laptop. This includes a pair of USB-C ports, a 3.5mm headphone jack, and a full SD card slot. I especially appreciate the lone USB-A port, which lets me connect legacy wired devices.</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="cATjpQmL7iBc8qG8HE4Jfi" name="Microsoft Surface Laptop (2026)-7" alt="Microsoft Surface Laptop 8" src="https://cdn.mos.cms.futurecdn.net/cATjpQmL7iBc8qG8HE4Jfi.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></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 Surface Laptop 8 might not have the most impressive display, but it’s plenty bright and colorful for everyday work and even recreation.</p><p>When watching a YouTube video, I had no problem seeing even the smallest details of a colorful, sun-drenched beach. Naturally, websites also look and run well thanks to the sharp 2304x1536 resolution and smooth 120Hz refresh rate.</p><div ><table><caption>Display benchmark results</caption><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Microsoft Surface Laptop 8</strong></p></th><th  ><p><strong>MacBook Air 13-inch M5</strong></p></th><th  ><p><strong>MSI Prestige 14 Flip</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Nits (brightness)</strong></p></td><td  ><p>432 (SDR) | 481 (HDR)</p></td><td  ><p>458 (SDR) | 468 (HDR)</p></td><td  ><p>248 (SDR)</p></td></tr><tr><td class="firstcol " ><p><strong>sRGB</strong></p></td><td  ><p>108.3%</p></td><td  ><p>117.3%</p></td><td  ><p>130.4%</p></td></tr><tr><td class="firstcol " ><p><strong>DCI-P3</strong></p></td><td  ><p>76.7%</p></td><td  ><p>83.1%</p></td><td  ><p>92.4%</p></td></tr><tr><td class="firstcol " ><p><strong>Delta-E</strong></p></td><td  ><p>0.29</p></td><td  ><p>0.21</p></td><td  ><p>0.22</p></td></tr></tbody></table></div><p>Our lab tests corroborate what my eyes experienced. As you can see in the table above, Microsoft’s notebook delivers a good level of SDR and HDR brightness, though both fall short of 500 nits. That’s not terrible, considering how the MacBook Air couldn’t hit that mark either. The <a href="https://www.tomsguide.com/computing/laptops/msi-prestige-14-flip-ai-review">MSI Prestige 14 Flip AI+ </a>also fell behind the Surface Laptop’s intensity.</p><p>Color representation (sRGB and DCI-P3) is roughly on par with the MacBook Air, which is reflected in how good the colors can look. Color accuracy (Delta-E) isn’t what it should be (closer to 0 is best), but it’s also not terrible. The Prestige 14 Flip delivers slightly oversaturated colors in comparison.</p><p>The anti-glare and privacy screens on the model I reviewed are equally impressive. Even under direct sunlight, the anti-glare technology allowed me to view the display reasonably well. I also liked how effective the privacy screen is, since you can’t see much unless the display is directly in front of you. If you’re working with sensitive documents, this privacy screen will be extremely beneficial.</p><h2 id="fast-performance">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="dMwUdeVcgTcgchLUnQgpQ3" name="Microsoft Surface Laptop (2026)-5" alt="Microsoft Surface Laptop 8" src="https://cdn.mos.cms.futurecdn.net/dMwUdeVcgTcgchLUnQgpQ3.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></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 Surface Laptop 8 I reviewed packs an Intel Core Ultra x7 368H “Panther Lake” CPU and 32GB of RAM. Thanks to that, the laptop easily handled my average workflow, which usually consists of dozens of open Chrome tabs and the occasional YouTube video. This is just another example of Panther Lake’s stunning performance.</p><div ><table><caption>Performance benchmarks</caption><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Microsoft Surface Laptop 8</strong></p></th><th  ><p><strong>MacBook Air 13-inch M5</strong></p></th><th  ><p><strong>MSI Prestige 14 Flip</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Geekbench (single/multi-core)</strong></p></td><td  ><p>2939 / 17,213</p></td><td  ><p>4168 / 17,067</p></td><td  ><p>2839 / 16,558</p></td></tr><tr><td class="firstcol " ><p><strong>Handbrake</strong></p></td><td  ><p>5:08</p></td><td  ><p>5:08</p></td><td  ><p>6:03</p></td></tr></tbody></table></div><p>As you can see above, the Surface Laptop 8 keeps pace with the M5-driven MacBook Air in multi-threaded performance, though Apple’s notebook is more adept with single-core tasks. The Prestige 14 Flip, which has similar specs to the Surface Laptop 8, fell just slightly behind.</p><p>In the Handbrake test, the Surface Laptop 8 took 5 minutes and 8 seconds to transcode a 4K video to 1080p. That’s the equivalent of the MacBook Air’s time, which is nearly one minute faster than the Prestige 14 Flip.</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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xDEnqnGZeD8AyVAgYCV2XB" name="Microsoft Surface Laptop (2026)-9" alt="Microsoft Surface Laptop 8" src="https://cdn.mos.cms.futurecdn.net/xDEnqnGZeD8AyVAgYCV2XB.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></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 our battery test, which involves continuous web surfing over Wi-Fi with the display set to 150 nits of brightness, the Surface Pro 8 lasted for 12 hours and 26 minutes.</p><div ><table><caption>Battery life results</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Time (hours:mins)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Microsoft Surface Laptop 7</strong></p></td><td  ><p>12:26</p></td></tr><tr><td class="firstcol " ><p><strong>MacBook Air 13-inch M5</strong></p></td><td  ><p>15:28</p></td></tr><tr><td class="firstcol " ><p><strong>MSI Prestige 14 Flip</strong></p></td><td  ><p>20:26</p></td></tr></tbody></table></div><p>Of course, the two laptops I compared lasted much longer. The big winner here is the Prestige 14 Flip, which is one of the longest-lasting laptops we’ve tested. However, it’s important to note that this laptop has a slightly less powerful, less energy-intensive Panther Lake chip, which accounts for its impressive endurance.</p><p>I should note that we were only able to run one battery test on the Surface Laptop. We may see better numbers after we run three tests as usual, but not by much. I’ll update this review with the fresh numbers once we have them.</p><h3 class="article-body__section" id="section-microsoft-surface-laptop-8-review-the-downs"><span>Microsoft Surface Laptop 8 review: The downs</span></h3><p>There’s a lot to like about the Surface Laptop, but it has one glaring flaw that can make it unattractive to regular users.</p><h2 id="steep-asking-price">Steep asking 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="scUTKofH5GCXddaZka43pH" name="Microsoft Surface Laptop (2026)-2" alt="Microsoft Surface Laptop 8" src="https://cdn.mos.cms.futurecdn.net/scUTKofH5GCXddaZka43pH.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>With a starting price of $1,949, the Surface Laptop 8 costs nearly $1,000 more than its predecessor. While it’s perhaps unrealistic to expect a comparable price thanks to <a href="https://www.tomsguide.com/computing/ram-price-crisis-2026-everything-you-need-to-know">RAMageddon</a>, that’s still a serious amount of cash to plunk down.</p><p>In fairness, the former and current Surface Laptops are for different users. The older model was marketed toward average consumers, so it needed to be priced competitively. However, as a business laptop, it’s understandable that the new model costs more, even if its updates are mostly iterative.</p><p>If you’re lucky enough to have your company spring for a new Surface Laptop 8, then you’ll be sitting pretty. But if you decide to buy one of these for yourself, be prepared to pay a premium.</p><h3 class="article-body__section" id="section-microsoft-surface-laptop-8-review-verdict"><span>Microsoft Surface Laptop 8 review: Verdict</span></h3><p>I don’t often review business laptops, but I jumped at the chance to test the Microsoft Surface Laptop 8 since I’ve always admired this series. It’s arguably the best one yet, even though this notebook is meant for enterprise.</p><p>Though I’m impressed by what it offers, it’s hard to recommend this notebook to the average reader I normally write for. You’re better off with something like the 13-inch MacBook Air or MSI Prestige 14 Flip AI+, which cost $1,099 and $1,299 (respectively). You’ll get a comparable or better experience for hundreds less.</p><p>Price aside, the Microsoft Surface Laptop 8 delivers where it matters. If you’re looking for a dependable business notebook and have the cash for it, you won’t go wrong.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Microsoft admits Windows users 'experienced some challenges' with the forced CoPilot key — now it's finally doing something about it ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Microsoft made the biggest change to Windows keyboards in 30 years by adding a dedicated <a href="https://www.tomsguide.com/news/windows-copilot-is-getting-its-own-key-on-the-keyboard-heres-why-thats-a-big-deal">Copilot key</a> to its <a href="https://www.tomsguide.com/news/windows-11-ai-copilot-now-available-to-try-heres-everything-you-can-do">Copilot+ PCs when they started rolling out </a>a couple of years ago. </p><p>Unfortunately, what looked like a means of leveraging Windows' massive adoption into an AI leadership position seems to have backfired. All it takes is a scroll through <a href="https://www.reddit.com/r/microsoft/comments/1oay0qg/the_copilot_key_was_a_terrible_idea/">Reddit</a> to see how much people dislike the button, and my colleague Tony Polanco called it the<a href="https://www.tomsguide.com/computing/microsoft-may-finally-fix-the-worst-thing-about-copilot-pcs"> worst thing about Copilot+ PCs last year</a>.</p><p>Now, Microsoft appears to be relenting by officially announcing it will let users remap the Copilot button back to the Right Ctrl or Context menu options it replaced. </p><p>In a recently published <a href="https://support.microsoft.com/en-us/accessibility/windows/copilot/understand-updates-to-the-copilot-key-on-windows-devices#cw" target="_blank">support document</a>, Microsoft stated: "Customers who rely on the Right Ctrl key or Context menu key for keyboard shortcuts or assistive technologies (such as screen readers) experienced some challenges to their workflows when using these devices."</p><p>"A Windows 11 update will ship later this year that will add a setting option to let you remap the Copilot key to act as the Context menu key or Right Ctrl key. When available, you can find this setting in: <strong>Settings</strong> > <strong>Bluetooth & devices</strong> > <strong>Keyboard</strong>" </p><div><blockquote><p>A Windows 11 update will ship later this year that will add a setting option to let you remap the Copilot key</p><p>Microsoft</p></blockquote></div><p>While I've never needed the Right Ctrl or Context menu for my own typical workflow, I've lost count of the number of times I've accidentally triggered Copilot by hitting that key. And while I use a number of different AI assistants over the course of a week, Copilot is very rarely among them.</p><div><blockquote><p>I've lost count of the number of times I've accidentally triggered Copilot by hitting that key.</p></blockquote></div><p>Some PC manufacturers do let users remap the Copilot key with their own on-device software and we have our own Tom's Guide tutorial on <a href="https://www.tomsguide.com/computing/windows-operating-systems/how-to-remap-the-copilot-key-on-windows-11">how to remap the Copilot key on Windows 11</a>. However, both of those solutions will require additional steps and won't be as simple as a native solution within the OS that applies universally to all Windows 11 laptops with a Copilot key.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1384px;"><p class="vanilla-image-block" style="padding-top:56.21%;"><img id="yvkdgPgnazUMRxASPCg3BA" name="copilotkeylead1.jpg" alt="Windows Copilot key" src="https://cdn.mos.cms.futurecdn.net/yvkdgPgnazUMRxASPCg3BA.jpg" mos="" align="middle" fullscreen="" width="1384" height="778" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Microsoft hasn't specified exactly when we may see this update, only noting it will be in a "future Windows 11 update." Microsoft typically drops major updates for Windows in October and, occasionally, in September. So in all likelihood, it could still be another five months before we see this change rolled out. </p><p>In the meantime, here are <a href="https://www.tomsguide.com/ai/7-copilot-prompts-that-make-windows-11-way-more-useful">7 genius Copilot prompts that make Windows 11 instantly more useful</a>.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XpJL8W"></div>                            </div>                            <script src="https://kwizly.com/embed/XpJL8W.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/online-security/do-you-use-microsoft-exchange-hackers-are-actively-exploiting-a-new-zero-day-flaw">Do you use Microsoft Exchange? Hackers are actively exploiting a new zero-day flaw</a></li><li><a href="https://www.tomsguide.com/home/home-office/corsair-platform-4-elevate-review">I’ve spent almost a year testing the Corsair Platform 4 — and it’s my gaming desk setup endgame</a></li><li><a href="https://www.tomsguide.com/computing/laptops/9-laptop-accessories-under-usd50-id-buy-with-my-own-money-right-now">9 laptop accessories under $50 I'd buy with my own money right now</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/windows-operating-systems/microsoft-admits-windows-users-experienced-some-challenges-with-the-forced-copilot-key-now-its-finally-doing-something-about-it</link>
                                                                            <description>
                            <![CDATA[ Microsoft has acknowledged the dedicated Copilot key on Windows hasn't been universally loved, and a future Windows 11 update will allow users to remap it. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">XmUBzPF3ccGMxGeJc8MVEB</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/p4EYbySyHqVQhoTUeNqd5Z-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 18 May 2026 12:27:36 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Windows Operating Systems]]></category>
                                                    <category><![CDATA[Copilot]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Software]]></category>
                                                    <category><![CDATA[Operating Systems]]></category>
                                                    <category><![CDATA[AI]]></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/p4EYbySyHqVQhoTUeNqd5Z-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Windows 11 Copilot]]></media:description>                                                            <media:text><![CDATA[Windows 11 Copilot]]></media:text>
                                <media:title type="plain"><![CDATA[Windows 11 Copilot]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/p4EYbySyHqVQhoTUeNqd5Z-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Microsoft made the biggest change to Windows keyboards in 30 years by adding a dedicated <a href="https://www.tomsguide.com/news/windows-copilot-is-getting-its-own-key-on-the-keyboard-heres-why-thats-a-big-deal">Copilot key</a> to its <a href="https://www.tomsguide.com/news/windows-11-ai-copilot-now-available-to-try-heres-everything-you-can-do">Copilot+ PCs when they started rolling out </a>a couple of years ago. </p><p>Unfortunately, what looked like a means of leveraging Windows' massive adoption into an AI leadership position seems to have backfired. All it takes is a scroll through <a href="https://www.reddit.com/r/microsoft/comments/1oay0qg/the_copilot_key_was_a_terrible_idea/">Reddit</a> to see how much people dislike the button, and my colleague Tony Polanco called it the<a href="https://www.tomsguide.com/computing/microsoft-may-finally-fix-the-worst-thing-about-copilot-pcs"> worst thing about Copilot+ PCs last year</a>.</p><p>Now, Microsoft appears to be relenting by officially announcing it will let users remap the Copilot button back to the Right Ctrl or Context menu options it replaced. </p><p>In a recently published <a href="https://support.microsoft.com/en-us/accessibility/windows/copilot/understand-updates-to-the-copilot-key-on-windows-devices#cw" target="_blank">support document</a>, Microsoft stated: "Customers who rely on the Right Ctrl key or Context menu key for keyboard shortcuts or assistive technologies (such as screen readers) experienced some challenges to their workflows when using these devices."</p><p>"A Windows 11 update will ship later this year that will add a setting option to let you remap the Copilot key to act as the Context menu key or Right Ctrl key. When available, you can find this setting in: <strong>Settings</strong> > <strong>Bluetooth & devices</strong> > <strong>Keyboard</strong>" </p><div><blockquote><p>A Windows 11 update will ship later this year that will add a setting option to let you remap the Copilot key</p><p>Microsoft</p></blockquote></div><p>While I've never needed the Right Ctrl or Context menu for my own typical workflow, I've lost count of the number of times I've accidentally triggered Copilot by hitting that key. And while I use a number of different AI assistants over the course of a week, Copilot is very rarely among them.</p><div><blockquote><p>I've lost count of the number of times I've accidentally triggered Copilot by hitting that key.</p></blockquote></div><p>Some PC manufacturers do let users remap the Copilot key with their own on-device software and we have our own Tom's Guide tutorial on <a href="https://www.tomsguide.com/computing/windows-operating-systems/how-to-remap-the-copilot-key-on-windows-11">how to remap the Copilot key on Windows 11</a>. However, both of those solutions will require additional steps and won't be as simple as a native solution within the OS that applies universally to all Windows 11 laptops with a Copilot key.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1384px;"><p class="vanilla-image-block" style="padding-top:56.21%;"><img id="yvkdgPgnazUMRxASPCg3BA" name="copilotkeylead1.jpg" alt="Windows Copilot key" src="https://cdn.mos.cms.futurecdn.net/yvkdgPgnazUMRxASPCg3BA.jpg" mos="" align="middle" fullscreen="" width="1384" height="778" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Microsoft hasn't specified exactly when we may see this update, only noting it will be in a "future Windows 11 update." Microsoft typically drops major updates for Windows in October and, occasionally, in September. So in all likelihood, it could still be another five months before we see this change rolled out. </p><p>In the meantime, here are <a href="https://www.tomsguide.com/ai/7-copilot-prompts-that-make-windows-11-way-more-useful">7 genius Copilot prompts that make Windows 11 instantly more useful</a>.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XpJL8W"></div>                            </div>                            <script src="https://kwizly.com/embed/XpJL8W.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/online-security/do-you-use-microsoft-exchange-hackers-are-actively-exploiting-a-new-zero-day-flaw">Do you use Microsoft Exchange? Hackers are actively exploiting a new zero-day flaw</a></li><li><a href="https://www.tomsguide.com/home/home-office/corsair-platform-4-elevate-review">I’ve spent almost a year testing the Corsair Platform 4 — and it’s my gaming desk setup endgame</a></li><li><a href="https://www.tomsguide.com/computing/laptops/9-laptop-accessories-under-usd50-id-buy-with-my-own-money-right-now">9 laptop accessories under $50 I'd buy with my own money right now</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Do you use Microsoft Exchange? Hackers are actively exploiting a new zero-day flaw ]]></title>
                                                                                                <dc:content><![CDATA[ <p>A newly discovered zero-day vulnerability in Microsoft Exchange Server has experts sounding the alarm. On Thursday, Microsoft announced mitigations for a high-security Exchange Server vulnerability that's being actively exploited by hackers. All an attacker needs to do is send a specially crafted email that, when opened through Outlook Web Access, can execute arbitrary code within the user's browser. </p><p>Microsoft's called this security flaw (tracked as CVE-2026-42897) a spoofing vulnerability affecting fully updated versions of Exchange Server 2016, Exchange Server 2019, and Exchange Server Subscription Edition (SE). </p><p>"An attacker could exploit this issue by sending a specially crafted email to a user. If the user opens the email in Outlook Web Access and certain interaction conditions are met, arbitrary JavaScript can be executed in the browser context," the <a href="https://techcommunity.microsoft.com/blog/exchange/addressing-exchange-server-may-2026-vulnerability-cve-2026-42897/4518498" target="_blank" rel="nofollow">Exchange Team said</a>.</p><p>Although security patches are not yet available, Microsoft said the Exchange Emergency Mitigation Service (EEMS) can provide automatic mitigation for Exchange Server 2016, 2019, and SE on-premises servers. </p><p>"Using EM Service is the best way for your organization to mitigate this vulnerability right away. If you have EM Service currently disabled, we recommend you enable it right away. Please note that EM Service will not be able to check for new mitigations if your server is running Exchange Server version older than March 2023," per the Exchange Team. </p><p>To check the status of the Exchange Emergency Mitigation Service, organizations should follow Microsoft's instructions on running the <a href="https://microsoft.github.io/CSS-Exchange/Diagnostics/HealthChecker/" target="_blank">Exchange Health Checker script</a>.</p><p>May has been one hell of a month for Microsoft's security team. In the last week alone, Microsoft's fixed over 130 vulnerabilities as part of its Patch Tuesday cycle, many of which are driven by a new AI-powered bug-hunting system codenamed MDASH (Multi-model Agentic Scanning Harness). </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/i-tried-this-expert-approved-15-minute-friday-reset-decluttering-hack-heres-what-happened">I tried this expert-approved '15-minute Friday reset' decluttering hack — here’s what happened</a></li><li><a href="https://www.tomsguide.com/computing/online-security/is-your-personal-information-public-the-simple-step-to-securing-your-privacy-online">Is your personal information public? The simple step to securing your privacy online</a></li><li><a href="https://www.tomsguide.com/computing/online-security/microsofts-urgent-window-11-patch-fixes-30-critical-bugs-update-your-pc-now">Microsoft's urgent Window 11 patch fixes 30 'critical' bugs — update your PC now</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/online-security/do-you-use-microsoft-exchange-hackers-are-actively-exploiting-a-new-zero-day-flaw</link>
                                                                            <description>
                            <![CDATA[ Microsoft warns of a new zero-day vulnerability that leaves Exchange open to hackers. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">T5Ye4VFqWAKpKyhRbnYNHm</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/bEGv46ifp9o2EfVX8xAqPK-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 17 May 2026 18:55:56 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Online Security]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Internet]]></category>
                                                                                                                    <dc:creator><![CDATA[ Alyse Stanley ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/BxNnQuBWRHqkv5xWZsjrjc.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Alyse Stanley is a news editor at Tom’s Guide, overseeing weekend coverage and writing about the latest in tech, gaming, and entertainment. Before Tom’s Guide, Alyse worked as an editor for the Washington Post’s sunsetted video game section, Launcher, where she also wrote about indie games you shouldn’t miss, how to tackle your gaming backlog, and all things Nintendo. She previously led Gizmodo’s weekend news desk covering breaking tech news and has written game reviews and features for outlets like Polygon, Unwinnable, and Rock, Paper, Shotgun. A recent Chicago-area transplant born and raised in Virginia, Alyse is a big fan of horror movies, cartoons, and roller skating. She&#039;s also a puzzle fan and can often be found contributing to the NYT Connections coverage on Tom&#039;s Guide &lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/bEGv46ifp9o2EfVX8xAqPK-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A person using a laptop with a warning message appearing on screen]]></media:description>                                                            <media:text><![CDATA[A person using a laptop with a warning message appearing on screen]]></media:text>
                                <media:title type="plain"><![CDATA[A person using a laptop with a warning message appearing on screen]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/bEGv46ifp9o2EfVX8xAqPK-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>A newly discovered zero-day vulnerability in Microsoft Exchange Server has experts sounding the alarm. On Thursday, Microsoft announced mitigations for a high-security Exchange Server vulnerability that's being actively exploited by hackers. All an attacker needs to do is send a specially crafted email that, when opened through Outlook Web Access, can execute arbitrary code within the user's browser. </p><p>Microsoft's called this security flaw (tracked as CVE-2026-42897) a spoofing vulnerability affecting fully updated versions of Exchange Server 2016, Exchange Server 2019, and Exchange Server Subscription Edition (SE). </p><p>"An attacker could exploit this issue by sending a specially crafted email to a user. If the user opens the email in Outlook Web Access and certain interaction conditions are met, arbitrary JavaScript can be executed in the browser context," the <a href="https://techcommunity.microsoft.com/blog/exchange/addressing-exchange-server-may-2026-vulnerability-cve-2026-42897/4518498" target="_blank" rel="nofollow">Exchange Team said</a>.</p><p>Although security patches are not yet available, Microsoft said the Exchange Emergency Mitigation Service (EEMS) can provide automatic mitigation for Exchange Server 2016, 2019, and SE on-premises servers. </p><p>"Using EM Service is the best way for your organization to mitigate this vulnerability right away. If you have EM Service currently disabled, we recommend you enable it right away. Please note that EM Service will not be able to check for new mitigations if your server is running Exchange Server version older than March 2023," per the Exchange Team. </p><p>To check the status of the Exchange Emergency Mitigation Service, organizations should follow Microsoft's instructions on running the <a href="https://microsoft.github.io/CSS-Exchange/Diagnostics/HealthChecker/" target="_blank">Exchange Health Checker script</a>.</p><p>May has been one hell of a month for Microsoft's security team. In the last week alone, Microsoft's fixed over 130 vulnerabilities as part of its Patch Tuesday cycle, many of which are driven by a new AI-powered bug-hunting system codenamed MDASH (Multi-model Agentic Scanning Harness). </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/i-tried-this-expert-approved-15-minute-friday-reset-decluttering-hack-heres-what-happened">I tried this expert-approved '15-minute Friday reset' decluttering hack — here’s what happened</a></li><li><a href="https://www.tomsguide.com/computing/online-security/is-your-personal-information-public-the-simple-step-to-securing-your-privacy-online">Is your personal information public? The simple step to securing your privacy online</a></li><li><a href="https://www.tomsguide.com/computing/online-security/microsofts-urgent-window-11-patch-fixes-30-critical-bugs-update-your-pc-now">Microsoft's urgent Window 11 patch fixes 30 'critical' bugs — update your PC now</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Microsoft will soon automatically uninstall bad Windows drivers and this new tool could be a game changer for your PC ]]></title>
                                                                                                <dc:content><![CDATA[ <p>This week Microsoft introduced a new tool that allows the company to remotely roll back bad Windows drivers even after they're delivered via Windows Update. The tool, Cloud-Initiated Driver Recovery, makes it so hardware makers and users don't need to manually fix bad drivers once they've been distributed.</p><p>According to a <a href="https://techcommunity.microsoft.com/blog/hardware-dev-center/introducing-cloud-initiated-driver-recovery-for-windows-update/4519075" target="_blank">Microsoft Hardware Dev Center blog post</a>, once a bad driver is identified Microsoft can initiate a recovery action that replaces the the faulty driver without intervention from you or a device maker. The problematic driver will be rolled back to the last known good version. </p><p>Seemingly, it's the latest in a series of moves from Microsoft to fix Windows 11. The company has spent much of 2026 <a href="https://www.tomsguide.com/computing/windows-operating-systems/we-need-to-improve-windows-in-ways-that-are-meaningful-for-people-microsoft-is-urgently-trying-to-fix-windows-11-issues">promising to make Windows better</a> with a <a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-promises-windows-11-reset-new-focus-on-performance-reliability-and-reducing-unnecessary-copilot-ai">Windows 11 reset</a>, <a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-reportedly-redesigning-start-menu-in-windows-11-after-actually-listening-to-user-complaints">redesigning the Start menu</a> and now, better driver patching.</p><h2 id="how-it-works">How it 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="GnxC9DC3NTqVEkaufcRyM6" name="delete key" alt="Trash can key" src="https://cdn.mos.cms.futurecdn.net/GnxC9DC3NTqVEkaufcRyM6.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Getty Images)</span></figcaption></figure><p>The action will only be initiated if a bad driver is rejected during "shiproom evaluation." That process evaluates drivers and notes quality issues.</p><p>Currently, when a bad driver ships in a Windows Update, a hardware partner must submit a replacement driver, or end users have to manually uninstall the faulty driver, which can leave PCs with outdated drivers for too long.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W5rm3O"></div>                            </div>                            <script src="https://kwizly.com/embed/W5rm3O.js" async></script><p>"Today, when a driver published through Windows Update is identified after distribution to have quality issues, the remediation path relies on the hardware partner to submit an updated driver — or on end users to manually uninstall the problematic driver themselves.," Microsoft said.</p><p>Microsoft does note that if a "Driver Shiproom-approved" driver cannot be found a CIDR action will not be attempted. </p><p>However, if one is identified, recovery will be sent via the existing Windows Update infrastructure. You won't need a new client or update from the third-party manufacturer.</p><h2 id="better-drivers-in-general">Better drivers in general</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3423px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="KQbE8W9xF5htWqfEL2b2K5" name="Microsoft HQ" alt="View of Microsoft Romania headquarters in City Gate Towers situated in Free Press Square, in Bucharest, Romania" src="https://cdn.mos.cms.futurecdn.net/KQbE8W9xF5htWqfEL2b2K5.jpg" mos="" align="middle" fullscreen="" width="3423" height="1925" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Getty Images)</span></figcaption></figure><p>According to the blog, the company is testing the tool between May and August this year. Microsoft is shooting to roll back rejected drivers starting in September 2026.</p><p>It appears this could be part of an overall initiative by Microsoft to improve the overall quality of drivers. As pointed out by <a href="https://www.bleepingcomputer.com/news/microsoft/microsoft-to-automatically-roll-back-faulty-windows-drivers/" target="_blank">Bleeping Computer</a>, the company announced a new<a href="https://blogs.windows.com/windowsexperience/2026/05/14/raising-the-bar-together-introducing-the-driver-quality-initiative-at-winhec-2026/" target="_blank"> Driver Quality Initiative</a> last week at the WinHEC 2026 conference in Taipei.</p><p>"When drivers are high quality, customers experience reliable, secure, performant devices. When drivers fail, customers experience it as a device problem, regardless of where the root cause sits," the company said in an announcement.</p><p>Microsoft announced it will invest in partners and tools to improve drivers overall.</p><p>"In the months ahead, we will keep investing in the fundamentals that matter most to customers: reliability, security, performance, compatibility and quality."</p><p>If these tools and initiatives hold up, it could mean the end of frustrating driver experiences on your PC. Instead of hunting down the faulty driver, now Microsoft will do it for you. Fingers crossed this new tool works well.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/online-security/microsofts-urgent-window-11-patch-fixes-30-critical-bugs-update-your-pc-now">Microsoft's urgent Window 11 patch fixes 30 'critical' bugs — update your PC now</a></li><li><a href="https://www.tomsguide.com/computing/windows-operating-systems/dells-own-support-software-is-crashing-its-pcs-and-laptops-the-irony-is-strong-but-there-is-a-quick-fix">Dell's own support software is crashing its PCs and laptops — the irony is strong, but there is a quick fix</a></li><li><a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-reportedly-redesigning-start-menu-in-windows-11-after-actually-listening-to-user-complaints">Microsoft reportedly redesigning Start Menu in Windows 11 after actually listening to user complaints</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/windows-operating-systems/microsoft-will-soon-automatically-uninstall-bad-windows-drivers-and-this-new-tool-could-be-a-game-changer-for-your-pc</link>
                                                                            <description>
                            <![CDATA[ Microsoft has released a new Windows 11 tool that lets it remove faulty drivers after updates. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">evs2CHE6SJxqyPbrAuwgE7</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/nM2QA9SAJTB9Hq3ATzrtdC-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 15 May 2026 23:05:32 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Windows Operating Systems]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Software]]></category>
                                                    <category><![CDATA[Operating Systems]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ.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/nM2QA9SAJTB9Hq3ATzrtdC-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Windows 11 logo on a laptop screen]]></media:description>                                                            <media:text><![CDATA[Windows 11 logo on a laptop screen]]></media:text>
                                <media:title type="plain"><![CDATA[Windows 11 logo on a laptop screen]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/nM2QA9SAJTB9Hq3ATzrtdC-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>This week Microsoft introduced a new tool that allows the company to remotely roll back bad Windows drivers even after they're delivered via Windows Update. The tool, Cloud-Initiated Driver Recovery, makes it so hardware makers and users don't need to manually fix bad drivers once they've been distributed.</p><p>According to a <a href="https://techcommunity.microsoft.com/blog/hardware-dev-center/introducing-cloud-initiated-driver-recovery-for-windows-update/4519075" target="_blank">Microsoft Hardware Dev Center blog post</a>, once a bad driver is identified Microsoft can initiate a recovery action that replaces the the faulty driver without intervention from you or a device maker. The problematic driver will be rolled back to the last known good version. </p><p>Seemingly, it's the latest in a series of moves from Microsoft to fix Windows 11. The company has spent much of 2026 <a href="https://www.tomsguide.com/computing/windows-operating-systems/we-need-to-improve-windows-in-ways-that-are-meaningful-for-people-microsoft-is-urgently-trying-to-fix-windows-11-issues">promising to make Windows better</a> with a <a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-promises-windows-11-reset-new-focus-on-performance-reliability-and-reducing-unnecessary-copilot-ai">Windows 11 reset</a>, <a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-reportedly-redesigning-start-menu-in-windows-11-after-actually-listening-to-user-complaints">redesigning the Start menu</a> and now, better driver patching.</p><h2 id="how-it-works">How it 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="GnxC9DC3NTqVEkaufcRyM6" name="delete key" alt="Trash can key" src="https://cdn.mos.cms.futurecdn.net/GnxC9DC3NTqVEkaufcRyM6.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Getty Images)</span></figcaption></figure><p>The action will only be initiated if a bad driver is rejected during "shiproom evaluation." That process evaluates drivers and notes quality issues.</p><p>Currently, when a bad driver ships in a Windows Update, a hardware partner must submit a replacement driver, or end users have to manually uninstall the faulty driver, which can leave PCs with outdated drivers for too long.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W5rm3O"></div>                            </div>                            <script src="https://kwizly.com/embed/W5rm3O.js" async></script><p>"Today, when a driver published through Windows Update is identified after distribution to have quality issues, the remediation path relies on the hardware partner to submit an updated driver — or on end users to manually uninstall the problematic driver themselves.," Microsoft said.</p><p>Microsoft does note that if a "Driver Shiproom-approved" driver cannot be found a CIDR action will not be attempted. </p><p>However, if one is identified, recovery will be sent via the existing Windows Update infrastructure. You won't need a new client or update from the third-party manufacturer.</p><h2 id="better-drivers-in-general">Better drivers in general</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3423px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="KQbE8W9xF5htWqfEL2b2K5" name="Microsoft HQ" alt="View of Microsoft Romania headquarters in City Gate Towers situated in Free Press Square, in Bucharest, Romania" src="https://cdn.mos.cms.futurecdn.net/KQbE8W9xF5htWqfEL2b2K5.jpg" mos="" align="middle" fullscreen="" width="3423" height="1925" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Getty Images)</span></figcaption></figure><p>According to the blog, the company is testing the tool between May and August this year. Microsoft is shooting to roll back rejected drivers starting in September 2026.</p><p>It appears this could be part of an overall initiative by Microsoft to improve the overall quality of drivers. As pointed out by <a href="https://www.bleepingcomputer.com/news/microsoft/microsoft-to-automatically-roll-back-faulty-windows-drivers/" target="_blank">Bleeping Computer</a>, the company announced a new<a href="https://blogs.windows.com/windowsexperience/2026/05/14/raising-the-bar-together-introducing-the-driver-quality-initiative-at-winhec-2026/" target="_blank"> Driver Quality Initiative</a> last week at the WinHEC 2026 conference in Taipei.</p><p>"When drivers are high quality, customers experience reliable, secure, performant devices. When drivers fail, customers experience it as a device problem, regardless of where the root cause sits," the company said in an announcement.</p><p>Microsoft announced it will invest in partners and tools to improve drivers overall.</p><p>"In the months ahead, we will keep investing in the fundamentals that matter most to customers: reliability, security, performance, compatibility and quality."</p><p>If these tools and initiatives hold up, it could mean the end of frustrating driver experiences on your PC. Instead of hunting down the faulty driver, now Microsoft will do it for you. Fingers crossed this new tool works well.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/online-security/microsofts-urgent-window-11-patch-fixes-30-critical-bugs-update-your-pc-now">Microsoft's urgent Window 11 patch fixes 30 'critical' bugs — update your PC now</a></li><li><a href="https://www.tomsguide.com/computing/windows-operating-systems/dells-own-support-software-is-crashing-its-pcs-and-laptops-the-irony-is-strong-but-there-is-a-quick-fix">Dell's own support software is crashing its PCs and laptops — the irony is strong, but there is a quick fix</a></li><li><a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-reportedly-redesigning-start-menu-in-windows-11-after-actually-listening-to-user-complaints">Microsoft reportedly redesigning Start Menu in Windows 11 after actually listening to user complaints</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Microsoft's urgent Window 11 patch fixes 30 'critical' bugs — update your PC now ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Now is the perfect time to update your laptop or desktop PC as Microsoft has released its <a href="https://msrc.microsoft.com/update-guide/releaseNote/2026-May" target="_blank">May Patch Tuesday</a> updates which contain fixes for 30 flaws rated as important or critical severity. </p><p>In total, the latest security patch applies fixes to 138 bugs including many that made network privileges vulnerable. Fortunately, none of the bugs are listed as publicly known or under active attack. </p><p>The patch was released at the same time as one from Google that addressed 127 security flaws in Chromium, which undergirds the Microsoft Edge browser.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OzLE0e"></div>                            </div>                            <script src="https://kwizly.com/embed/OzLE0e.js" async></script><p>Many of the flaws appear to be related to Azure and more business-focused Microsoft products. However, one of the more severe bugs impacts Windows DNS via a <a href="https://www.tomsguide.com/news/chrome-zero-day-fix-feb21">heap-based buffer overflow flaw</a> that would let a malicious actor execute code over a network.</p><p>"An attacker could exploit this vulnerability by sending a specially crafted DNS response to a vulnerable Windows system, causing the DNS Client to incorrectly process the response and corrupt memory," Microsoft said in its patch notes. "In certain configurations, this could allow the attacker to run code remotely on the affected system without authentication."</p><h2 id="hundreds-of-flaws-fixed-this-year">Hundreds of flaws fixed this year</h2><p>Since January, when the <a href="https://www.tomsguide.com/computing/online-security/microsofts-first-patch-tuesday-of-2026-fixes-over-100-bugs-and-one-active-zero-day-flaw-dont-wait-to-update-your-pc">first patch Tuesday of 2026 </a>fixed 114 flaws, Microsoft has apparently fixed more than 500 CVE bugs already this year. </p><p>According to <a href="https://thehackernews.com/2026/05/microsoft-patches-138-vulnerabilities.html" target="_blank">Hacker News</a>, this can be attributed to a greater focus by Microsoft on vulnerability discovery, some of which is heavily assisted by AI-based flagging. Microsoft claimed as much in a recent <a href="https://www.microsoft.com/en-us/msrc/blog/2026/05/a-note-on-patch-tuesday" target="_blank">Microsoft Security Response Center report</a> released this week.</p><p>"Microsoft engineers and the wider security community alike are <a href="https://www.microsoft.com/en-us/msrc/blog/2026/04/strengthening-secure-software-global-scale-how-msrc-is-evolving-with-ai">increasingly using AI</a> to examine software more carefully and more often than was practical even a few years ago," Tom Gallagher said in the report.</p><h2 id="how-to-stay-safe-with-patch-tuesday">How to stay safe with Patch Tuesday</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5342px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="MC3iNmQLKLcYS2fWGgAouZ" name="shutterstock_631810814" alt="A man clicking on a mouse while browsing the web on his laptop" src="https://cdn.mos.cms.futurecdn.net/MC3iNmQLKLcYS2fWGgAouZ.jpg" mos="" align="middle" fullscreen="" width="5342" height="3005" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>First and foremost, update your Windows laptop or desktop with the latest system update or patches. You also want to make sure that <a href="https://www.tomsguide.com/news/windows-defender-good-enough-for-new-laptop">Windows Defender</a> is enabled so that it can scan your system for <a href="https://www.tomsguide.com/computing/malware-adware/dont-click-this-malicious-ads-impersonating-google-chrome-spreading-dangerous-malware">dangerous malware</a>.</p><p>Of course, we always recommend using one of the <a href="https://www.tomsguide.com/computing/antivirus/best-antivirus-software">best antivirus software</a> packages for extra protection. </p><p>In the MSRC report, Gallagher recommends practicing good cyber hygiene, which we wholeheartedly agree with. This includes enabling <a href="https://www.tomsguide.com/computing/online-security/two-factor-authentication-provides-an-easy-way-to-secure-your-accounts-heres-how-it-works-and-how-to-enable-it">multi-factor authentication</a>, creating <a href="https://www.tomsguide.com/computing/password-managers/people-are-the-password-problem-how-youre-creating-your-biggest-security-risks">strong passwords</a>, and using one of the <a href="https://www.tomsguide.com/us/best-password-managers,review-3785.html">best password managers</a></p><p>As always, and in general, don't click links or attachments from <a href="https://www.tomsguide.com/news/avoid-these-email-attachments-if-you-dont-want-to-get-phished">unknown </a><a href="https://www.tomsguide.com/news/avoid-these-email-attachments-if-you-dont-want-to-get-phished" target="_blank">senders</a>, as they could contain malware or send you to <a href="https://www.tomsguide.com/news/hackers-often-use-this-clever-trick-to-take-you-to-phishing-sites-can-you-spot-it">phishing sites</a> designed to steal your personal information. </p><p>By practicing good cyber hygiene and regularly updating your computer, you should be safe from most attacks. </p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/online-security/is-your-personal-information-public-the-simple-step-to-securing-your-privacy-online">Is your personal information public? The simple step to securing your privacy online</a></li><li><a href="https://www.tomsguide.com/computing/online-security/android-alert-7-million-users-downloaded-stalking-apps-that-were-actually-scams">Android alert: 7 million users downloaded ‘stalking’ apps that were actually scams</a></li><li><a href="https://www.tomsguide.com/computing/online-security/what-is-agego-and-is-it-safe-to-use">What is AgeGO, and is it safe to use?</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/online-security/microsofts-urgent-window-11-patch-fixes-30-critical-bugs-update-your-pc-now</link>
                                                                            <description>
                            <![CDATA[ Microsoft's big May 2026 Patch Tuesday fixes more than 138 vulnerabilities overall. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">9PYXF7f4Aa9u8mYLuifMdT</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/hDNix4fYdmJGsVB26D4tkN-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 13 May 2026 20:24:26 +0000</pubDate>                                                                                                                                <updated>Wed, 13 May 2026 20:54:28 +0000</updated>
                                                                                                                                            <category><![CDATA[Online Security]]></category>
                                                    <category><![CDATA[Windows Operating Systems]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Internet]]></category>
                                                    <category><![CDATA[Software]]></category>
                                                    <category><![CDATA[Operating Systems]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ.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/hDNix4fYdmJGsVB26D4tkN-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A laptop with the Windows 11 logo]]></media:description>                                                            <media:text><![CDATA[A laptop with the Windows 11 logo]]></media:text>
                                <media:title type="plain"><![CDATA[A laptop with the Windows 11 logo]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/hDNix4fYdmJGsVB26D4tkN-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Now is the perfect time to update your laptop or desktop PC as Microsoft has released its <a href="https://msrc.microsoft.com/update-guide/releaseNote/2026-May" target="_blank">May Patch Tuesday</a> updates which contain fixes for 30 flaws rated as important or critical severity. </p><p>In total, the latest security patch applies fixes to 138 bugs including many that made network privileges vulnerable. Fortunately, none of the bugs are listed as publicly known or under active attack. </p><p>The patch was released at the same time as one from Google that addressed 127 security flaws in Chromium, which undergirds the Microsoft Edge browser.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OzLE0e"></div>                            </div>                            <script src="https://kwizly.com/embed/OzLE0e.js" async></script><p>Many of the flaws appear to be related to Azure and more business-focused Microsoft products. However, one of the more severe bugs impacts Windows DNS via a <a href="https://www.tomsguide.com/news/chrome-zero-day-fix-feb21">heap-based buffer overflow flaw</a> that would let a malicious actor execute code over a network.</p><p>"An attacker could exploit this vulnerability by sending a specially crafted DNS response to a vulnerable Windows system, causing the DNS Client to incorrectly process the response and corrupt memory," Microsoft said in its patch notes. "In certain configurations, this could allow the attacker to run code remotely on the affected system without authentication."</p><h2 id="hundreds-of-flaws-fixed-this-year">Hundreds of flaws fixed this year</h2><p>Since January, when the <a href="https://www.tomsguide.com/computing/online-security/microsofts-first-patch-tuesday-of-2026-fixes-over-100-bugs-and-one-active-zero-day-flaw-dont-wait-to-update-your-pc">first patch Tuesday of 2026 </a>fixed 114 flaws, Microsoft has apparently fixed more than 500 CVE bugs already this year. </p><p>According to <a href="https://thehackernews.com/2026/05/microsoft-patches-138-vulnerabilities.html" target="_blank">Hacker News</a>, this can be attributed to a greater focus by Microsoft on vulnerability discovery, some of which is heavily assisted by AI-based flagging. Microsoft claimed as much in a recent <a href="https://www.microsoft.com/en-us/msrc/blog/2026/05/a-note-on-patch-tuesday" target="_blank">Microsoft Security Response Center report</a> released this week.</p><p>"Microsoft engineers and the wider security community alike are <a href="https://www.microsoft.com/en-us/msrc/blog/2026/04/strengthening-secure-software-global-scale-how-msrc-is-evolving-with-ai">increasingly using AI</a> to examine software more carefully and more often than was practical even a few years ago," Tom Gallagher said in the report.</p><h2 id="how-to-stay-safe-with-patch-tuesday">How to stay safe with Patch Tuesday</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5342px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="MC3iNmQLKLcYS2fWGgAouZ" name="shutterstock_631810814" alt="A man clicking on a mouse while browsing the web on his laptop" src="https://cdn.mos.cms.futurecdn.net/MC3iNmQLKLcYS2fWGgAouZ.jpg" mos="" align="middle" fullscreen="" width="5342" height="3005" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>First and foremost, update your Windows laptop or desktop with the latest system update or patches. You also want to make sure that <a href="https://www.tomsguide.com/news/windows-defender-good-enough-for-new-laptop">Windows Defender</a> is enabled so that it can scan your system for <a href="https://www.tomsguide.com/computing/malware-adware/dont-click-this-malicious-ads-impersonating-google-chrome-spreading-dangerous-malware">dangerous malware</a>.</p><p>Of course, we always recommend using one of the <a href="https://www.tomsguide.com/computing/antivirus/best-antivirus-software">best antivirus software</a> packages for extra protection. </p><p>In the MSRC report, Gallagher recommends practicing good cyber hygiene, which we wholeheartedly agree with. This includes enabling <a href="https://www.tomsguide.com/computing/online-security/two-factor-authentication-provides-an-easy-way-to-secure-your-accounts-heres-how-it-works-and-how-to-enable-it">multi-factor authentication</a>, creating <a href="https://www.tomsguide.com/computing/password-managers/people-are-the-password-problem-how-youre-creating-your-biggest-security-risks">strong passwords</a>, and using one of the <a href="https://www.tomsguide.com/us/best-password-managers,review-3785.html">best password managers</a></p><p>As always, and in general, don't click links or attachments from <a href="https://www.tomsguide.com/news/avoid-these-email-attachments-if-you-dont-want-to-get-phished">unknown </a><a href="https://www.tomsguide.com/news/avoid-these-email-attachments-if-you-dont-want-to-get-phished" target="_blank">senders</a>, as they could contain malware or send you to <a href="https://www.tomsguide.com/news/hackers-often-use-this-clever-trick-to-take-you-to-phishing-sites-can-you-spot-it">phishing sites</a> designed to steal your personal information. </p><p>By practicing good cyber hygiene and regularly updating your computer, you should be safe from most attacks. </p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/online-security/is-your-personal-information-public-the-simple-step-to-securing-your-privacy-online">Is your personal information public? The simple step to securing your privacy online</a></li><li><a href="https://www.tomsguide.com/computing/online-security/android-alert-7-million-users-downloaded-stalking-apps-that-were-actually-scams">Android alert: 7 million users downloaded ‘stalking’ apps that were actually scams</a></li><li><a href="https://www.tomsguide.com/computing/online-security/what-is-agego-and-is-it-safe-to-use">What is AgeGO, and is it safe to use?</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Dell's own support software is crashing its PCs and laptops — the irony is strong, but there is a quick fix ]]></title>
                                                                                                <dc:content><![CDATA[ <p>If you’re a Windows 11 user, you’re already familiar with the Blue Screen of Death (BSOD) — popping up when a critical error forces the operating system to stop. Normally, the blame falls on Microsoft (although its team is working hard on improving Windows soon). But if you’ve been seeing this happen on your Dell PC, it turns out the culprit is so much more ironic.</p><p>As spotted by <a href="https://www.neowin.net/news/dell-pcs-are-running-into-constant-bsod-reboot-loops-and-windows-11-isnt-the-culprit/" target="_blank">Neowin</a>, Dell’s own SupportAssist software (the company calls it “your personalized PC support experience”) is causing some Dell PCs to hit a BSOD every 30 minutes after a recent update. So far, we’re seeing confirmation that the following laptops are affected:</p><ul><li><a href="https://www.tomsguide.com/reviews/alienware-m16-r2">Alienware M16 R2</a></li><li>Dell Pro 16 Plus</li><li>Dell Pro 14 Plus</li><li>Dell XPS 16</li><li>Dell XPS 15</li><li><a href="https://www.tomsguide.com/computing/laptops/dell-xps-14-2026-review">Dell XPS 14</a></li><li>Dell XPS 13</li></ul><p>This is based on what Dell forum members are saying, but given it’s widespread, I wouldn’t be surprised if it’s a far wider problem than this. If you’re one of these folks who just installed the Dell software update and are seeing this issue, there is a simple fix.</p><h2 id="just-uninstall-supportassist">Just uninstall SupportAssist</h2><p>The situation was revealed after <a href="https://www.dell.com/community/en/conversations/supportassist-for-pcs/bsod-random-reboots-may-2026-dell-updates-dell-support-assist-probable-cause/6a017bde657052398888e805" target="_blank">keen-eyed users</a> took a look into the system log to see what was going on. It was identified after some people reported their laptops “kept randomly rebooting” roughly every 30 minutes. This suggests that the SupportAssist is trying to check system health on a regular half-hour schedule, where it hits a corrupted piece of code and crashes 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:901px;"><p class="vanilla-image-block" style="padding-top:96.56%;"><img id="z2DtRHZQEkvQ69BKk9FUsh" name="Dell System event checker" alt="Dell System event checker" src="https://cdn.mos.cms.futurecdn.net/z2DtRHZQEkvQ69BKk9FUsh.png" mos="" align="middle" fullscreen="" width="901" height="870" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dell)</span></figcaption></figure><p>As you can see, there’s a lot of critical errors at the Kernel-Power level — basically the system level — and after a check, the critical process that dies has consistently been the “Dell SupportAssist Remediation” service. Giving a “CRITICAL_PROCESS_DIED (0xEF)” code, it’s taking down the entire operating system with it.</p><p>And it’s not the first time this has happened, with a similar SupportAssist problem happening at the end of 2024. Luckily, just like the last time, the issue is simple. <strong>Go to Settings > Apps > Installed Apps, find Dell SupportAssist, select More > Uninstall.</strong></p><p>Users who have already done this are reporting that it fixes the issue and they’re not seeing any more random BSOD crashes.</p><h2 id="can-we-cool-it-with-the-bloatware">Can we cool it with the bloatware?</h2><p><a href="https://www.tomsguide.com/computing/macbooks/windows-fans-say-macbook-neos-8gb-ram-is-ridiculous-so-i-tested-it-and-the-results-are-shocking">Windows 11 already has a RAM problem</a>. It’s inherent to how the OS prioritizes preloading parts of apps into system memory before you click them, but what that means is all these little additions actually harm the experience rather than enrich it.</p><p>Things like Dell SupportAssist take up another chunk of that precious RAM that could be better used elsewhere on apps people actually use. And while the <a href="https://www.windowscentral.com/microsoft/windows-11/what-is-windows-k2-everything-you-need-to-know-saving-windows-11" target="_blank">Windows K2</a> project may be aiming squarely at tackling some of these challenges at an OS-level, I can only imagine that the additional bloatware won’t help the situation. </p><p>So I beg of you, Dell and others, please just let us have a clean install, so we don’t have to uninstall all the unnecessary heft!</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/macbooks/i-can-finally-turn-my-macbook-pro-into-a-gaming-laptop-sort-of-gamehub-just-fixed-my-macs-biggest-weakness-in-minutes">I can finally turn my MacBook Pro into a gaming laptop (sort of) — GameHub just fixed my Mac’s biggest weakness in minutes</a></li><li><a href="https://www.tomsguide.com/computing/laptops/asus-zenbook-a14-a16-2026-review">I loved Asus’s Zenbook A14 and A16 — but a $200 price hike changes everything</a></li><li><a href="https://www.tomsguide.com/computing/macos/ai-is-changing-how-we-transcribe-and-this-might-be-the-best-example-of-it-on-mac-yet">AI is changing how we transcribe, and this might be the best example of it on Mac yet</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/windows-operating-systems/dells-own-support-software-is-crashing-its-pcs-and-laptops-the-irony-is-strong-but-there-is-a-quick-fix</link>
                                                                            <description>
                            <![CDATA[ Dell’s SupportAssist software is causing constant BSOD crashes on XPS and Alienware laptops. After a buggy May 2026 update, users are seeing reboots every 30 minutes. Here is the simple fix to stop the crashes and reclaim your RAM. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">t8AJfgCayhiT8gQS8mbucQ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/nhsTmywy9QLjWLsPZk7zAe-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 12 May 2026 10:47:15 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Windows Operating Systems]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Software]]></category>
                                                    <category><![CDATA[Operating Systems]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6.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/nhsTmywy9QLjWLsPZk7zAe-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Dell XPS 14 (2026)]]></media:description>                                                            <media:text><![CDATA[Dell XPS 14 (2026)]]></media:text>
                                <media:title type="plain"><![CDATA[Dell XPS 14 (2026)]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/nhsTmywy9QLjWLsPZk7zAe-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you’re a Windows 11 user, you’re already familiar with the Blue Screen of Death (BSOD) — popping up when a critical error forces the operating system to stop. Normally, the blame falls on Microsoft (although its team is working hard on improving Windows soon). But if you’ve been seeing this happen on your Dell PC, it turns out the culprit is so much more ironic.</p><p>As spotted by <a href="https://www.neowin.net/news/dell-pcs-are-running-into-constant-bsod-reboot-loops-and-windows-11-isnt-the-culprit/" target="_blank">Neowin</a>, Dell’s own SupportAssist software (the company calls it “your personalized PC support experience”) is causing some Dell PCs to hit a BSOD every 30 minutes after a recent update. So far, we’re seeing confirmation that the following laptops are affected:</p><ul><li><a href="https://www.tomsguide.com/reviews/alienware-m16-r2">Alienware M16 R2</a></li><li>Dell Pro 16 Plus</li><li>Dell Pro 14 Plus</li><li>Dell XPS 16</li><li>Dell XPS 15</li><li><a href="https://www.tomsguide.com/computing/laptops/dell-xps-14-2026-review">Dell XPS 14</a></li><li>Dell XPS 13</li></ul><p>This is based on what Dell forum members are saying, but given it’s widespread, I wouldn’t be surprised if it’s a far wider problem than this. If you’re one of these folks who just installed the Dell software update and are seeing this issue, there is a simple fix.</p><h2 id="just-uninstall-supportassist">Just uninstall SupportAssist</h2><p>The situation was revealed after <a href="https://www.dell.com/community/en/conversations/supportassist-for-pcs/bsod-random-reboots-may-2026-dell-updates-dell-support-assist-probable-cause/6a017bde657052398888e805" target="_blank">keen-eyed users</a> took a look into the system log to see what was going on. It was identified after some people reported their laptops “kept randomly rebooting” roughly every 30 minutes. This suggests that the SupportAssist is trying to check system health on a regular half-hour schedule, where it hits a corrupted piece of code and crashes 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:901px;"><p class="vanilla-image-block" style="padding-top:96.56%;"><img id="z2DtRHZQEkvQ69BKk9FUsh" name="Dell System event checker" alt="Dell System event checker" src="https://cdn.mos.cms.futurecdn.net/z2DtRHZQEkvQ69BKk9FUsh.png" mos="" align="middle" fullscreen="" width="901" height="870" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dell)</span></figcaption></figure><p>As you can see, there’s a lot of critical errors at the Kernel-Power level — basically the system level — and after a check, the critical process that dies has consistently been the “Dell SupportAssist Remediation” service. Giving a “CRITICAL_PROCESS_DIED (0xEF)” code, it’s taking down the entire operating system with it.</p><p>And it’s not the first time this has happened, with a similar SupportAssist problem happening at the end of 2024. Luckily, just like the last time, the issue is simple. <strong>Go to Settings > Apps > Installed Apps, find Dell SupportAssist, select More > Uninstall.</strong></p><p>Users who have already done this are reporting that it fixes the issue and they’re not seeing any more random BSOD crashes.</p><h2 id="can-we-cool-it-with-the-bloatware">Can we cool it with the bloatware?</h2><p><a href="https://www.tomsguide.com/computing/macbooks/windows-fans-say-macbook-neos-8gb-ram-is-ridiculous-so-i-tested-it-and-the-results-are-shocking">Windows 11 already has a RAM problem</a>. It’s inherent to how the OS prioritizes preloading parts of apps into system memory before you click them, but what that means is all these little additions actually harm the experience rather than enrich it.</p><p>Things like Dell SupportAssist take up another chunk of that precious RAM that could be better used elsewhere on apps people actually use. And while the <a href="https://www.windowscentral.com/microsoft/windows-11/what-is-windows-k2-everything-you-need-to-know-saving-windows-11" target="_blank">Windows K2</a> project may be aiming squarely at tackling some of these challenges at an OS-level, I can only imagine that the additional bloatware won’t help the situation. </p><p>So I beg of you, Dell and others, please just let us have a clean install, so we don’t have to uninstall all the unnecessary heft!</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/macbooks/i-can-finally-turn-my-macbook-pro-into-a-gaming-laptop-sort-of-gamehub-just-fixed-my-macs-biggest-weakness-in-minutes">I can finally turn my MacBook Pro into a gaming laptop (sort of) — GameHub just fixed my Mac’s biggest weakness in minutes</a></li><li><a href="https://www.tomsguide.com/computing/laptops/asus-zenbook-a14-a16-2026-review">I loved Asus’s Zenbook A14 and A16 — but a $200 price hike changes everything</a></li><li><a href="https://www.tomsguide.com/computing/macos/ai-is-changing-how-we-transcribe-and-this-might-be-the-best-example-of-it-on-mac-yet">AI is changing how we transcribe, and this might be the best example of it on Mac yet</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Microsoft takes on MacBook Neo with new 'value advantage report,' claims Windows laptops offer double the RAM for less money and up to 56% longer battery life ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Since the MacBook Neo launched in early March it's proven to be so popular that Apple quickly ran out of stock and is <a href="https://www.tomsguide.com/computing/macbooks/apple-just-doubled-macbook-neo-production-but-its-budget-laptop-could-still-face-a-price-hike-heres-why">doubling production orders</a>. The budget-friendly laptop<a href="https://www.tomsguide.com/computing/macbook-neo-has-shocked-pc-makers-who-aim-to-fight-back-but-saying-the-neo-is-just-a-tablet-is-missing-the-point"> 'shocked' PC makers</a> and it's clear Windows has <a href="https://www.tomsguide.com/computing/macbooks/why-does-the-neo-exist-in-the-first-place-framework-ceo-tears-down-the-macbook-neo-and-brilliantly-pinpoints-why-apple-made-a-usd599-laptop">some real competition</a> in the space.</p><p>Thus, it's probably not too surprising to see Microsoft commission a <a href="https://signal65.com/research/windows-11-pcs-compared-to-macbook-neo/" target="_blank">report from Signal65</a> comparing some wallet-friendly Windows 11 laptops against the MacBook Neo. </p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/ISmvUpSEG-w" allowfullscreen></iframe></div></div><p>As you might expect, the study comes out largely in favor of Windows laptops. </p><p>Signal65's report particularly highlights the Lenovo IdeaPad Slim 3x, HP OmniBook 5, Lenovo Yoga 7i, and HP OmniBook X Flip as veritable contenders to the Neo. All of these come in multiple configurations, including different screen sizes and processors, which greatly affect price and capabilities.</p><p>But here's the problem: there's a lot of cherry-picking in the comparisons that undermines the point of the research.</p><h2 id="missing-the-point-of-the-neo">Missing the point of the Neo</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9WewLFGGuEX6mfwAKBrohk" name="MacBook Neo" alt="MacBook Neo open on a desk" src="https://cdn.mos.cms.futurecdn.net/9WewLFGGuEX6mfwAKBrohk.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The <a href="https://www.tomsguide.com/computing/macbooks/apple-macbook-neo-review">MacBook Neo</a> is clearly designed for people looking for a budget-friendly laptop to get them through school, work or day-to-day tasks. It's meant to be a lightweight, portable option. </p><p>And straight away, that means we have to immediately ignore half of Signal65's list. Both the Lenovo Yoga 7i and HP OmniBook X Flip cost $1,099 and $949, respectively. There is no comparison in terms of affordability when the laptops you're suggesting are nearly double the cost.</p><p>Meanwhile, portability seems to have been ignored in favor of battery life (more on that below) and storage. The MacBook Neo features a 13-inch Liquid Retina display and only weighs 2.7 pounds. It measures 11.71" x .50" x 8.12". Meanwhile, every laptop that Signal65 highlights features a 15.3- or 16-inch display, meaning they are all larger than the Neo.  </p><p>As an example, the Lenovo IdeaPad Slim 3x, the cheapest and "smallest" laptop highlighted, weighs a whopping 3.52 lbs compared to the Neo. It's also measurably larger at 13.51" x 9.42" x .67-.70" — but the Signal65 report fails to showcase any dimensions or weights.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-egPbjW"></div>                            </div>                            <script src="https://kwizly.com/embed/egPbjW.js" async></script><h2 id="comparing-battery-life">Comparing battery life</h2><p>Notably, Signal65 has a series of tests that the show the Windows PCs beating the MacBook Neo when it comes to battery life from 12% to 56% improve power efficiency. </p><p>Here's where highlighting larger laptops lets the study fall in favor of Windows. A larger chassis means you can stuff a bigger battery in there. </p><p>In Tom's Guide testing, the MacBook Neo lasted a fairly robust 13 hours and 28 minutes, solidly in the top end of our<a href="https://www.tomsguide.com/computing/macbooks/macbook-neo-battery-life-tested-we-cant-believe-the-results"> comparison to other budget laptops</a> we've tested.</p><p>We haven't reviewed every laptop Signal65 highlights or even those configurations. We have looked at smaller versions, so lets compare those to see what a smaller battery can do against the Neo.</p><p>Specifically we're looking at the <a href="https://www.tomsguide.com/computing/laptops/lenovo-ideapad-slim-3x-review#section-lenovo-ideapad-slim-3x-review-specs">Lenovo IdeaPad Slim 3x </a>(15.3"), <a href="https://www.tomsguide.com/computing/laptops/hp-omnibook-x-flip-14-review">HP OmniBook X Flip 14</a> (Intel Core Ultra 5), and the <a href="https://www.tomsguide.com/computing/laptops/hp-omnibook-5-series-laptops-promise-unbelievable-battery-life-at-a-usd799-starting-price">HP OmniBook 5</a> 14.</p><div ><table><caption>MacBook Neo battery life compared</caption><thead><tr><th class="firstcol " ><p>Laptop</p></th><th  ><p>Battery Life tested</p></th></tr></thead><tbody><tr><td class="firstcol " ><p>MacBook Neo</p></td><td  ><p>13 hours and 28 minutes</p></td></tr><tr><td class="firstcol " ><p>Lenovo IdeaPad Slim 3x (15.3" display)</p></td><td  ><p>16 hours and 29 minutes</p></td></tr><tr><td class="firstcol " ><p>HP OmniBook X Flip 14 (Intel Ultra 5)</p></td><td  ><p>8 hours and 32 minutes</p></td></tr><tr><td class="firstcol " ><p>HP OmniBook 5 14</p></td><td  ><p>16 hours and 2 minutes</p></td></tr></tbody></table></div><h2 id="alternatives">Alternatives</h2><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="ofdWhQbVt45Mpn4q5vMCWG" name="Asus Zenbook A14" alt="Asus Zenbook A14 on a table with the display on at CES 2025" src="https://cdn.mos.cms.futurecdn.net/ofdWhQbVt45Mpn4q5vMCWG.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>Look, not everyone wants to join the Apple ecosystem. I personally swore off Apple laptops after three different hard drive failures in a two year period.</p><p>Fortunately, there are Windows options if you want. Some of them still feature premium design and a lower price. A few have higher storage.</p><p>If you need recommendations check out these <a href="https://www.tomsguide.com/computing/laptops/i-went-looking-for-macbook-neo-rivals-these-3-laptops-should-make-apple-nervous">three MacBook Neo rivals</a>. If you need more data, we've <a href="https://www.tomsguide.com/computing/laptops/is-the-macbook-neo-as-good-as-a-budget-windows-laptop-here-are-our-lab-tested-results">benchmarked a number of budget laptops</a> and <a href="https://www.tomsguide.com/computing/macbooks/macbook-neo-battery-life-tested-we-cant-believe-the-results">compared them to the Neo</a>. Don't forget about the <a href="https://www.tomsguide.com/computing/laptops/macbook-neo-vs-chromebooks-which-budget-laptop-is-right-for-you">Neo versus Chromebooks</a>, the original super-cheap laptop.</p><p>And of course, if you like Apple there's the MacBook Air, which you can get in <a href="https://www.tomsguide.com/computing/macbooks/macbook-air-m5-review">the M5 version</a> or seek out the less expensive <a href="https://www.tomsguide.com/news/cheap-macbook-deals-and-sales#section-refurb-macbook-deals">refurbished MacBook Air M4</a>.</p><p>Finally, we want to hear from you — would you pick up the MacBook Neo as your next budget laptop? Or does Windows offer you something better? Let us know in the comments box below. </p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/microsoft-is-hiding-windows-11s-eyes-heres-how-to-find-copilot-vision-and-fully-delete-it">Microsoft is hiding Windows 11's 'eyes' — here's how to find Copilot Vision (and fully delete it)</a></li><li><a href="https://www.tomsguide.com/computing/macbooks/apple-just-doubled-macbook-neo-production-but-its-budget-laptop-could-still-face-a-price-hike-heres-why">Apple just 'doubled' MacBook Neo production but its budget laptop could still face a price hike — here's why</a></li><li><a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-reportedly-redesigning-start-menu-in-windows-11-after-actually-listening-to-user-complaints">Microsoft reportedly redesigning Start Menu in Windows 11 after actually listening to user complaints</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/laptops/microsoft-takes-on-macbook-neo-with-new-value-advantage-report-claims-windows-laptops-offer-double-the-ram-for-less-money-and-up-to-56-percent-longer-battery-life</link>
                                                                            <description>
                            <![CDATA[ A Microsoft report appears to reveal Windows 11 laptops that best the MacBook Neo for similar price points. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">aqpPJEPC2EL4FGrPEPgL24</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/7GjyM2nTGnPYChgkLVJTgE-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 08 May 2026 09:25:21 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Laptops]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/7GjyM2nTGnPYChgkLVJTgE-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[MacBook Neo vs. HP Omnibook 5 Flip]]></media:description>                                                            <media:text><![CDATA[MacBook Neo vs. HP Omnibook 5 Flip]]></media:text>
                                <media:title type="plain"><![CDATA[MacBook Neo vs. HP Omnibook 5 Flip]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/7GjyM2nTGnPYChgkLVJTgE-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Since the MacBook Neo launched in early March it's proven to be so popular that Apple quickly ran out of stock and is <a href="https://www.tomsguide.com/computing/macbooks/apple-just-doubled-macbook-neo-production-but-its-budget-laptop-could-still-face-a-price-hike-heres-why">doubling production orders</a>. The budget-friendly laptop<a href="https://www.tomsguide.com/computing/macbook-neo-has-shocked-pc-makers-who-aim-to-fight-back-but-saying-the-neo-is-just-a-tablet-is-missing-the-point"> 'shocked' PC makers</a> and it's clear Windows has <a href="https://www.tomsguide.com/computing/macbooks/why-does-the-neo-exist-in-the-first-place-framework-ceo-tears-down-the-macbook-neo-and-brilliantly-pinpoints-why-apple-made-a-usd599-laptop">some real competition</a> in the space.</p><p>Thus, it's probably not too surprising to see Microsoft commission a <a href="https://signal65.com/research/windows-11-pcs-compared-to-macbook-neo/" target="_blank">report from Signal65</a> comparing some wallet-friendly Windows 11 laptops against the MacBook Neo. </p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/ISmvUpSEG-w" allowfullscreen></iframe></div></div><p>As you might expect, the study comes out largely in favor of Windows laptops. </p><p>Signal65's report particularly highlights the Lenovo IdeaPad Slim 3x, HP OmniBook 5, Lenovo Yoga 7i, and HP OmniBook X Flip as veritable contenders to the Neo. All of these come in multiple configurations, including different screen sizes and processors, which greatly affect price and capabilities.</p><p>But here's the problem: there's a lot of cherry-picking in the comparisons that undermines the point of the research.</p><h2 id="missing-the-point-of-the-neo">Missing the point of the Neo</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9WewLFGGuEX6mfwAKBrohk" name="MacBook Neo" alt="MacBook Neo open on a desk" src="https://cdn.mos.cms.futurecdn.net/9WewLFGGuEX6mfwAKBrohk.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The <a href="https://www.tomsguide.com/computing/macbooks/apple-macbook-neo-review">MacBook Neo</a> is clearly designed for people looking for a budget-friendly laptop to get them through school, work or day-to-day tasks. It's meant to be a lightweight, portable option. </p><p>And straight away, that means we have to immediately ignore half of Signal65's list. Both the Lenovo Yoga 7i and HP OmniBook X Flip cost $1,099 and $949, respectively. There is no comparison in terms of affordability when the laptops you're suggesting are nearly double the cost.</p><p>Meanwhile, portability seems to have been ignored in favor of battery life (more on that below) and storage. The MacBook Neo features a 13-inch Liquid Retina display and only weighs 2.7 pounds. It measures 11.71" x .50" x 8.12". Meanwhile, every laptop that Signal65 highlights features a 15.3- or 16-inch display, meaning they are all larger than the Neo.  </p><p>As an example, the Lenovo IdeaPad Slim 3x, the cheapest and "smallest" laptop highlighted, weighs a whopping 3.52 lbs compared to the Neo. It's also measurably larger at 13.51" x 9.42" x .67-.70" — but the Signal65 report fails to showcase any dimensions or weights.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-egPbjW"></div>                            </div>                            <script src="https://kwizly.com/embed/egPbjW.js" async></script><h2 id="comparing-battery-life">Comparing battery life</h2><p>Notably, Signal65 has a series of tests that the show the Windows PCs beating the MacBook Neo when it comes to battery life from 12% to 56% improve power efficiency. </p><p>Here's where highlighting larger laptops lets the study fall in favor of Windows. A larger chassis means you can stuff a bigger battery in there. </p><p>In Tom's Guide testing, the MacBook Neo lasted a fairly robust 13 hours and 28 minutes, solidly in the top end of our<a href="https://www.tomsguide.com/computing/macbooks/macbook-neo-battery-life-tested-we-cant-believe-the-results"> comparison to other budget laptops</a> we've tested.</p><p>We haven't reviewed every laptop Signal65 highlights or even those configurations. We have looked at smaller versions, so lets compare those to see what a smaller battery can do against the Neo.</p><p>Specifically we're looking at the <a href="https://www.tomsguide.com/computing/laptops/lenovo-ideapad-slim-3x-review#section-lenovo-ideapad-slim-3x-review-specs">Lenovo IdeaPad Slim 3x </a>(15.3"), <a href="https://www.tomsguide.com/computing/laptops/hp-omnibook-x-flip-14-review">HP OmniBook X Flip 14</a> (Intel Core Ultra 5), and the <a href="https://www.tomsguide.com/computing/laptops/hp-omnibook-5-series-laptops-promise-unbelievable-battery-life-at-a-usd799-starting-price">HP OmniBook 5</a> 14.</p><div ><table><caption>MacBook Neo battery life compared</caption><thead><tr><th class="firstcol " ><p>Laptop</p></th><th  ><p>Battery Life tested</p></th></tr></thead><tbody><tr><td class="firstcol " ><p>MacBook Neo</p></td><td  ><p>13 hours and 28 minutes</p></td></tr><tr><td class="firstcol " ><p>Lenovo IdeaPad Slim 3x (15.3" display)</p></td><td  ><p>16 hours and 29 minutes</p></td></tr><tr><td class="firstcol " ><p>HP OmniBook X Flip 14 (Intel Ultra 5)</p></td><td  ><p>8 hours and 32 minutes</p></td></tr><tr><td class="firstcol " ><p>HP OmniBook 5 14</p></td><td  ><p>16 hours and 2 minutes</p></td></tr></tbody></table></div><h2 id="alternatives">Alternatives</h2><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="ofdWhQbVt45Mpn4q5vMCWG" name="Asus Zenbook A14" alt="Asus Zenbook A14 on a table with the display on at CES 2025" src="https://cdn.mos.cms.futurecdn.net/ofdWhQbVt45Mpn4q5vMCWG.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>Look, not everyone wants to join the Apple ecosystem. I personally swore off Apple laptops after three different hard drive failures in a two year period.</p><p>Fortunately, there are Windows options if you want. Some of them still feature premium design and a lower price. A few have higher storage.</p><p>If you need recommendations check out these <a href="https://www.tomsguide.com/computing/laptops/i-went-looking-for-macbook-neo-rivals-these-3-laptops-should-make-apple-nervous">three MacBook Neo rivals</a>. If you need more data, we've <a href="https://www.tomsguide.com/computing/laptops/is-the-macbook-neo-as-good-as-a-budget-windows-laptop-here-are-our-lab-tested-results">benchmarked a number of budget laptops</a> and <a href="https://www.tomsguide.com/computing/macbooks/macbook-neo-battery-life-tested-we-cant-believe-the-results">compared them to the Neo</a>. Don't forget about the <a href="https://www.tomsguide.com/computing/laptops/macbook-neo-vs-chromebooks-which-budget-laptop-is-right-for-you">Neo versus Chromebooks</a>, the original super-cheap laptop.</p><p>And of course, if you like Apple there's the MacBook Air, which you can get in <a href="https://www.tomsguide.com/computing/macbooks/macbook-air-m5-review">the M5 version</a> or seek out the less expensive <a href="https://www.tomsguide.com/news/cheap-macbook-deals-and-sales#section-refurb-macbook-deals">refurbished MacBook Air M4</a>.</p><p>Finally, we want to hear from you — would you pick up the MacBook Neo as your next budget laptop? Or does Windows offer you something better? Let us know in the comments box below. </p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/microsoft-is-hiding-windows-11s-eyes-heres-how-to-find-copilot-vision-and-fully-delete-it">Microsoft is hiding Windows 11's 'eyes' — here's how to find Copilot Vision (and fully delete it)</a></li><li><a href="https://www.tomsguide.com/computing/macbooks/apple-just-doubled-macbook-neo-production-but-its-budget-laptop-could-still-face-a-price-hike-heres-why">Apple just 'doubled' MacBook Neo production but its budget laptop could still face a price hike — here's why</a></li><li><a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-reportedly-redesigning-start-menu-in-windows-11-after-actually-listening-to-user-complaints">Microsoft reportedly redesigning Start Menu in Windows 11 after actually listening to user complaints</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Xbox CEO just scrapped Copilot AI for consoles — and I couldn't be happier ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The shake-up at Microsoft caught a lot of people off guard. When Phil Spencer and Sarah Bond both stepped away from their roles, it marked a major turning point for Xbox.</p><p>What came next was even more unexpected: Asha Sharma, formerly leading Microsoft’s CoreAI product, stepped in as the new EVP and CEO of<a href="https://www.tomsguide.com/gaming/i-just-tested-the-all-digital-xbox-series-x-and-it-fixes-my-main-gripe-with-the-original"> Xbox</a>.</p><p>Since taking over, Sharma has moved quickly to reshape the Xbox ecosystem, and early signs are giving gamers a reason to feel optimistic again. Her initial changes include lowering the price of <a href="https://www.tomsguide.com/opinion/xbox-game-pass-is-great-but-heres-why-im-canceling-my-subscription-anyway">Xbox Game Pass</a> from $29.99 to $22.99 per month, scrapping the “This is an Xbox” campaign, and rolling out long-requested improvements to the Achievements system.</p><p>Then came another update. In a post on X (formerly Twitter), Sharma teased yet another change, one that pushed fan excitement even higher. And honestly, I felt it too. This was the kind of announcement that makes you start paying attention to Xbox again.</p><h2 id="copilot-ai-on-consoles-will-no-longer-be-a-thing">Copilot AI on consoles will no longer be a thing</h2><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2051746410660593933"><p lang="en" dir="ltr">Xbox needs to move faster, deepen our connection with the community, and address friction for both players and developers.Today, we promoted leaders who helped build Xbox, while also bringing in new voices to help push us forward. This balance is important as we get the business…<a href="https://twitter.com/cantworkitout/status/2051746410660593933">May 5, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>Sharma made it clear that further development for Microsoft Copilot AI across mobile and consoles has officially been halted for good. </p><p>Before its cancellation on those devices, this feature was showcased as an AI assistant that could provide players with in-game tips, make game recommendations and even offer predictions for upcoming Xbox showcases. <a href="https://www.tomsguide.com/ai/i-finally-tried-gaming-copilot-in-the-xbox-app-and-its-game-recommendations-surprised-me">Gaming Copilot</a> is currently available in the Xbox mobile app, on Game Bar for Windows 11 and across the ROG Xbox Ally family of handhelds.</p><p>Another major change that Sharma has enacted for the Xbox brand is her appointment of new leaders who will assist her in her mission to make Xbox a powerhouse once again. In a memo detailed by <a href="https://www.ign.com/articles/xbox-boss-asha-sharma-announces-leadership-reshuffle-in-bid-to-move-faster-bringing-in-former-microsoft-ai-colleagues" target="_blank">IGN</a>, four of those new roles saw positions filled by Sharma’s colleagues from her time spent at CoreAI.</p><p>Those new Xbox leaders include:</p><ul><li><strong>Jared Palmer</strong>, the new VP of Engineering at Xbox (former CoreAI VP of product)</li><li><strong>Tim Allen</strong>, the new CVP of Xbox Design (former CoreAI president of design)</li><li><strong>Jonathan McKay</strong>, the new Xbox Head of Growth (former CoreAI head of growth)</li><li><strong>Evan Chaki</strong> will “run a team of forward-deployed engineers that will look to simplify development and end repetitive work” (former CoreAI GM of AI innovation)</li><li><strong>David Schloss</strong>, the new Xbox Head of subscriptions and cloud (former Instacart senior director of product and growth)</li></ul><p><a href="https://kotaku.com/new-xbox-boss-continues-big-shakeup-new-leadership-changes-2000693248" target="_blank">Kotaku</a> also discovered a bunch of other changes made to Xbox’s most important positions: </p><ul><li><strong>Jason Ronald</strong> will now be "accountable for Project Helix and the Xbox platform" as the new VP of Next Generation at Xbox (former VP of Xbox gaming devices and ecosystems)</li><li><strong>Jason Beaumont</strong> will now lead product and also serve as interim head of engineering (former VP of Xbox experiences)</li><li><strong>Fatima Kardar</strong> will maintain her position as the corporate VP of gaming AI and fulfill her new responsibilities as the head of a “newly formed Personalization org” that will focus on solving player-facing issues like search and discovery.</li><li><strong>Jennifer Creegan</strong> will now lead Xbox’s media business (former VP of strategy, business model, and insights)</li></ul><h2 id="the-takeaway-2">The takeaway</h2><p>From my perspective, Sharma has made all the right moves so far to rebuild confidence in the Xbox brand.</p><p>As an Xbox Series X owner and long-time Xbox Game Pass subscriber, I’m genuinely optimistic about what comes next. With major titles like Forza Horizon 6, Halo: Campaign Evolved and a new Fable reportedly on the way, 2026 is shaping up to be a big year. I’m also hoping Clockwork Revolution makes the cut.</p><p>Dropping Copilot from the core gaming experience also feels like the right call. While I tested the Gaming Copilot feature on mobile and found its recommendations surprisingly useful, most players simply don’t need AI to handle tasks they can easily do themselves. The broader gaming audience hasn’t exactly been asking for it.</p><p>Instead, doubling down on first-party studios and focusing on delivering high-quality games—not forcing AI into places it doesn’t belong—looks like a smarter long-term strategy. If Sharma and her team stay on this path, Xbox could finally regain some serious momentum.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom’s Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/i-finally-tried-gaming-copilot-in-the-xbox-app-and-its-game-recommendations-surprised-me" target="_blank">This Xbox Mobile App AI Feature Gave Me Shockingly Good Game Recommendations</a></li><li><a href="https://www.tomsguide.com/phones/openai-reportedly-fast-tracking-chatgpt-phone-for-2027-launch-and-this-is-the-headline-spec" target="_blank">OpenAI reportedly fast tracking ChatGPT phone for 2027 launch — and this is the 'headline spec'</a></li><li><a href="https://www.tomsguide.com/ai/urgent-claude-ai-warning-hackers-are-using-a-gift-loophole-to-bypass-2fa" target="_blank">Urgent Claude AI warning: Hackers are using a $600 ‘gift’ loophole to bypass 2FA</a></li></ul><div data-widget-type="comparison" data-model-name="Microsoft Xbox Series X"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/ai/xbox-ceo-just-scrapped-copilot-ai-for-consoles-and-i-couldnt-be-happier</link>
                                                                            <description>
                            <![CDATA[ Xbox CEO Asha Sharma just announced that development for Microsoft Copilot AI on consoles has been abandoned. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">8qoZD4uR5GBHhFU7Y4dLki</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/ztD9L9fCjfUCfPmL5bJ3qd-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 06 May 2026 15:19:31 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[AI]]></category>
                                                                                                                    <dc:creator><![CDATA[ Elton Jones ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/qoRE8e6t2nzaNKAhJGDv7g.png ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/ztD9L9fCjfUCfPmL5bJ3qd-1280-80.jpg">
                                                            <media:credit><![CDATA[Microsoft]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Xbox logo]]></media:description>                                                            <media:text><![CDATA[Xbox logo]]></media:text>
                                <media:title type="plain"><![CDATA[Xbox logo]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/ztD9L9fCjfUCfPmL5bJ3qd-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The shake-up at Microsoft caught a lot of people off guard. When Phil Spencer and Sarah Bond both stepped away from their roles, it marked a major turning point for Xbox.</p><p>What came next was even more unexpected: Asha Sharma, formerly leading Microsoft’s CoreAI product, stepped in as the new EVP and CEO of<a href="https://www.tomsguide.com/gaming/i-just-tested-the-all-digital-xbox-series-x-and-it-fixes-my-main-gripe-with-the-original"> Xbox</a>.</p><p>Since taking over, Sharma has moved quickly to reshape the Xbox ecosystem, and early signs are giving gamers a reason to feel optimistic again. Her initial changes include lowering the price of <a href="https://www.tomsguide.com/opinion/xbox-game-pass-is-great-but-heres-why-im-canceling-my-subscription-anyway">Xbox Game Pass</a> from $29.99 to $22.99 per month, scrapping the “This is an Xbox” campaign, and rolling out long-requested improvements to the Achievements system.</p><p>Then came another update. In a post on X (formerly Twitter), Sharma teased yet another change, one that pushed fan excitement even higher. And honestly, I felt it too. This was the kind of announcement that makes you start paying attention to Xbox again.</p><h2 id="copilot-ai-on-consoles-will-no-longer-be-a-thing">Copilot AI on consoles will no longer be a thing</h2><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2051746410660593933"><p lang="en" dir="ltr">Xbox needs to move faster, deepen our connection with the community, and address friction for both players and developers.Today, we promoted leaders who helped build Xbox, while also bringing in new voices to help push us forward. This balance is important as we get the business…<a href="https://twitter.com/cantworkitout/status/2051746410660593933">May 5, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>Sharma made it clear that further development for Microsoft Copilot AI across mobile and consoles has officially been halted for good. </p><p>Before its cancellation on those devices, this feature was showcased as an AI assistant that could provide players with in-game tips, make game recommendations and even offer predictions for upcoming Xbox showcases. <a href="https://www.tomsguide.com/ai/i-finally-tried-gaming-copilot-in-the-xbox-app-and-its-game-recommendations-surprised-me">Gaming Copilot</a> is currently available in the Xbox mobile app, on Game Bar for Windows 11 and across the ROG Xbox Ally family of handhelds.</p><p>Another major change that Sharma has enacted for the Xbox brand is her appointment of new leaders who will assist her in her mission to make Xbox a powerhouse once again. In a memo detailed by <a href="https://www.ign.com/articles/xbox-boss-asha-sharma-announces-leadership-reshuffle-in-bid-to-move-faster-bringing-in-former-microsoft-ai-colleagues" target="_blank">IGN</a>, four of those new roles saw positions filled by Sharma’s colleagues from her time spent at CoreAI.</p><p>Those new Xbox leaders include:</p><ul><li><strong>Jared Palmer</strong>, the new VP of Engineering at Xbox (former CoreAI VP of product)</li><li><strong>Tim Allen</strong>, the new CVP of Xbox Design (former CoreAI president of design)</li><li><strong>Jonathan McKay</strong>, the new Xbox Head of Growth (former CoreAI head of growth)</li><li><strong>Evan Chaki</strong> will “run a team of forward-deployed engineers that will look to simplify development and end repetitive work” (former CoreAI GM of AI innovation)</li><li><strong>David Schloss</strong>, the new Xbox Head of subscriptions and cloud (former Instacart senior director of product and growth)</li></ul><p><a href="https://kotaku.com/new-xbox-boss-continues-big-shakeup-new-leadership-changes-2000693248" target="_blank">Kotaku</a> also discovered a bunch of other changes made to Xbox’s most important positions: </p><ul><li><strong>Jason Ronald</strong> will now be "accountable for Project Helix and the Xbox platform" as the new VP of Next Generation at Xbox (former VP of Xbox gaming devices and ecosystems)</li><li><strong>Jason Beaumont</strong> will now lead product and also serve as interim head of engineering (former VP of Xbox experiences)</li><li><strong>Fatima Kardar</strong> will maintain her position as the corporate VP of gaming AI and fulfill her new responsibilities as the head of a “newly formed Personalization org” that will focus on solving player-facing issues like search and discovery.</li><li><strong>Jennifer Creegan</strong> will now lead Xbox’s media business (former VP of strategy, business model, and insights)</li></ul><h2 id="the-takeaway-2">The takeaway</h2><p>From my perspective, Sharma has made all the right moves so far to rebuild confidence in the Xbox brand.</p><p>As an Xbox Series X owner and long-time Xbox Game Pass subscriber, I’m genuinely optimistic about what comes next. With major titles like Forza Horizon 6, Halo: Campaign Evolved and a new Fable reportedly on the way, 2026 is shaping up to be a big year. I’m also hoping Clockwork Revolution makes the cut.</p><p>Dropping Copilot from the core gaming experience also feels like the right call. While I tested the Gaming Copilot feature on mobile and found its recommendations surprisingly useful, most players simply don’t need AI to handle tasks they can easily do themselves. The broader gaming audience hasn’t exactly been asking for it.</p><p>Instead, doubling down on first-party studios and focusing on delivering high-quality games—not forcing AI into places it doesn’t belong—looks like a smarter long-term strategy. If Sharma and her team stay on this path, Xbox could finally regain some serious momentum.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom’s Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/i-finally-tried-gaming-copilot-in-the-xbox-app-and-its-game-recommendations-surprised-me" target="_blank">This Xbox Mobile App AI Feature Gave Me Shockingly Good Game Recommendations</a></li><li><a href="https://www.tomsguide.com/phones/openai-reportedly-fast-tracking-chatgpt-phone-for-2027-launch-and-this-is-the-headline-spec" target="_blank">OpenAI reportedly fast tracking ChatGPT phone for 2027 launch — and this is the 'headline spec'</a></li><li><a href="https://www.tomsguide.com/ai/urgent-claude-ai-warning-hackers-are-using-a-gift-loophole-to-bypass-2fa" target="_blank">Urgent Claude AI warning: Hackers are using a $600 ‘gift’ loophole to bypass 2FA</a></li></ul><div data-widget-type="comparison" data-model-name="Microsoft Xbox Series X"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 'Only Chromium-based browser I've tested that behaves this way': Microsoft Edge has a huge password vulnerability researcher claims ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Microsoft Edge apparently saves your passwords in its memory as cleartext according to a Norwegian cybersecurity researcher. This matters because it means a malicious actor could see all of your passwords if they gain access to your PC. </p><p><em><strong>Update: </strong></em><em>Microsoft provided Tom's Guide with a statement, read on for the company's response.</em></p><p>The researcher, <a href="https://x.com/L1v1ng0ffTh3L4N/status/2051308329880719730" target="_blank">Tom Jøran Sønstebyseter Rønning</a> (spotted by our friends at <a href="https://www.pcgamer.com/hardware/microsoft-edge-saves-passwords-in-cleartext-by-design-and-researchers-argue-this-turns-into-a-credential-harvest-on-shared-pcs/" target="_blank">PC Gamer</a>), posted a thread on X explaining how the browser decrypts "every credential at startup" and then keeps them in process memory. It even happens for sites that you don't visit that session.</p><p>"Edge is the only Chromium‑based browser I’ve tested that behaves this way," Rønning said.</p><p>To be clear, this isn't available for anyone to just stumble across. You need some know-how and administrative access to the terminal server, already a huge breach. Once that is done, a bad actor "can access the memory of all logged‑on user processes."</p><p>A person could have administrative access on one account and then use that access to compromise passwords for other logged-in users too.</p><p>Yes, someone with admin rights can wreak havoc on any computer they have access to, but you typically need passwords to access password managers or two-factor authentication. Cleartext means that passwords are more visible and in a shared environment, that would be a treasure trove for a bad actor.</p><p>"Access to browser data as described in the reported scenario would require the device to already be compromised," a Microsoft spokesperson said in a statement.</p><h2 id="by-design">"By 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:5400px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="gcb4ZLNUhkLc5vcuK2DVjB" name="shutterstock_2141023355" alt="Microsoft Edge open on a laptop with the browser's app listing page open on a smartphone in front of it" src="https://cdn.mos.cms.futurecdn.net/gcb4ZLNUhkLc5vcuK2DVjB.jpg" mos="" align="middle" fullscreen="" width="5400" height="3038" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Rønning posted that he disclosed this flaw to Microsoft and was told that the behavior is "by design." And it appears to be known. </p><p>In a related thread, X user <a href="https://x.com/LopezLucio666/status/2051648029019799590" target="_blank">LopezLucio666 </a>responded that they reported the flaw in September of 2025. According to a screencap they posted, the Microsoft Security Response Center (MSRC) deemed the flaw "not a vulnerability and no security boundary being crossed."</p><p>The message says that the ability to read Edge memory requires privileges "the same or greater." </p><p>Microsoft has a <a href="https://learn.microsoft.com/en-us/deployedge/microsoft-edge-security-password-manager-security" target="_blank">password manager security FAQ</a> that does sort of address the issue. "Even if an attacker has admin rights or offline access and can get to the locally stored data, the system is designed to prevent the attacker from getting the plaintext passwords of a user who isn't logged in."</p><p>This doesn't do anything for users who are logged in, though.</p><p>Microsoft told Tom's Guide that design choices regarding this involve "balancing performance, usability and security, and we continue to review it against evolving threats."</p><p>The company added that the browser's access to password data in memory allows you to sign in quickly and securely, an "expected feature of the application."</p><p>Per Rønning and others' research, the system may not be doing enough to prevent attackers from being able to access the cleartext passwords. </p><p>In the meantime, we recommend using one of the <a href="https://www.tomsguide.com/us/best-password-managers,review-3785.html">best password managers</a> instead of storing them in Edge or any other browser for that matter.</p><h2 id="microsoft-statement">Microsoft statement</h2><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/microsoft-is-hiding-windows-11s-eyes-heres-how-to-find-copilot-vision-and-fully-delete-it">Microsoft is hiding Windows 11's 'eyes' — here's how to find Copilot Vision (and fully delete it)</a></li><li><a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-reportedly-redesigning-start-menu-in-windows-11-after-actually-listening-to-user-complaints">Microsoft reportedly redesigning Start Menu in Windows 11 after actually listening to user complaints</a></li><li><a href="https://www.tomsguide.com/computing/laptops/microsoft-quietly-hiked-prices-on-all-its-surface-laptops-its-now-cheaper-to-buy-a-macbook-air">Microsoft quietly hiked prices on all its Surface laptops — it's now cheaper to buy a MacBook Air</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/online-security/only-chromium-based-browser-ive-tested-that-behaves-this-way-microsoft-edge-has-a-huge-password-vulnerability-researcher-claims</link>
                                                                            <description>
                            <![CDATA[ Microsoft's Chromium-based Edge browser reportedly stores saved passwords in cleartext by design. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">T9yBH5uUaqzN2pLuu77BkK</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/VGtB7V6BJ8LtyCkvo2Qvmm-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 05 May 2026 19:42:13 +0000</pubDate>                                                                                                                                <updated>Tue, 05 May 2026 22:01:06 +0000</updated>
                                                                                                                                            <category><![CDATA[Online Security]]></category>
                                                    <category><![CDATA[Browsers]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Internet]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/VGtB7V6BJ8LtyCkvo2Qvmm-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                        <media:description><![CDATA[&lt;p&gt;Microsoft Edge introduced &quot;double click to close browser tabs&quot; some time ago. It now seems Google Chrome may get this handy feature.&lt;/p&gt;]]></media:description>                                                            <media:text><![CDATA[Microsoft Edge Browser]]></media:text>
                                <media:title type="plain"><![CDATA[Microsoft Edge Browser]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/VGtB7V6BJ8LtyCkvo2Qvmm-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Microsoft Edge apparently saves your passwords in its memory as cleartext according to a Norwegian cybersecurity researcher. This matters because it means a malicious actor could see all of your passwords if they gain access to your PC. </p><p><em><strong>Update: </strong></em><em>Microsoft provided Tom's Guide with a statement, read on for the company's response.</em></p><p>The researcher, <a href="https://x.com/L1v1ng0ffTh3L4N/status/2051308329880719730" target="_blank">Tom Jøran Sønstebyseter Rønning</a> (spotted by our friends at <a href="https://www.pcgamer.com/hardware/microsoft-edge-saves-passwords-in-cleartext-by-design-and-researchers-argue-this-turns-into-a-credential-harvest-on-shared-pcs/" target="_blank">PC Gamer</a>), posted a thread on X explaining how the browser decrypts "every credential at startup" and then keeps them in process memory. It even happens for sites that you don't visit that session.</p><p>"Edge is the only Chromium‑based browser I’ve tested that behaves this way," Rønning said.</p><p>To be clear, this isn't available for anyone to just stumble across. You need some know-how and administrative access to the terminal server, already a huge breach. Once that is done, a bad actor "can access the memory of all logged‑on user processes."</p><p>A person could have administrative access on one account and then use that access to compromise passwords for other logged-in users too.</p><p>Yes, someone with admin rights can wreak havoc on any computer they have access to, but you typically need passwords to access password managers or two-factor authentication. Cleartext means that passwords are more visible and in a shared environment, that would be a treasure trove for a bad actor.</p><p>"Access to browser data as described in the reported scenario would require the device to already be compromised," a Microsoft spokesperson said in a statement.</p><h2 id="by-design">"By 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:5400px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="gcb4ZLNUhkLc5vcuK2DVjB" name="shutterstock_2141023355" alt="Microsoft Edge open on a laptop with the browser's app listing page open on a smartphone in front of it" src="https://cdn.mos.cms.futurecdn.net/gcb4ZLNUhkLc5vcuK2DVjB.jpg" mos="" align="middle" fullscreen="" width="5400" height="3038" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Rønning posted that he disclosed this flaw to Microsoft and was told that the behavior is "by design." And it appears to be known. </p><p>In a related thread, X user <a href="https://x.com/LopezLucio666/status/2051648029019799590" target="_blank">LopezLucio666 </a>responded that they reported the flaw in September of 2025. According to a screencap they posted, the Microsoft Security Response Center (MSRC) deemed the flaw "not a vulnerability and no security boundary being crossed."</p><p>The message says that the ability to read Edge memory requires privileges "the same or greater." </p><p>Microsoft has a <a href="https://learn.microsoft.com/en-us/deployedge/microsoft-edge-security-password-manager-security" target="_blank">password manager security FAQ</a> that does sort of address the issue. "Even if an attacker has admin rights or offline access and can get to the locally stored data, the system is designed to prevent the attacker from getting the plaintext passwords of a user who isn't logged in."</p><p>This doesn't do anything for users who are logged in, though.</p><p>Microsoft told Tom's Guide that design choices regarding this involve "balancing performance, usability and security, and we continue to review it against evolving threats."</p><p>The company added that the browser's access to password data in memory allows you to sign in quickly and securely, an "expected feature of the application."</p><p>Per Rønning and others' research, the system may not be doing enough to prevent attackers from being able to access the cleartext passwords. </p><p>In the meantime, we recommend using one of the <a href="https://www.tomsguide.com/us/best-password-managers,review-3785.html">best password managers</a> instead of storing them in Edge or any other browser for that matter.</p><h2 id="microsoft-statement">Microsoft statement</h2><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/microsoft-is-hiding-windows-11s-eyes-heres-how-to-find-copilot-vision-and-fully-delete-it">Microsoft is hiding Windows 11's 'eyes' — here's how to find Copilot Vision (and fully delete it)</a></li><li><a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-reportedly-redesigning-start-menu-in-windows-11-after-actually-listening-to-user-complaints">Microsoft reportedly redesigning Start Menu in Windows 11 after actually listening to user complaints</a></li><li><a href="https://www.tomsguide.com/computing/laptops/microsoft-quietly-hiked-prices-on-all-its-surface-laptops-its-now-cheaper-to-buy-a-macbook-air">Microsoft quietly hiked prices on all its Surface laptops — it's now cheaper to buy a MacBook Air</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Xbox is giving Game Pass Ultimate a rare price cut — but there's a Call of Duty catch ]]></title>
                                                                                                <dc:content><![CDATA[ <p>When <a href="https://www.tomsguide.com/gaming/microsoft-just-raised-the-price-of-xbox-game-pass-ultimate-heres-how-much-youll-pay-now">Xbox raised the price </a>of the Game Pass Ultimate tier by 50% last October, it <a href="https://www.tomsguide.com/gaming/xbox/xbox-game-pass-price-hike-is-infuriating-users-but-heres-how-to-beat-the-cost-increase">infuriated gamers </a>who rushed to cancel their subscriptions. Since then a lot of changes have unfolded at Microsoft, including the ascension of new Xbox CEO Asha Sharma. </p><p>Today (Apr. 21), <a href="https://x.com/asha_shar/status/2046619416427950442?s=46" target="_blank">Sharma took to X</a> to announce a rare price <em>decrease</em> for the service. </p><p>"Game Pass Ultimate has become too expensive for too many players," Sharma wrote. "Starting today, we’re dropping the price from $29.99 to $22.99/month."</p><p>It's not quite back to pre-October levels, when Game Pass Ultimate was only $19.99 a month but it's a step in the right direction. </p><p>Sharma added that the service will also no longer get future Call of Duty titles on Day One via Game Pass Ultimate. I've long speculated that Call of Duty was driving up the cost of Ultimate since it is one of Activision's cash cows, so this makes sense.</p><p>When the next Call of Duty releases, it won't join Game Pass until the "following holiday after launch" or about a year. Previously released Call of Duty games will remain available on the service. </p><h2 id="what-s-next-for-xbox">What's next for Xbox?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1024px;"><p class="vanilla-image-block" style="padding-top:66.70%;"><img id="kwJBZ2i4EdEyxmKQhN5hcS" name="asha-sharma-1024x683" alt="Asha Sharma, Xbox CEO" src="https://cdn.mos.cms.futurecdn.net/kwJBZ2i4EdEyxmKQhN5hcS.jpg" mos="" align="middle" fullscreen="" width="1024" height="683" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>From the outside Xbox has been floundering in recent years between price hikes across software and consoles a lack of exclusive Xbox titles that gamers find exciting. </p><p><a href="https://www.tomsguide.com/gaming/xbox/end-of-an-era-xboxs-ceo-phil-spencer-is-officially-retiring-next-week">Longtime CEO Phil Spencer retired</a> in February which also led to the surprise resignation of Xbox President Sarah Bond, who was seen the heir apparent. </p><p>They were replaced by Sharma who came from an AI arm of Microsoft. Though she promised she wasn't coming into shove AI into Xbox.</p><p>From the outset, Sharma <a href="https://www.tomsguide.com/gaming/xbox/xboxs-asha-sharma-promises-the-return-of-xbox-and-a-distinct-point-of-view-in-new-interview">promised that she would listen</a> to gamers and Xbox fans to figure out how to right the ship saying that she was "coming into gaming as a platform builder." </p><p>So far, Xbox has stayed quiet outside of <a href="https://www.tomsguide.com/gaming/xbox/next-xbox-will-play-your-xbox-and-pc-games-new-ceo-promises">teasing Project Helix</a>, the rumored console/PC hybrid that is expected to launch in the next couple of years. It was rumored that Sharma spent much of the recent GDC conference selling Xbox to developers, publishers and investors. </p><p>Until a new console launches, a price decrease is a nice way for Xbox to garner some goodwill from fans even if it could have been more drastic.</p><p>We'll truly know where Xbox and Sharma stand when the Helix launches. That will tell us how Microsoft views its gaming division and the path forward.</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/windows-operating-systems/microsoft-reportedly-redesigning-start-menu-in-windows-11-after-actually-listening-to-user-complaints">Microsoft reportedly redesigning Start Menu in Windows 11 after actually listening to user complaints</a></li><li><a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-starts-removing-copilot-from-windows-11-im-saying-that-sarcastically-because-its-clearly-just-lip-service">Microsoft starts removing Copilot from Windows 11 — I’m saying that sarcastically because it's clearly just lip service</a></li><li><a href="https://www.tomsguide.com/computing/windows-is-using-your-internet-to-update-other-peoples-pcs-disable-this-hidden-setting-to-speed-up-your-connection">Windows is using your internet to update other people’s PCs — disable this hidden setting to speed up your connection</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/xbox/xbox-is-giving-game-pass-ultimate-a-rare-price-cut-but-theres-a-call-of-duty-catch</link>
                                                                            <description>
                            <![CDATA[ Xbox is lowering the price of Game Pass Ultimate to $22.99, but the trade-off is that future Call of Duty games will no longer be Day One. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">CjDgzpVb9M52K97rDmKjQ7</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/MuHXJCguraXv9UiUQoHsBo-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 21 Apr 2026 22:40:34 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Xbox]]></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/MuHXJCguraXv9UiUQoHsBo-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Xbox Game Pass cloud gaming titles shown Xbox controller and Xbox Series X titles]]></media:description>                                                            <media:text><![CDATA[Xbox Game Pass cloud gaming titles shown Xbox controller and Xbox Series X titles]]></media:text>
                                <media:title type="plain"><![CDATA[Xbox Game Pass cloud gaming titles shown Xbox controller and Xbox Series X titles]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/MuHXJCguraXv9UiUQoHsBo-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>When <a href="https://www.tomsguide.com/gaming/microsoft-just-raised-the-price-of-xbox-game-pass-ultimate-heres-how-much-youll-pay-now">Xbox raised the price </a>of the Game Pass Ultimate tier by 50% last October, it <a href="https://www.tomsguide.com/gaming/xbox/xbox-game-pass-price-hike-is-infuriating-users-but-heres-how-to-beat-the-cost-increase">infuriated gamers </a>who rushed to cancel their subscriptions. Since then a lot of changes have unfolded at Microsoft, including the ascension of new Xbox CEO Asha Sharma. </p><p>Today (Apr. 21), <a href="https://x.com/asha_shar/status/2046619416427950442?s=46" target="_blank">Sharma took to X</a> to announce a rare price <em>decrease</em> for the service. </p><p>"Game Pass Ultimate has become too expensive for too many players," Sharma wrote. "Starting today, we’re dropping the price from $29.99 to $22.99/month."</p><p>It's not quite back to pre-October levels, when Game Pass Ultimate was only $19.99 a month but it's a step in the right direction. </p><p>Sharma added that the service will also no longer get future Call of Duty titles on Day One via Game Pass Ultimate. I've long speculated that Call of Duty was driving up the cost of Ultimate since it is one of Activision's cash cows, so this makes sense.</p><p>When the next Call of Duty releases, it won't join Game Pass until the "following holiday after launch" or about a year. Previously released Call of Duty games will remain available on the service. </p><h2 id="what-s-next-for-xbox">What's next for Xbox?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1024px;"><p class="vanilla-image-block" style="padding-top:66.70%;"><img id="kwJBZ2i4EdEyxmKQhN5hcS" name="asha-sharma-1024x683" alt="Asha Sharma, Xbox CEO" src="https://cdn.mos.cms.futurecdn.net/kwJBZ2i4EdEyxmKQhN5hcS.jpg" mos="" align="middle" fullscreen="" width="1024" height="683" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>From the outside Xbox has been floundering in recent years between price hikes across software and consoles a lack of exclusive Xbox titles that gamers find exciting. </p><p><a href="https://www.tomsguide.com/gaming/xbox/end-of-an-era-xboxs-ceo-phil-spencer-is-officially-retiring-next-week">Longtime CEO Phil Spencer retired</a> in February which also led to the surprise resignation of Xbox President Sarah Bond, who was seen the heir apparent. </p><p>They were replaced by Sharma who came from an AI arm of Microsoft. Though she promised she wasn't coming into shove AI into Xbox.</p><p>From the outset, Sharma <a href="https://www.tomsguide.com/gaming/xbox/xboxs-asha-sharma-promises-the-return-of-xbox-and-a-distinct-point-of-view-in-new-interview">promised that she would listen</a> to gamers and Xbox fans to figure out how to right the ship saying that she was "coming into gaming as a platform builder." </p><p>So far, Xbox has stayed quiet outside of <a href="https://www.tomsguide.com/gaming/xbox/next-xbox-will-play-your-xbox-and-pc-games-new-ceo-promises">teasing Project Helix</a>, the rumored console/PC hybrid that is expected to launch in the next couple of years. It was rumored that Sharma spent much of the recent GDC conference selling Xbox to developers, publishers and investors. </p><p>Until a new console launches, a price decrease is a nice way for Xbox to garner some goodwill from fans even if it could have been more drastic.</p><p>We'll truly know where Xbox and Sharma stand when the Helix launches. That will tell us how Microsoft views its gaming division and the path forward.</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/windows-operating-systems/microsoft-reportedly-redesigning-start-menu-in-windows-11-after-actually-listening-to-user-complaints">Microsoft reportedly redesigning Start Menu in Windows 11 after actually listening to user complaints</a></li><li><a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-starts-removing-copilot-from-windows-11-im-saying-that-sarcastically-because-its-clearly-just-lip-service">Microsoft starts removing Copilot from Windows 11 — I’m saying that sarcastically because it's clearly just lip service</a></li><li><a href="https://www.tomsguide.com/computing/windows-is-using-your-internet-to-update-other-peoples-pcs-disable-this-hidden-setting-to-speed-up-your-connection">Windows is using your internet to update other people’s PCs — disable this hidden setting to speed up your connection</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Microsoft reportedly redesigning Start Menu in Windows 11 after actually listening to user complaints ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Microsoft has been <a href="https://www.tomsguide.com/computing/windows-operating-systems/we-need-to-improve-windows-in-ways-that-are-meaningful-for-people-microsoft-is-urgently-trying-to-fix-windows-11-issues">promising to improve Windows 11</a> since January and we may see that overhaul begin with the <a href="https://www.tomsguide.com/news/windows-11-new-start-menu-everything-you-need-to-know">Start Menu</a>. The tech giant is rebuilding the Start menu with customization options and improved performance.</p><p>According to our friends at <a href="https://www.windowscentral.com/gaming/indies-idxbox/starship-troopers-ultimate-bug-war-xbox" target="_blank">Windows Central</a>, Microsoft is working on an update that's designed to give you more control over how the the menu looks and operates. It fits with <a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-promises-windows-11-reset-new-focus-on-performance-reliability-and-reducing-unnecessary-copilot-ai">promises made in March</a> that detailed more customization and performance improvements for Windows 11 as a whole.</p><h2 id="what-is-microsoft-potentially-changing">What is Microsoft potentially changing</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="WWfVQoKyhS6ocSop9eu59R" name="Windows 11 laptop.jpg" alt="Windows 11" src="https://cdn.mos.cms.futurecdn.net/WWfVQoKyhS6ocSop9eu59R.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Per Window Central, the initial look of the Start Menu will appear similar to how it already does in Windows 11. The difference will be in customization options configurable in the Windows Settings app. </p><p>Examples include the ability to turn off specific sections of the menu and choosing between small or large layouts. Currently, you can only see the small and large layouts depending on your screen size and device. This would let you set the menu to your preferred size regardless of what kind of device you're using.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eM7bDO"></div>                            </div>                            <script src="https://kwizly.com/embed/eM7bDO.js" async></script><p>As for toggling off sections, allegedly, you can turn off different things like the recommended feed or pinning apps in the menu. You could potentially even disable the all apps list.</p><p>Beyond customization, the new Start menu is supposed to be much more responsive, even when under intense load. This is supposed to extend to the search bar in the menu where you'll be able to type and search without any noticeable slowdown or missed keys.</p><h2 id="what-could-have-been">What could have been</h2><p>The alleged changes come out as Microsoft's design team shared on its Instagram page the approach that was taken to redesigning the Start menu. Unfortunately, the comments under that post are not kind.</p><p>"I don't like the new Start Menu at all. It doesn't fulfill my personal necessities and it makes everything more frustrating and time consuming. I even pay a third party software that modify it," one person wrote.</p><p>The comments were eventually turned off.</p><div class="instagram-embed"><blockquote class="instagram-media"  data-instgrm-version="6" style="width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);"><p><a href="https://www.instagram.com/p/DWmNoyilCOw/" target="_blank">A post shared by Microsoft Design (@microsoft.design)</a></p><p>A photo posted by </p></blockquote></div><p><a href="https://www.windowslatest.com/2026/04/10/microsoft-tested-5-different-start-menus-for-windows-11-before-choosing-the-current-one/" target="_blank">Windows Latest</a> points out that the Windows Design team <a href="https://microsoft.design/articles/start-fresh-redesigning-windows-start-menu/" target="_blank">released a blog post</a> last year that revealed five prototype Start menus. Some commentators called the prototypes more beautiful. However, looking at some of the images, all five still appear to have the same problems that the current menu does.</p><p>To be honest, it just makes us <a href="https://www.tomsguide.com/news/windows-10s-stunning-new-start-menu-revealed-heres-your-first-look">miss the Windows 10 Start Menu</a>, which mixed app lists and tiles in a more usable way. </p><p>Microsoft says it wants to solve the pain points in Windows 11 throughout 2026. It appears the Start Menu will be one of the first changes.</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/windows-operating-systems/microsoft-starts-removing-copilot-from-windows-11-im-saying-that-sarcastically-because-its-clearly-just-lip-service">Microsoft starts removing Copilot from Windows 11 — I’m saying that sarcastically because it's clearly just lip service</a></li><li><a href="https://www.tomsguide.com/computing/windows-is-using-your-internet-to-update-other-peoples-pcs-disable-this-hidden-setting-to-speed-up-your-connection">Windows is using your internet to update other people’s PCs — disable this hidden setting to speed up your connection</a></li><li><a href="https://www.tomsguide.com/ai/i-ditched-copilot-for-claude-in-microsoft-word-and-im-never-going-back">I ditched Copilot for Claude in Microsoft Word — and I’m never going back</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/windows-operating-systems/microsoft-reportedly-redesigning-start-menu-in-windows-11-after-actually-listening-to-user-complaints</link>
                                                                            <description>
                            <![CDATA[ Microsoft is reportedly redesigning the Windows 11 Start Menu after listening to user complaints. Here's what's coming. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">ckX6ZCN86Tefb6EAuYkRjC</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/PLRu6JNgfn6MqNXq2G4BWj-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 17 Apr 2026 23:26:55 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Windows Operating Systems]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Software]]></category>
                                                    <category><![CDATA[Operating Systems]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ.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/PLRu6JNgfn6MqNXq2G4BWj-1280-80.jpg">
                                                            <media:credit><![CDATA[Microsoft]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Windows 11 Start Menu - dark mode]]></media:description>                                                            <media:text><![CDATA[Windows 11 Start Menu - dark mode]]></media:text>
                                <media:title type="plain"><![CDATA[Windows 11 Start Menu - dark mode]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/PLRu6JNgfn6MqNXq2G4BWj-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Microsoft has been <a href="https://www.tomsguide.com/computing/windows-operating-systems/we-need-to-improve-windows-in-ways-that-are-meaningful-for-people-microsoft-is-urgently-trying-to-fix-windows-11-issues">promising to improve Windows 11</a> since January and we may see that overhaul begin with the <a href="https://www.tomsguide.com/news/windows-11-new-start-menu-everything-you-need-to-know">Start Menu</a>. The tech giant is rebuilding the Start menu with customization options and improved performance.</p><p>According to our friends at <a href="https://www.windowscentral.com/gaming/indies-idxbox/starship-troopers-ultimate-bug-war-xbox" target="_blank">Windows Central</a>, Microsoft is working on an update that's designed to give you more control over how the the menu looks and operates. It fits with <a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-promises-windows-11-reset-new-focus-on-performance-reliability-and-reducing-unnecessary-copilot-ai">promises made in March</a> that detailed more customization and performance improvements for Windows 11 as a whole.</p><h2 id="what-is-microsoft-potentially-changing">What is Microsoft potentially changing</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="WWfVQoKyhS6ocSop9eu59R" name="Windows 11 laptop.jpg" alt="Windows 11" src="https://cdn.mos.cms.futurecdn.net/WWfVQoKyhS6ocSop9eu59R.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Per Window Central, the initial look of the Start Menu will appear similar to how it already does in Windows 11. The difference will be in customization options configurable in the Windows Settings app. </p><p>Examples include the ability to turn off specific sections of the menu and choosing between small or large layouts. Currently, you can only see the small and large layouts depending on your screen size and device. This would let you set the menu to your preferred size regardless of what kind of device you're using.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eM7bDO"></div>                            </div>                            <script src="https://kwizly.com/embed/eM7bDO.js" async></script><p>As for toggling off sections, allegedly, you can turn off different things like the recommended feed or pinning apps in the menu. You could potentially even disable the all apps list.</p><p>Beyond customization, the new Start menu is supposed to be much more responsive, even when under intense load. This is supposed to extend to the search bar in the menu where you'll be able to type and search without any noticeable slowdown or missed keys.</p><h2 id="what-could-have-been">What could have been</h2><p>The alleged changes come out as Microsoft's design team shared on its Instagram page the approach that was taken to redesigning the Start menu. Unfortunately, the comments under that post are not kind.</p><p>"I don't like the new Start Menu at all. It doesn't fulfill my personal necessities and it makes everything more frustrating and time consuming. I even pay a third party software that modify it," one person wrote.</p><p>The comments were eventually turned off.</p><div class="instagram-embed"><blockquote class="instagram-media"  data-instgrm-version="6" style="width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);"><p><a href="https://www.instagram.com/p/DWmNoyilCOw/" target="_blank">A post shared by Microsoft Design (@microsoft.design)</a></p><p>A photo posted by </p></blockquote></div><p><a href="https://www.windowslatest.com/2026/04/10/microsoft-tested-5-different-start-menus-for-windows-11-before-choosing-the-current-one/" target="_blank">Windows Latest</a> points out that the Windows Design team <a href="https://microsoft.design/articles/start-fresh-redesigning-windows-start-menu/" target="_blank">released a blog post</a> last year that revealed five prototype Start menus. Some commentators called the prototypes more beautiful. However, looking at some of the images, all five still appear to have the same problems that the current menu does.</p><p>To be honest, it just makes us <a href="https://www.tomsguide.com/news/windows-10s-stunning-new-start-menu-revealed-heres-your-first-look">miss the Windows 10 Start Menu</a>, which mixed app lists and tiles in a more usable way. </p><p>Microsoft says it wants to solve the pain points in Windows 11 throughout 2026. It appears the Start Menu will be one of the first changes.</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/windows-operating-systems/microsoft-starts-removing-copilot-from-windows-11-im-saying-that-sarcastically-because-its-clearly-just-lip-service">Microsoft starts removing Copilot from Windows 11 — I’m saying that sarcastically because it's clearly just lip service</a></li><li><a href="https://www.tomsguide.com/computing/windows-is-using-your-internet-to-update-other-peoples-pcs-disable-this-hidden-setting-to-speed-up-your-connection">Windows is using your internet to update other people’s PCs — disable this hidden setting to speed up your connection</a></li><li><a href="https://www.tomsguide.com/ai/i-ditched-copilot-for-claude-in-microsoft-word-and-im-never-going-back">I ditched Copilot for Claude in Microsoft Word — and I’m never going back</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Microsoft’s new Surface Laptop could pack an OLED panel — but how much will it cost? ]]></title>
                                                                                                <dc:content><![CDATA[ <p>New Microsoft Surface Pro and Surface Laptops are expected this year, and the latter will reportedly receive an upgraded display. As <a href="https://www.windowscentral.com/hardware/surface/microsoft-prepares-display-upgrades-and-two-stage-launch-for-new-surface-pro-and-surface-laptop-with-intel-and-snapdragon-chips-this-year" target="_blank">Windows Central</a>’s Zack Bowden reports, the Surface Laptop will have an OLED panel, which would be a first for the notebook line. In addition, both the Surface Laptop and Pro will be kitted with the latest Intel Core Ultra “<a href="https://www.tomsguide.com/computing/cpus/intel-panther-lake-cpus-promise-insane-gains-50-percent-faster-with-a-breakthrough-gpu">Panther Lake</a>” chips.</p><p>These should be the primary upgrades, as neither machine is expected to get a major redesign, apart from potentially new colors and other tweaks. OLED variants of the Surface laptops will only be available in higher-end configurations, with entry-level models getting IPS panels. Bowden also says that some models are getting a higher resolution screen.</p><p>The Surface Pro and Surface Laptops will reportedly launch with Intel Panther Lake chips this spring. These devices should start with 16GB of RAM and 256GB of storage, with higher-end models going as high as 64GB of RAM and 2TB of storage.</p><p>Bowden’s sources claim that Microsoft will launch Snapdragon models this summer when Qualcomm’s chips are more readily available. Having Intel models released before Snapdragon variants is the opposite of what happened in 2024. Microsoft is reportedly not going to offer Surface PCs with the higher-end <a href="https://www.tomsguide.com/computing/laptops/i-went-hands-on-with-the-first-snapdragon-x2-elite-extreme-laptop-heres-why-the-asus-zenbook-a16-is-the-one-to-watch">Snapdragon X2 Elite Extreme</a> chip, but only with X2 Plus and X2 Elite options. Similarly, Intel models will only be available in Ultra 5 and Ultra 7 variants, and no Ultra 9.</p><p>One thing this report doesn’t disclose is how much these machines could potentially cost. As Windows Central also reported, <a href="https://www.tomsguide.com/computing/laptops/microsoft-quietly-hiked-prices-on-all-its-surface-laptops-its-now-cheaper-to-buy-a-macbook-air">Microsoft quietly hiked prices on all its Surface laptops</a> by $300 due to the ongoing RAM crisis. Given that, it’s unlikely that either of the new Surface PCs will be cheaper than their current models.</p><p>As always, take this report with a grain of salt, as Microsoft has made no official statement about the 2026 models of the Surface Pro and Surface Laptop. The OLED upgrade sounds like a meaningful update, as is the potential for improved battery life and performance. We’ll keep an eye on this story, so stay tuned for any further updates as we hear them.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OanndX"></div>                            </div>                            <script src="https://kwizly.com/embed/OanndX.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/monitors/i-just-tested-alienwares-new-usd349-gaming-monitor-and-its-too-good-to-be-true">I just tested Alienware’s new $349 gaming monitor — and it’s awesome</a></li><li><a href="https://www.tomsguide.com/gaming/handheld-gaming/handheld-gaming-prices-are-out-of-control-heres-how-to-find-an-affordable-model-in-2026">Handheld gaming prices are out of control — 3 models for 2026</a></li><li><a href="https://www.tomsguide.com/computing/ive-used-a-macbook-as-my-primary-computer-for-two-weeks-and-im-not-going-back-to-windows">I’ve used a MacBook as my primary computer for two weeks</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/microsofts-new-surface-laptop-could-pack-an-oled-panel-but-how-much-will-it-cost</link>
                                                                            <description>
                            <![CDATA[ A new report claims that next Microsoft Surface PCs are arriving this spring, and the Surface Laptop 8 will get an OLED upgrade. Here's what we've heard. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">j29H6m3mnMw5FW7EiEFb5j</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/mjGVNqMuup3vGErLkUdBL5-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 16 Apr 2026 15:11:17 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Computing]]></category>
                                                                                                <author><![CDATA[ tony.polanco@futurenet.com (Tony Polanco) ]]></author>                    <dc:creator><![CDATA[ Tony Polanco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/atzRNqFt5wYgEUPBDahWsD.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/mjGVNqMuup3vGErLkUdBL5-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Surface Laptop 7 from the front]]></media:description>                                                            <media:text><![CDATA[Surface Laptop 7 from the front]]></media:text>
                                <media:title type="plain"><![CDATA[Surface Laptop 7 from the front]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/mjGVNqMuup3vGErLkUdBL5-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>New Microsoft Surface Pro and Surface Laptops are expected this year, and the latter will reportedly receive an upgraded display. As <a href="https://www.windowscentral.com/hardware/surface/microsoft-prepares-display-upgrades-and-two-stage-launch-for-new-surface-pro-and-surface-laptop-with-intel-and-snapdragon-chips-this-year" target="_blank">Windows Central</a>’s Zack Bowden reports, the Surface Laptop will have an OLED panel, which would be a first for the notebook line. In addition, both the Surface Laptop and Pro will be kitted with the latest Intel Core Ultra “<a href="https://www.tomsguide.com/computing/cpus/intel-panther-lake-cpus-promise-insane-gains-50-percent-faster-with-a-breakthrough-gpu">Panther Lake</a>” chips.</p><p>These should be the primary upgrades, as neither machine is expected to get a major redesign, apart from potentially new colors and other tweaks. OLED variants of the Surface laptops will only be available in higher-end configurations, with entry-level models getting IPS panels. Bowden also says that some models are getting a higher resolution screen.</p><p>The Surface Pro and Surface Laptops will reportedly launch with Intel Panther Lake chips this spring. These devices should start with 16GB of RAM and 256GB of storage, with higher-end models going as high as 64GB of RAM and 2TB of storage.</p><p>Bowden’s sources claim that Microsoft will launch Snapdragon models this summer when Qualcomm’s chips are more readily available. Having Intel models released before Snapdragon variants is the opposite of what happened in 2024. Microsoft is reportedly not going to offer Surface PCs with the higher-end <a href="https://www.tomsguide.com/computing/laptops/i-went-hands-on-with-the-first-snapdragon-x2-elite-extreme-laptop-heres-why-the-asus-zenbook-a16-is-the-one-to-watch">Snapdragon X2 Elite Extreme</a> chip, but only with X2 Plus and X2 Elite options. Similarly, Intel models will only be available in Ultra 5 and Ultra 7 variants, and no Ultra 9.</p><p>One thing this report doesn’t disclose is how much these machines could potentially cost. As Windows Central also reported, <a href="https://www.tomsguide.com/computing/laptops/microsoft-quietly-hiked-prices-on-all-its-surface-laptops-its-now-cheaper-to-buy-a-macbook-air">Microsoft quietly hiked prices on all its Surface laptops</a> by $300 due to the ongoing RAM crisis. Given that, it’s unlikely that either of the new Surface PCs will be cheaper than their current models.</p><p>As always, take this report with a grain of salt, as Microsoft has made no official statement about the 2026 models of the Surface Pro and Surface Laptop. The OLED upgrade sounds like a meaningful update, as is the potential for improved battery life and performance. We’ll keep an eye on this story, so stay tuned for any further updates as we hear them.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OanndX"></div>                            </div>                            <script src="https://kwizly.com/embed/OanndX.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/monitors/i-just-tested-alienwares-new-usd349-gaming-monitor-and-its-too-good-to-be-true">I just tested Alienware’s new $349 gaming monitor — and it’s awesome</a></li><li><a href="https://www.tomsguide.com/gaming/handheld-gaming/handheld-gaming-prices-are-out-of-control-heres-how-to-find-an-affordable-model-in-2026">Handheld gaming prices are out of control — 3 models for 2026</a></li><li><a href="https://www.tomsguide.com/computing/ive-used-a-macbook-as-my-primary-computer-for-two-weeks-and-im-not-going-back-to-windows">I’ve used a MacBook as my primary computer for two weeks</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Microsoft quietly hiked prices on all its Surface laptops — it's now cheaper to buy a MacBook Air ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Microsoft has become the latest victim of the <a href="https://www.tomsguide.com/computing/hardware/the-squeeze-is-real-i-spoke-to-ram-crisis-oracle-carmen-li-about-when-this-nightmare-ends-heres-what-she-told-me">ongoing RAM crisis</a>, quietly hiking the prices on its consumer-facing Surface laptops by as much as $300. This shouldn't come as a surprise — after all, we've just seen the <a href="https://www.tomsguide.com/gaming/playstation/major-sony-ps5-price-hike-just-hit-all-models-heres-what-youll-pay-now">PlayStation 5 get even more expensive for the same reason</a>.</p><p>First picked up by the team at <a href="https://www.windowscentral.com/hardware/surface/microsoft-reveals-major-price-increases-for-all-surface-pro-laptop-pcs-as-ram-crisis-continues" target="_blank">Windows Central</a>, the price increases took effect at the Microsoft Store, with other retailers expected to follow suit. Just about every model is affected, and Windows Central notes that flagships like the <a href="https://www.tomsguide.com/tablets/surface-pro-11">Surface Pro 11</a> and <a href="https://www.tomsguide.com/computing/laptops/microsoft-surface-laptop-7-review">Surface Laptop 7</a> are now $500 more expensive than their initial launch price in 2024.</p><p>"Due to recent increases in memory and component costs, Surface is updating pricing on Microsoft.com for its current‑generation hardware portfolio," a Microsoft spokesperson told the site.</p><p>Here's how the new pricing breaks down across the Surface line-up.</p><div ><table><tbody><tr><td class="firstcol " ><p><strong>Device</strong></p></td><td  ><p><strong>Starting price (2025)</strong></p></td><td  ><p><strong>Starting price (2026)</strong></p></td></tr><tr><td class="firstcol " ><p>Surface Pro (13-inch)</p></td><td  ><p>$1,199</p></td><td  ><p>$1,499</p></td></tr><tr><td class="firstcol " ><p>Surface Pro (12-inch)</p></td><td  ><p>$799</p></td><td  ><p>$1,049</p></td></tr><tr><td class="firstcol " ><p>Surface Laptop (13-inch)</p></td><td  ><p>$899</p></td><td  ><p>$1,199</p></td></tr><tr><td class="firstcol " ><p>Surface Laptop (13.8-inch)</p></td><td  ><p>$1,199</p></td><td  ><p>$1,499</p></td></tr><tr><td class="firstcol " ><p>Surface Laptop (15-inch)</p></td><td  ><p>$1,499</p></td><td  ><p>$1,599</p></td></tr></tbody></table></div><p>These price increases make Microsoft's offerings even harder to recommend against the competition. If you were choosing between an entry-level 13-inch Surface Laptop or an entry-level 13-inch <a href="https://www.tomsguide.com/computing/macbooks/macbook-air-m5-review">MacBook Air M5</a>, you would have saved $200 by opting for Microsoft. Now, Apple's computer comes in $100 cheaper. And that's not even taking into account the $599 <a href="https://www.tomsguide.com/computing/macbooks/apple-macbook-neo-review">MacBook Neo</a>.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OanndX"></div>                            </div>                            <script src="https://kwizly.com/embed/OanndX.js" async></script><p>Finally, there have been some signs that costs of RAM have started to fall in recent weeks. Which makes Microsoft's decision not to try and weather the storm even more interesting. <a href="https://www.trendforce.com/news/2026/03/31/news-ddr5-retail-prices-pullback-amid-market-correction-but-industry-players-cite-stable-contract-trends/" target="_blank">Trendforce reported</a> that U.S. DDR5 RAM prices fell by over 20% in the last month.</p><p>It could be the case that Microsoft is attempting to set a new pricing benchmark with an eye on the upcoming Snapdragon X2 Plus-powered laptops coming in the future. Either way, the company says it remains "committed to delivering value to customers and partners while upholding our standards for quality and innovation.”</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/i-tested-google-fis-usd35-unlimited-data-plan-for-a-month-heres-my-pros-and-cons">I tested Google Fi’s $35 unlimited data plan for a month — here’s my pros and cons</a></li><li><a href="https://www.tomsguide.com/computing/macbooks/macbook-neo-inventory-has-reportedly-sold-out-what-you-need-to-know">MacBook Neo inventory has reportedly sold out — what you need to know</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-fold-delay-rumors-debunked-heres-why-a-september-release-window-seems-likely-after-all">iPhone Fold delay rumors debunked — here's why a September release window seems likely after all</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/laptops/microsoft-quietly-hiked-prices-on-all-its-surface-laptops-its-now-cheaper-to-buy-a-macbook-air</link>
                                                                            <description>
                            <![CDATA[ Microsoft has quietly hiked the prices of almost all of its Snapdragon-powered Surface devices as the RAM crisis continues to make tech even more expensive. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">rHVDRQgLFzWM7vvWDwEiqZ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/nQk8Y5QykafztgPUZocCGH-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 14 Apr 2026 11:07:24 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Laptops]]></category>
                                                    <category><![CDATA[Computing]]></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/nQk8Y5QykafztgPUZocCGH-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Microsoft Surface Pro 11 on a desk.]]></media:description>                                                            <media:text><![CDATA[Microsoft Surface Pro 11 on a desk.]]></media:text>
                                <media:title type="plain"><![CDATA[Microsoft Surface Pro 11 on a desk.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/nQk8Y5QykafztgPUZocCGH-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Microsoft has become the latest victim of the <a href="https://www.tomsguide.com/computing/hardware/the-squeeze-is-real-i-spoke-to-ram-crisis-oracle-carmen-li-about-when-this-nightmare-ends-heres-what-she-told-me">ongoing RAM crisis</a>, quietly hiking the prices on its consumer-facing Surface laptops by as much as $300. This shouldn't come as a surprise — after all, we've just seen the <a href="https://www.tomsguide.com/gaming/playstation/major-sony-ps5-price-hike-just-hit-all-models-heres-what-youll-pay-now">PlayStation 5 get even more expensive for the same reason</a>.</p><p>First picked up by the team at <a href="https://www.windowscentral.com/hardware/surface/microsoft-reveals-major-price-increases-for-all-surface-pro-laptop-pcs-as-ram-crisis-continues" target="_blank">Windows Central</a>, the price increases took effect at the Microsoft Store, with other retailers expected to follow suit. Just about every model is affected, and Windows Central notes that flagships like the <a href="https://www.tomsguide.com/tablets/surface-pro-11">Surface Pro 11</a> and <a href="https://www.tomsguide.com/computing/laptops/microsoft-surface-laptop-7-review">Surface Laptop 7</a> are now $500 more expensive than their initial launch price in 2024.</p><p>"Due to recent increases in memory and component costs, Surface is updating pricing on Microsoft.com for its current‑generation hardware portfolio," a Microsoft spokesperson told the site.</p><p>Here's how the new pricing breaks down across the Surface line-up.</p><div ><table><tbody><tr><td class="firstcol " ><p><strong>Device</strong></p></td><td  ><p><strong>Starting price (2025)</strong></p></td><td  ><p><strong>Starting price (2026)</strong></p></td></tr><tr><td class="firstcol " ><p>Surface Pro (13-inch)</p></td><td  ><p>$1,199</p></td><td  ><p>$1,499</p></td></tr><tr><td class="firstcol " ><p>Surface Pro (12-inch)</p></td><td  ><p>$799</p></td><td  ><p>$1,049</p></td></tr><tr><td class="firstcol " ><p>Surface Laptop (13-inch)</p></td><td  ><p>$899</p></td><td  ><p>$1,199</p></td></tr><tr><td class="firstcol " ><p>Surface Laptop (13.8-inch)</p></td><td  ><p>$1,199</p></td><td  ><p>$1,499</p></td></tr><tr><td class="firstcol " ><p>Surface Laptop (15-inch)</p></td><td  ><p>$1,499</p></td><td  ><p>$1,599</p></td></tr></tbody></table></div><p>These price increases make Microsoft's offerings even harder to recommend against the competition. If you were choosing between an entry-level 13-inch Surface Laptop or an entry-level 13-inch <a href="https://www.tomsguide.com/computing/macbooks/macbook-air-m5-review">MacBook Air M5</a>, you would have saved $200 by opting for Microsoft. Now, Apple's computer comes in $100 cheaper. And that's not even taking into account the $599 <a href="https://www.tomsguide.com/computing/macbooks/apple-macbook-neo-review">MacBook Neo</a>.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OanndX"></div>                            </div>                            <script src="https://kwizly.com/embed/OanndX.js" async></script><p>Finally, there have been some signs that costs of RAM have started to fall in recent weeks. Which makes Microsoft's decision not to try and weather the storm even more interesting. <a href="https://www.trendforce.com/news/2026/03/31/news-ddr5-retail-prices-pullback-amid-market-correction-but-industry-players-cite-stable-contract-trends/" target="_blank">Trendforce reported</a> that U.S. DDR5 RAM prices fell by over 20% in the last month.</p><p>It could be the case that Microsoft is attempting to set a new pricing benchmark with an eye on the upcoming Snapdragon X2 Plus-powered laptops coming in the future. Either way, the company says it remains "committed to delivering value to customers and partners while upholding our standards for quality and innovation.”</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/i-tested-google-fis-usd35-unlimited-data-plan-for-a-month-heres-my-pros-and-cons">I tested Google Fi’s $35 unlimited data plan for a month — here’s my pros and cons</a></li><li><a href="https://www.tomsguide.com/computing/macbooks/macbook-neo-inventory-has-reportedly-sold-out-what-you-need-to-know">MacBook Neo inventory has reportedly sold out — what you need to know</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-fold-delay-rumors-debunked-heres-why-a-september-release-window-seems-likely-after-all">iPhone Fold delay rumors debunked — here's why a September release window seems likely after all</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ This is the one feature I miss from a real keyboard when I type on my phone — luckily, I've found the best alternative ]]></title>
                                                                                                <dc:content><![CDATA[ <p>A huge chunk of my life involves typing, and despite all the years and experience I have at throwing keystrokes and words together, I am extremely bad at it. Well, it's not an issue of speed or proficiency, just that I have fairly clumsy hands and make a boat-load of mistakes in the process. </p><p>The severity of the mistakes depends on the kind of keyboard I'm using, too. Mechanical keyboards are the best, while <a href="https://www.tomsguide.com/features/i-miss-real-keyboards-on-phones-heres-why-they-deserve-a-comeback">touchscreen keyboards</a> are the absolute worst. Had it not been for autocorrect, the stuff I type on my phone would be totally incoherent. Actually, that still happens with autocorrect, because there are times when my typing is so appalling that it just gives up trying to figure out what I'm trying to say.</p><p>Touchscreen keyboards are not the easiest thing to self-correct with. Cursor control is possible, but there's significantly less finesse than you'd get with a physical keyboard, and it's all due to the lack of arrow keys. Some mobile keyboards do have options, but I find that none of them work quite as well as Microsoft's SwiftKey keyboard on the <a href="https://www.tomsguide.com/us/best-android-phones,review-6051.html">best Android phones</a>.</p><h2 id="the-alternative-isn-t-as-accurate">The alternative isn't as accurate</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:66.70%;"><img id="LPsa5YYYSPaJomkoecuS9" name="shutterstock_1197265021.jpg" alt="Image of a close up of the Gboard app icon on a phone screen" src="https://cdn.mos.cms.futurecdn.net/LPsa5YYYSPaJomkoecuS9.jpg" mos="" align="middle" fullscreen="" width="1000" height="667" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: OpturaDesign / Shutterstock)</span></figcaption></figure><p>By now, I imagine that most people will know all about the space bar cursor shortcut. It doesn't matter which phone you have or the keyboard you use; pressing and holding on the space bar lets you move the cursor left or right, depending on how you move your finger.</p><p>This option is great in a pinch, but it doesn't offer the same level of precision that you'd get from using a physical button. The same is true for tapping at the area you need the cursor to move to, since that offers even less precision and reliability than the gesture.</p><p>In fact, I'd place money on the little stubs we humans call fingers as the reason why such a gesture exists in the first place.</p><p>There are plenty of times when I find myself unable to sit at my desk and type on a keyboard. I have a 5-month old baby right now and, as is the case with a lot of babies, he's extremely clingy. I don't know if you've ever tried carrying 16.5 lbs of dead weight on your shoulder, while trying to type with the other hand, but I can promise you it isn't easy.</p><p>In these instances, my options are to either stop working and have to catch up later, or rely on my phone to get stuff done. Even though I often resort to dictation and GBoard's speech-to-text feature, I do need to go back and fix various spelling and grammatical mistakes along the way. </p><p>Doing that with the space bar gesture, or my particularly stubby digits, does not work very well. In fact, it's a lot more frustrating than simply trying to type one-handed - which is where SwiftKey's arrow keys come into play.</p><h2 id="all-the-benefits-of-real-arrow-keys-on-a-keyboard">All the benefits of real arrow keys, on a keyboard</h2><p>There are a couple of things I need to bring up quickly. First up is that SwiftKey only seems to offer arrow keys on Android devices. If you're using one of the <a href="https://www.tomsguide.com/us/best-apple-iphone,review-6348.html">best iPhones</a> or an iPad, then you're going to be completely out of luck. Secondly, I know that it's far from the only keyboard that offers some kind of arrow key-like functionality. </p><p>Various others, including <a href="https://www.tomsguide.com/computing/mobile-apps/google-gboard-redesign-has-already-angered-users-and-i-can-see-why">Gboard</a>, offer a specific arrow key menu that even includes some bonus features. But I don't find them nearly as convenient, especially not when I need to do some quick edits and fix my foolish mistakes before I lose my train of thought.</p><p>The thing I like about SwiftKey's arrow keys is that they're part of the main keyboard. It's an option you have to switch on, and it does mean your keyboard takes up even more screen space as a result, but it also means you don't have to go diving back and forth between menus and sub-menus to move the cursor around accurately.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jrPpPCgLiwbzzQe8ajprfk" name="TG Deals Template 2023 copy" alt="gboard arrow keys vs microsoft swiftkey" src="https://cdn.mos.cms.futurecdn.net/jrPpPCgLiwbzzQe8ajprfk.jpg" mos="" align="middle" fullscreen="" width="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>As you can see with Gboard, getting to the arrow keys is a two-part process. Tap the square menu and tap Text editing before you're actually able to control the cursor. Now imagine having to do that over and over, every time you needed to go back and change something. Whether it's a text message, a social media post, or if you're writing something a little more long-winded, the fact that SwiftKey's arrow keys are just there makes the process a whole lot simpler and faster. Or, that's how it's been in my experience, at least. </p><p>Though I will admit, Gboard's text select button is a very nice feature. My one real gripe with SwiftKey, aside from all the AI Microsoft has been shoveling into the app, is that selecting large portions of text is just as irritating as trying to move the cursor without arrow keys. Human fingers are not built for such fine control — especially not mine.</p><p>Then again, changing more than a couple of letters at a time is not something I do very often. If I really need to make more substantial changes, most Android phones make it super easy to switch keyboards at the tap of a button.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XrNYPX"></div>                            </div>                            <script src="https://kwizly.com/embed/XrNYPX.js" async></script><h2 id="bottom-line">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:1040px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="aZpFf7hQbBDYoZjBsgsHaf" name="SwiftKey Keyboard for Android.jpg" alt="SwiftKey Keyboard for Android screenshot." src="https://cdn.mos.cms.futurecdn.net/aZpFf7hQbBDYoZjBsgsHaf.jpg" mos="" align="middle" fullscreen="" width="1040" height="585" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>While touchscreens are great for a lot of things, typing certainly isn't one of them, which is a shame. I imagine it's rare that most people will go longer than a day without having to type something on their phone. It doesn't matter if you're the kind of person who writes long essays correcting people on Reddit, or if you prefer to keep things short and sweet; it's all typing in the end.</p><p>Having a feature that makes it easier to fix all the mistakes you'll be making removes a whole lot of frustration from the equation. Autocorrect has improved a lot over the years, especially if you opt for third-party keyboards, but it can't fix everything. The increased popularity of the word ducking since the invention of the iPhone is a testament to that.</p><p>Arrow keys exist on physical keyboards for a reason, and it's about time that mobile keyboards figured that out. Even the ones that already have don't make the process easy, and it ensures that Microsoft retains my keyboard loyalty until they do. Which is not something I ever thought I'd say, especially not after seeing what Microsoft did to Skype.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom’s Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/online-security/dont-call-that-number-dangerous-new-apple-pay-scam-tricks-victims-into-picking-up-their-iphones">Don’t call that number: Dangerous new Apple Pay scam tricks victims into picking up their iPhones</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-fold-may-not-arrive-with-that-name-after-all-make-way-for-iphone-ultra">iPhone Fold may not arrive with that name after all — make way for iPhone Ultra</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-18-rumor-hints-at-changes-to-dynamic-island-but-i-have-my-doubts-heres-why">iPhone 18 rumor hints at changes to Dynamic Island, but I have my doubts — here's why</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/android-phones/this-is-the-one-feature-i-miss-from-a-real-keyboard-when-i-type-on-my-phone-luckily-ive-found-the-best-alternative</link>
                                                                            <description>
                            <![CDATA[ Typing on a touchscreen has a lot of major problems, but the most notable weakness is the lack of arrow keys for cursor control. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">zDmbLaqk354P4ks384KTjL</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/BNjTVeJ4FGSEM8sRsYJDgA-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 13 Apr 2026 08:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Android Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/BNjTVeJ4FGSEM8sRsYJDgA-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[gboard app on android]]></media:description>                                                            <media:text><![CDATA[gboard app on android]]></media:text>
                                <media:title type="plain"><![CDATA[gboard app on android]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/BNjTVeJ4FGSEM8sRsYJDgA-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>A huge chunk of my life involves typing, and despite all the years and experience I have at throwing keystrokes and words together, I am extremely bad at it. Well, it's not an issue of speed or proficiency, just that I have fairly clumsy hands and make a boat-load of mistakes in the process. </p><p>The severity of the mistakes depends on the kind of keyboard I'm using, too. Mechanical keyboards are the best, while <a href="https://www.tomsguide.com/features/i-miss-real-keyboards-on-phones-heres-why-they-deserve-a-comeback">touchscreen keyboards</a> are the absolute worst. Had it not been for autocorrect, the stuff I type on my phone would be totally incoherent. Actually, that still happens with autocorrect, because there are times when my typing is so appalling that it just gives up trying to figure out what I'm trying to say.</p><p>Touchscreen keyboards are not the easiest thing to self-correct with. Cursor control is possible, but there's significantly less finesse than you'd get with a physical keyboard, and it's all due to the lack of arrow keys. Some mobile keyboards do have options, but I find that none of them work quite as well as Microsoft's SwiftKey keyboard on the <a href="https://www.tomsguide.com/us/best-android-phones,review-6051.html">best Android phones</a>.</p><h2 id="the-alternative-isn-t-as-accurate">The alternative isn't as accurate</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:66.70%;"><img id="LPsa5YYYSPaJomkoecuS9" name="shutterstock_1197265021.jpg" alt="Image of a close up of the Gboard app icon on a phone screen" src="https://cdn.mos.cms.futurecdn.net/LPsa5YYYSPaJomkoecuS9.jpg" mos="" align="middle" fullscreen="" width="1000" height="667" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: OpturaDesign / Shutterstock)</span></figcaption></figure><p>By now, I imagine that most people will know all about the space bar cursor shortcut. It doesn't matter which phone you have or the keyboard you use; pressing and holding on the space bar lets you move the cursor left or right, depending on how you move your finger.</p><p>This option is great in a pinch, but it doesn't offer the same level of precision that you'd get from using a physical button. The same is true for tapping at the area you need the cursor to move to, since that offers even less precision and reliability than the gesture.</p><p>In fact, I'd place money on the little stubs we humans call fingers as the reason why such a gesture exists in the first place.</p><p>There are plenty of times when I find myself unable to sit at my desk and type on a keyboard. I have a 5-month old baby right now and, as is the case with a lot of babies, he's extremely clingy. I don't know if you've ever tried carrying 16.5 lbs of dead weight on your shoulder, while trying to type with the other hand, but I can promise you it isn't easy.</p><p>In these instances, my options are to either stop working and have to catch up later, or rely on my phone to get stuff done. Even though I often resort to dictation and GBoard's speech-to-text feature, I do need to go back and fix various spelling and grammatical mistakes along the way. </p><p>Doing that with the space bar gesture, or my particularly stubby digits, does not work very well. In fact, it's a lot more frustrating than simply trying to type one-handed - which is where SwiftKey's arrow keys come into play.</p><h2 id="all-the-benefits-of-real-arrow-keys-on-a-keyboard">All the benefits of real arrow keys, on a keyboard</h2><p>There are a couple of things I need to bring up quickly. First up is that SwiftKey only seems to offer arrow keys on Android devices. If you're using one of the <a href="https://www.tomsguide.com/us/best-apple-iphone,review-6348.html">best iPhones</a> or an iPad, then you're going to be completely out of luck. Secondly, I know that it's far from the only keyboard that offers some kind of arrow key-like functionality. </p><p>Various others, including <a href="https://www.tomsguide.com/computing/mobile-apps/google-gboard-redesign-has-already-angered-users-and-i-can-see-why">Gboard</a>, offer a specific arrow key menu that even includes some bonus features. But I don't find them nearly as convenient, especially not when I need to do some quick edits and fix my foolish mistakes before I lose my train of thought.</p><p>The thing I like about SwiftKey's arrow keys is that they're part of the main keyboard. It's an option you have to switch on, and it does mean your keyboard takes up even more screen space as a result, but it also means you don't have to go diving back and forth between menus and sub-menus to move the cursor around accurately.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jrPpPCgLiwbzzQe8ajprfk" name="TG Deals Template 2023 copy" alt="gboard arrow keys vs microsoft swiftkey" src="https://cdn.mos.cms.futurecdn.net/jrPpPCgLiwbzzQe8ajprfk.jpg" mos="" align="middle" fullscreen="" width="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>As you can see with Gboard, getting to the arrow keys is a two-part process. Tap the square menu and tap Text editing before you're actually able to control the cursor. Now imagine having to do that over and over, every time you needed to go back and change something. Whether it's a text message, a social media post, or if you're writing something a little more long-winded, the fact that SwiftKey's arrow keys are just there makes the process a whole lot simpler and faster. Or, that's how it's been in my experience, at least. </p><p>Though I will admit, Gboard's text select button is a very nice feature. My one real gripe with SwiftKey, aside from all the AI Microsoft has been shoveling into the app, is that selecting large portions of text is just as irritating as trying to move the cursor without arrow keys. Human fingers are not built for such fine control — especially not mine.</p><p>Then again, changing more than a couple of letters at a time is not something I do very often. If I really need to make more substantial changes, most Android phones make it super easy to switch keyboards at the tap of a button.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XrNYPX"></div>                            </div>                            <script src="https://kwizly.com/embed/XrNYPX.js" async></script><h2 id="bottom-line">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:1040px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="aZpFf7hQbBDYoZjBsgsHaf" name="SwiftKey Keyboard for Android.jpg" alt="SwiftKey Keyboard for Android screenshot." src="https://cdn.mos.cms.futurecdn.net/aZpFf7hQbBDYoZjBsgsHaf.jpg" mos="" align="middle" fullscreen="" width="1040" height="585" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>While touchscreens are great for a lot of things, typing certainly isn't one of them, which is a shame. I imagine it's rare that most people will go longer than a day without having to type something on their phone. It doesn't matter if you're the kind of person who writes long essays correcting people on Reddit, or if you prefer to keep things short and sweet; it's all typing in the end.</p><p>Having a feature that makes it easier to fix all the mistakes you'll be making removes a whole lot of frustration from the equation. Autocorrect has improved a lot over the years, especially if you opt for third-party keyboards, but it can't fix everything. The increased popularity of the word ducking since the invention of the iPhone is a testament to that.</p><p>Arrow keys exist on physical keyboards for a reason, and it's about time that mobile keyboards figured that out. Even the ones that already have don't make the process easy, and it ensures that Microsoft retains my keyboard loyalty until they do. Which is not something I ever thought I'd say, especially not after seeing what Microsoft did to Skype.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom’s Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/online-security/dont-call-that-number-dangerous-new-apple-pay-scam-tricks-victims-into-picking-up-their-iphones">Don’t call that number: Dangerous new Apple Pay scam tricks victims into picking up their iPhones</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-fold-may-not-arrive-with-that-name-after-all-make-way-for-iphone-ultra">iPhone Fold may not arrive with that name after all — make way for iPhone Ultra</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-18-rumor-hints-at-changes-to-dynamic-island-but-i-have-my-doubts-heres-why">iPhone 18 rumor hints at changes to Dynamic Island, but I have my doubts — here's why</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Microsoft starts removing Copilot from Windows 11 — I’m saying that sarcastically because it's clearly just lip service ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Let’s be real. Nobody I know has anything good to say about Microsoft Copilot. Shoved down our throats in any way possible in Windows 11, it’s turned the OS into a bloated behemoth that consumes the very thing we’re all seeing get way more expensive — RAM. And for what? Some rewriting tools, AI image generation in Paint and a searchable visual timeline of everything you do that’s quite a security risk, which is all ignored by users.</p><p>So it’s fair to say that I got a little hyped when I saw the <a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-promises-windows-11-reset-new-focus-on-performance-reliability-and-reducing-unnecessary-copilot-ai">“commitment to Windows quality” blog</a>, which confirms a major update with reduced Copilot features and better efficiency. Microsoft listened…at least that’s what I thought. Because what we’re actually getting from the first signs of these changes is a simple rebranding. Copilot is still there — it’s just called something different.</p><h2 id="an-ai-wolf-in-sheep-s-clothing">An AI wolf in sheep’s clothing</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="L4fvJePjWfU8dLsesT8kRG" name="Copilot" alt="Copilot" src="https://cdn.mos.cms.futurecdn.net/L4fvJePjWfU8dLsesT8kRG.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Windows Latest)</span></figcaption></figure><p>As discovered by <a href="https://www.windowslatest.com/2026/04/09/microsoft-begins-removing-copilot-from-windows-11-starting-with-notepad-snipping-tool/" target="_blank">Windows Latest</a>, the Notepad app and Snipping Tool are the first signs of Microsoft starting to rollback Copilot in the latest Windows 11 Insider Preview. Copilot logos have disappeared from Notepad and the Snipping Tool.</p><p>But as is clearly apparent, this is mostly just branding only. Instead of a colorful Copilot button, Notepad gets a “Writing tools” icon, whereas the Snipping Tool is actually AI-free from the looks of it. Being someone who got tired of seeing Copilot everywhere, it’s definitely a welcome change. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1330px;"><p class="vanilla-image-block" style="padding-top:44.14%;"><img id="ZvgnjCyEHVioL2va4cskSG" name="Copilot" alt="Copilot" src="https://cdn.mos.cms.futurecdn.net/ZvgnjCyEHVioL2va4cskSG.jpg" mos="" align="middle" fullscreen="" width="1330" height="587" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Windows Latest)</span></figcaption></figure><p>Though, it does make me nervous that the idea of Microsoft being “intentional about how and where Copilot integrates across Windows” may be more like “let’s just hide it in plain sight.”</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:827px;"><p class="vanilla-image-block" style="padding-top:68.32%;"><img id="LhadVDXS5fLTkQvB7tAZCG" name="Copilot" alt="Copilot" src="https://cdn.mos.cms.futurecdn.net/LhadVDXS5fLTkQvB7tAZCG.png" mos="" align="middle" fullscreen="" width="827" height="565" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Windows Latest)</span></figcaption></figure><p>That’s not to say this Windows 11 commitment is for nothing. We could very well just be seeing a small slither of the wider changes that could reduce AI integration to only where (in Microsoft’s words) it’s “most meaningful, with craft and focus.” </p><p>But early updates do give us an indication of where Microsoft is thinking of going, and simply changing the presentation rather than removing unnecessary feature sets does not instill confidence here.</p><p>Taskbar customization, a faster File explorer and reduced Windows Updates disruption are all good things, but if Microsoft doesn’t genuinely hit the biggest performance consumer here, then we’re right back at square one — only looking prettier. I hope the company goes harder on the run up to Build 2026.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/pc-sales-are-up-but-dont-be-fooled-idc-report-warns-ramageddon-is-just-getting-started">PC sales are up, but don’t be fooled — IDC report warns RAMageddon is just getting started</a></li><li><a href="https://www.tomsguide.com/computing/laptops/i-was-high-on-the-asus-zenbook-a14-and-a16-with-snapdragon-x2-elite-then-something-very-weird-happened-to-the-price">I was high on the Asus Zenbook A14 and A16 with Snapdragon X2 Elite — then something very weird happened to the price</a></li><li><a href="https://www.tomsguide.com/computing/hardware/the-squeeze-is-real-i-spoke-to-ram-crisis-oracle-carmen-li-about-when-this-nightmare-ends-heres-what-she-told-me">‘The squeeze is real’: I spoke to RAM crisis oracle, Carmen Li, about when this nightmare ends — here’s what she told me</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/windows-operating-systems/microsoft-starts-removing-copilot-from-windows-11-im-saying-that-sarcastically-because-its-clearly-just-lip-service</link>
                                                                            <description>
                            <![CDATA[ Is Microsoft finally fixing Windows 11 bloat? The new "Commitment to Windows Quality" update starts rolls back Copilot branding in favor of "Writing Tools," but the RAM-hungry AI might just be hiding in plain sight. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">mwsgK3vYX5VBQnn87VsMmU</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/VLcVjMew2gSrxJdRihT7BH-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 10 Apr 2026 10:47:11 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Windows Operating Systems]]></category>
                                                    <category><![CDATA[Copilot]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Software]]></category>
                                                    <category><![CDATA[Operating Systems]]></category>
                                                    <category><![CDATA[AI]]></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/VLcVjMew2gSrxJdRihT7BH-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Copilot]]></media:description>                                                            <media:text><![CDATA[Copilot]]></media:text>
                                <media:title type="plain"><![CDATA[Copilot]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/VLcVjMew2gSrxJdRihT7BH-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Let’s be real. Nobody I know has anything good to say about Microsoft Copilot. Shoved down our throats in any way possible in Windows 11, it’s turned the OS into a bloated behemoth that consumes the very thing we’re all seeing get way more expensive — RAM. And for what? Some rewriting tools, AI image generation in Paint and a searchable visual timeline of everything you do that’s quite a security risk, which is all ignored by users.</p><p>So it’s fair to say that I got a little hyped when I saw the <a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-promises-windows-11-reset-new-focus-on-performance-reliability-and-reducing-unnecessary-copilot-ai">“commitment to Windows quality” blog</a>, which confirms a major update with reduced Copilot features and better efficiency. Microsoft listened…at least that’s what I thought. Because what we’re actually getting from the first signs of these changes is a simple rebranding. Copilot is still there — it’s just called something different.</p><h2 id="an-ai-wolf-in-sheep-s-clothing">An AI wolf in sheep’s clothing</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="L4fvJePjWfU8dLsesT8kRG" name="Copilot" alt="Copilot" src="https://cdn.mos.cms.futurecdn.net/L4fvJePjWfU8dLsesT8kRG.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Windows Latest)</span></figcaption></figure><p>As discovered by <a href="https://www.windowslatest.com/2026/04/09/microsoft-begins-removing-copilot-from-windows-11-starting-with-notepad-snipping-tool/" target="_blank">Windows Latest</a>, the Notepad app and Snipping Tool are the first signs of Microsoft starting to rollback Copilot in the latest Windows 11 Insider Preview. Copilot logos have disappeared from Notepad and the Snipping Tool.</p><p>But as is clearly apparent, this is mostly just branding only. Instead of a colorful Copilot button, Notepad gets a “Writing tools” icon, whereas the Snipping Tool is actually AI-free from the looks of it. Being someone who got tired of seeing Copilot everywhere, it’s definitely a welcome change. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1330px;"><p class="vanilla-image-block" style="padding-top:44.14%;"><img id="ZvgnjCyEHVioL2va4cskSG" name="Copilot" alt="Copilot" src="https://cdn.mos.cms.futurecdn.net/ZvgnjCyEHVioL2va4cskSG.jpg" mos="" align="middle" fullscreen="" width="1330" height="587" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Windows Latest)</span></figcaption></figure><p>Though, it does make me nervous that the idea of Microsoft being “intentional about how and where Copilot integrates across Windows” may be more like “let’s just hide it in plain sight.”</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:827px;"><p class="vanilla-image-block" style="padding-top:68.32%;"><img id="LhadVDXS5fLTkQvB7tAZCG" name="Copilot" alt="Copilot" src="https://cdn.mos.cms.futurecdn.net/LhadVDXS5fLTkQvB7tAZCG.png" mos="" align="middle" fullscreen="" width="827" height="565" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Windows Latest)</span></figcaption></figure><p>That’s not to say this Windows 11 commitment is for nothing. We could very well just be seeing a small slither of the wider changes that could reduce AI integration to only where (in Microsoft’s words) it’s “most meaningful, with craft and focus.” </p><p>But early updates do give us an indication of where Microsoft is thinking of going, and simply changing the presentation rather than removing unnecessary feature sets does not instill confidence here.</p><p>Taskbar customization, a faster File explorer and reduced Windows Updates disruption are all good things, but if Microsoft doesn’t genuinely hit the biggest performance consumer here, then we’re right back at square one — only looking prettier. I hope the company goes harder on the run up to Build 2026.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/pc-sales-are-up-but-dont-be-fooled-idc-report-warns-ramageddon-is-just-getting-started">PC sales are up, but don’t be fooled — IDC report warns RAMageddon is just getting started</a></li><li><a href="https://www.tomsguide.com/computing/laptops/i-was-high-on-the-asus-zenbook-a14-and-a16-with-snapdragon-x2-elite-then-something-very-weird-happened-to-the-price">I was high on the Asus Zenbook A14 and A16 with Snapdragon X2 Elite — then something very weird happened to the price</a></li><li><a href="https://www.tomsguide.com/computing/hardware/the-squeeze-is-real-i-spoke-to-ram-crisis-oracle-carmen-li-about-when-this-nightmare-ends-heres-what-she-told-me">‘The squeeze is real’: I spoke to RAM crisis oracle, Carmen Li, about when this nightmare ends — here’s what she told me</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Forget Apple, embrace your inner PC nerd with these Microsoft mastery challenges ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Apple has been pretty low-key about it, but the behemoth brand <a href="https://www.tomsguide.com/tag/apple-50th-anniversary">turned 50</a> this week. Just kidding, they threw some epic parties to celebrate. While Microsoft doesn't have a big milestone in the calendar (it already celebrated its own half-century last year), we didn't want it to feel left out, so have put together some challenges for you, Microsoft fans.</p><p>So whether your favorite era was Windows 98 with wobbly Word Art headings on every doc and the little paper clip guy offering a cheerful wave, or you're a slick Windows 11 upgrader (<a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-promises-windows-11-reset-new-focus-on-performance-reliability-and-reducing-unnecessary-copilot-ai">with or without Copilot</a>), take a moment to prove your PC prowess with the quizzes below, which we've built especially for you.</p><h2 class="article-body__section" id="section-microsoft-mastery-quiz"><span>Microsoft Mastery quiz</span></h2><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W01mkO"></div>                            </div>                            <script src="https://kwizly.com/embed/W01mkO.js" async></script><p>First up, take our multiple choice quiz to be crowned a Microsoft Master. I may have just given away the first answer in my introduction (oops), but there are nine more questions to stretch your brain cells. </p><p>Don't forget to register to save your score, reveal hints for any clues you're not sure of and secure your spot on the competitive Tom's Guide leaderboards. Good luck!</p><h2 class="article-body__section" id="section-windows-10-crossword"><span>Windows 10 crossword</span></h2><div style="min-height: 1005px;">                                <div class="kwizly-quiz kwizly-XpAN4e"></div>                            </div>                            <script src="https://kwizly.com/embed/XpAN4e.js" async></script><p>If the multiple choice quiz wasn't enough of a challenge, this crossword is a little more niche, in my opinion. I never knew the name of 9 down, so I've learned certainly something today!</p><a class="card card--standard card--rows-2 card--align-inline" href="https://www.tomsguide.com/play"><div class="card-image-widthsetter"><p class="vanilla-image-block"  style="padding-top:56.25%;"><img style="width: 100%" class="card__image" src="https://cdn.mos.cms.futurecdn.net/9dC8Z7BNysm3pR3EzeBqnX.jpg" alt="Screenshot of Tom's Guide puzzles and quizzes page"></p></div><div class="card__content"><h3 class="card__title">Tom's Guide games</h3><div class="card__description-wrapper"><div class="card__description"><p>Play multiple choice, lystery, word searches, crosswords and guess the number – can you reach the top of the leaderboard?</p></div></div></div></a><a class="card card--standard card--rows-2 card--align-inline" href="https://www.tomsguide.com/membership"><div class="card-image-widthsetter"><p class="vanilla-image-block"  style="padding-top:56.25%;"><img style="width: 100%" class="card__image" src="https://cdn.mos.cms.futurecdn.net/CtyBASsPQAuEKTsTEJu6YL.jpg" alt="A screenshot from the Tom's Guide website reading 'Everything you get as a member'"></p></div><div class="card__content"><h3 class="card__title">Tom's Guide Club</h3><div class="card__description-wrapper"><div class="card__description"><p>Join Tom’s Guide Club for free, to earn badges, talk to other members and Tom’s writers, get exclusive deals and more.</p></div></div></div></a><p>How did you do? Let us know what you think in the comments below — including any other games you'd love to see.</p><p>If you enjoyed this quiz, then check out our other <a href="https://www.tomsguide.com/play">puzzles and quizzes</a>. </p><p>And if you want to revel in Microsoft nostalgia a little longer, dive into <a href="https://www.tomsguide.com/computing/microsoft-turns-50-25-best-and-worst-moments">Microsoft turns 50: 25 best and worst moments.</a></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/gaming/forget-wordle-you-need-to-play-toms-guide-games-right-now">Forget Wordle, you need to play Tom's Guide games right now</a></li><li><a href="https://www.tomsguide.com/computing/windows-operating-systems/windows-10-upgrade-guide">Windows 10 End of Life guide: How to delay, avoid or survive the switch to Windows 11</a></li><li><a href="https://www.tomsguide.com/gaming/stop-doomscrolling-i-swapped-to-this-relaxing-virtual-hobby-and-my-stress-levels-plummeted">Stop doomscrolling — I swapped to this relaxing virtual hobby and my stress levels plummeted</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/forget-apple-embrace-your-inner-pc-nerd-with-these-microsoft-mastery-challenges</link>
                                                                            <description>
                            <![CDATA[ Think you're a Microsoft master? These 10 questions and crossword clues will put your expertise to the test ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">jiMdr3wS2nXs33YVwimnAd</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/3Pcn4Uu2rb4rJPkMffb5Mm-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 03 Apr 2026 12:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gaming]]></category>
                                                                                                <author><![CDATA[ ella.taylor@futurenet.com (Ella Taylor) ]]></author>                    <dc:creator><![CDATA[ Ella Taylor ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/W2nC7HFA6avQHdFNFbFPNa.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Ella is Tom’s Guide’s Engagement Editor, on a mission to get to know all about our readers, to help you with your burning questions, and to create an exciting mix of content that entices you to keep coming back to the site – whether you’re a regular reader or a &lt;a href=&quot;https://www.tomsguide.com/membership&quot;&gt;member&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;She has more than 15 years of editorial experience, graduating from Kingston University with a First Class Honours degree in Journalism in 2008. She has written for and edited magazines and websites, including fellow Future titles &lt;em&gt;TechRadar.com, CreativeBloq.com, Digital Camera magazine, NPhoto, BikeRadar.com, Mollie Makes&lt;/em&gt; and more. &lt;/p&gt;&lt;p&gt;Most recently, she was Managing Editor of &lt;em&gt;womanandhome.com&lt;/em&gt;, where she co-launched its &lt;a href=&quot;https://www.womanandhome.com/tag/quiz/&quot; target=&quot;_blank&quot;&gt;Quiz of the Day&lt;/a&gt; and led the charge for articles that actively asked readers for their views. Before that, she was Editor of professional photography website &lt;em&gt;canon-europe.com/pro&lt;/em&gt;, having worked her way up from Production Editor. As such, she&#039;s a stickler for fact-checking, has too many opinions about grammar and is easily excited by a beautiful photo.&lt;/p&gt;&lt;p&gt;A mum of two young children, she keeps fit by typically carrying at least one of them on her shoulders around the hilly streets of Bristol. When not chasing her sons around the play parks and soft plays of South West England and worshipping her three rescue cats, she&#039;s likely to be in the garden, steadily turning it from a neglected concrete jungle to a usable green space. She’s also finally embarking on a kitchen extension in May, so 2026 looks set to be a year of big home improvements and lots of builders’ tea.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/3Pcn4Uu2rb4rJPkMffb5Mm-1280-80.jpg">
                                                            <media:credit><![CDATA[Microsoft | Wachiwit/Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A split image shows Clippy from Windows beside a person pressing the Windows key on a PC keyboard]]></media:description>                                                            <media:text><![CDATA[A split image shows Clippy from Windows beside a person pressing the Windows key on a PC keyboard]]></media:text>
                                <media:title type="plain"><![CDATA[A split image shows Clippy from Windows beside a person pressing the Windows key on a PC keyboard]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/3Pcn4Uu2rb4rJPkMffb5Mm-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Apple has been pretty low-key about it, but the behemoth brand <a href="https://www.tomsguide.com/tag/apple-50th-anniversary">turned 50</a> this week. Just kidding, they threw some epic parties to celebrate. While Microsoft doesn't have a big milestone in the calendar (it already celebrated its own half-century last year), we didn't want it to feel left out, so have put together some challenges for you, Microsoft fans.</p><p>So whether your favorite era was Windows 98 with wobbly Word Art headings on every doc and the little paper clip guy offering a cheerful wave, or you're a slick Windows 11 upgrader (<a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-promises-windows-11-reset-new-focus-on-performance-reliability-and-reducing-unnecessary-copilot-ai">with or without Copilot</a>), take a moment to prove your PC prowess with the quizzes below, which we've built especially for you.</p><h2 class="article-body__section" id="section-microsoft-mastery-quiz"><span>Microsoft Mastery quiz</span></h2><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W01mkO"></div>                            </div>                            <script src="https://kwizly.com/embed/W01mkO.js" async></script><p>First up, take our multiple choice quiz to be crowned a Microsoft Master. I may have just given away the first answer in my introduction (oops), but there are nine more questions to stretch your brain cells. </p><p>Don't forget to register to save your score, reveal hints for any clues you're not sure of and secure your spot on the competitive Tom's Guide leaderboards. Good luck!</p><h2 class="article-body__section" id="section-windows-10-crossword"><span>Windows 10 crossword</span></h2><div style="min-height: 1005px;">                                <div class="kwizly-quiz kwizly-XpAN4e"></div>                            </div>                            <script src="https://kwizly.com/embed/XpAN4e.js" async></script><p>If the multiple choice quiz wasn't enough of a challenge, this crossword is a little more niche, in my opinion. I never knew the name of 9 down, so I've learned certainly something today!</p><a class="card card--standard card--rows-2 card--align-inline" href="https://www.tomsguide.com/play"><div class="card-image-widthsetter"><p class="vanilla-image-block"  style="padding-top:56.25%;"><img style="width: 100%" class="card__image" src="https://cdn.mos.cms.futurecdn.net/9dC8Z7BNysm3pR3EzeBqnX.jpg" alt="Screenshot of Tom's Guide puzzles and quizzes page"></p></div><div class="card__content"><h3 class="card__title">Tom's Guide games</h3><div class="card__description-wrapper"><div class="card__description"><p>Play multiple choice, lystery, word searches, crosswords and guess the number – can you reach the top of the leaderboard?</p></div></div></div></a><a class="card card--standard card--rows-2 card--align-inline" href="https://www.tomsguide.com/membership"><div class="card-image-widthsetter"><p class="vanilla-image-block"  style="padding-top:56.25%;"><img style="width: 100%" class="card__image" src="https://cdn.mos.cms.futurecdn.net/CtyBASsPQAuEKTsTEJu6YL.jpg" alt="A screenshot from the Tom's Guide website reading 'Everything you get as a member'"></p></div><div class="card__content"><h3 class="card__title">Tom's Guide Club</h3><div class="card__description-wrapper"><div class="card__description"><p>Join Tom’s Guide Club for free, to earn badges, talk to other members and Tom’s writers, get exclusive deals and more.</p></div></div></div></a><p>How did you do? Let us know what you think in the comments below — including any other games you'd love to see.</p><p>If you enjoyed this quiz, then check out our other <a href="https://www.tomsguide.com/play">puzzles and quizzes</a>. </p><p>And if you want to revel in Microsoft nostalgia a little longer, dive into <a href="https://www.tomsguide.com/computing/microsoft-turns-50-25-best-and-worst-moments">Microsoft turns 50: 25 best and worst moments.</a></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/gaming/forget-wordle-you-need-to-play-toms-guide-games-right-now">Forget Wordle, you need to play Tom's Guide games right now</a></li><li><a href="https://www.tomsguide.com/computing/windows-operating-systems/windows-10-upgrade-guide">Windows 10 End of Life guide: How to delay, avoid or survive the switch to Windows 11</a></li><li><a href="https://www.tomsguide.com/gaming/stop-doomscrolling-i-swapped-to-this-relaxing-virtual-hobby-and-my-stress-levels-plummeted">Stop doomscrolling — I swapped to this relaxing virtual hobby and my stress levels plummeted</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Microsoft promises Windows 11 reset: new focus on performance, reliability and 'reducing unnecessary Copilot' AI ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Since the beginning of the year, <a href="https://www.tomsguide.com/computing/windows-operating-systems/we-need-to-improve-windows-in-ways-that-are-meaningful-for-people-microsoft-is-urgently-trying-to-fix-windows-11-issues">Microsoft has been quietly promising</a> to improve Windows 11, even going so far as to refocus its engineers to resolve the "core issues" with the operating system. Today, Microsoft released a highly detailed <a href="https://blogs.windows.com/windows-insider/2026/03/20/our-commitment-to-windows-quality/" target="_blank">memo</a> committing to improving "performance, reliability, and craft."</p><p>Microsoft's executive vice president of Windows + Devices Pavan Davuluri wrote in the memo that the company had spent the last few months listening to those "who care deeply about Windows and want it better."</p><p>The memo outlines a broad plan with areas of focus that should start appearing in the April update. Davuluri says we should see "tangible progress" in preview builds throughout the rest of 2026.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W5rm3O"></div>                            </div>                            <script src="https://kwizly.com/embed/W5rm3O.js" async></script><p>Yes, based on this memo, we can expect a lot of changes, tackling everything from system performance to customization and some AI.</p><p>Davuluri says that everything announced today will be tested first by the Windows Insider community. Including a big redesign to its Feedback Hub to make it faster and easier to submit feedback on Windows 11.</p><p>"Thank you for holding us to a high standard. Windows is as much yours as it is ours," Pavan said.</p><h2 id="what-s-coming">What's coming?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1200px;"><p class="vanilla-image-block" style="padding-top:56.83%;"><img id="PQDoij7pbihTEcxmBY7ni4" name="Windows 11 screenshot.jpeg" alt="Windows 11" src="https://cdn.mos.cms.futurecdn.net/PQDoij7pbihTEcxmBY7ni4.jpeg" mos="" align="middle" fullscreen="" width="1200" height="682" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Albacore on Twitter)</span></figcaption></figure><p>We rarely get such a public commitment with specific types of changes. So, what is Microsoft committing to?</p><p>Initially, in April, the changes will start with the ability to reposition the taskbar to the top or sides of the screen and a reduction of Copilot integration in Windows apps like Photos, Notepad and the Snipping Tool. </p><p>Expect less disruptive Windows updates with “fewer automatic restarts and notifications." Plus, you'll get the ability to skip updates during initial device setup.</p><p>Microsoft is also planning to improve File Explorer in the first rounds of improvements. “Our first round of improvements will focus on a quicker launch experience, reduced flicker, smoother navigation and more reliable performance for everyday file tasks,” Davuluri promises.</p><p>After that, widgets in Windows 11 will get more personalization features and "quieter defaults."</p><p>Reliability and performance are two of the big promises with Microsoft promising to reduce the number of resources Windows consumes and "improving the baseline reliability." That includes what Davuluri calls craft with a focus on "raising the bar" on the overall usability of the Windows 11 experience. </p><p>In all, it's a broad list of fixes. I'm not certain it directly covers everything, including the annoying pop-ups demanding you use Edge or Bing or anything Copilot. You should read the full memo for all the promised fixes.</p><p>Still, Davuluri is promising a more nuanced approach to Copilot integration. This fits with a <a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-is-reportedly-pulling-back-on-stuffing-windows-11-with-ai-and-i-couldnt-be-happier">January report that Microsoft is pulling back</a> on stuffing Windows 11 with AI.</p><p>It's one of the few companies that actually seems to be stepping away from AI as everyone else bull rushes through the china shop to shove it in every piece of tech.</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/is-the-macbook-neo-as-good-as-a-budget-windows-laptop-here-are-our-lab-tested-results">We benchmarked the MacBook Neo vs Windows laptops — here's the truth</a></li><li><a href="https://www.tomsguide.com/computing/online-security/microsoft-confirms-copilot-bug-let-its-ai-read-sensitive-and-confidential-emails">Microsoft confirms Copilot bug let its AI read sensitive and confidential emails</a></li><li><a href="https://www.tomsguide.com/gaming/xbox/microsoft-reveals-new-details-on-its-project-helix-pc-console-hybrid-heres-all-the-latest-on-the-next-xbox">Microsoft reveals new details on its Project Helix PC-console hybrid: here's all the latest on the next Xbox</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/windows-operating-systems/microsoft-promises-windows-11-reset-new-focus-on-performance-reliability-and-reducing-unnecessary-copilot-ai</link>
                                                                            <description>
                            <![CDATA[ Microsoft is promising to fix Windows 11, here's how. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">U7oPc3mUkiqjxVQg8zqc3B</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/jdr3dH3puTGPu8RDs42kHQ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 20 Mar 2026 21:54:30 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Windows Operating Systems]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Software]]></category>
                                                    <category><![CDATA[Operating Systems]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ.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/jdr3dH3puTGPu8RDs42kHQ-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A Windows 11 laptop, demonstrating how to run Android apps on Windows 11]]></media:description>                                                            <media:text><![CDATA[A Windows 11 laptop, demonstrating how to run Android apps on Windows 11]]></media:text>
                                <media:title type="plain"><![CDATA[A Windows 11 laptop, demonstrating how to run Android apps on Windows 11]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/jdr3dH3puTGPu8RDs42kHQ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Since the beginning of the year, <a href="https://www.tomsguide.com/computing/windows-operating-systems/we-need-to-improve-windows-in-ways-that-are-meaningful-for-people-microsoft-is-urgently-trying-to-fix-windows-11-issues">Microsoft has been quietly promising</a> to improve Windows 11, even going so far as to refocus its engineers to resolve the "core issues" with the operating system. Today, Microsoft released a highly detailed <a href="https://blogs.windows.com/windows-insider/2026/03/20/our-commitment-to-windows-quality/" target="_blank">memo</a> committing to improving "performance, reliability, and craft."</p><p>Microsoft's executive vice president of Windows + Devices Pavan Davuluri wrote in the memo that the company had spent the last few months listening to those "who care deeply about Windows and want it better."</p><p>The memo outlines a broad plan with areas of focus that should start appearing in the April update. Davuluri says we should see "tangible progress" in preview builds throughout the rest of 2026.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W5rm3O"></div>                            </div>                            <script src="https://kwizly.com/embed/W5rm3O.js" async></script><p>Yes, based on this memo, we can expect a lot of changes, tackling everything from system performance to customization and some AI.</p><p>Davuluri says that everything announced today will be tested first by the Windows Insider community. Including a big redesign to its Feedback Hub to make it faster and easier to submit feedback on Windows 11.</p><p>"Thank you for holding us to a high standard. Windows is as much yours as it is ours," Pavan said.</p><h2 id="what-s-coming">What's coming?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1200px;"><p class="vanilla-image-block" style="padding-top:56.83%;"><img id="PQDoij7pbihTEcxmBY7ni4" name="Windows 11 screenshot.jpeg" alt="Windows 11" src="https://cdn.mos.cms.futurecdn.net/PQDoij7pbihTEcxmBY7ni4.jpeg" mos="" align="middle" fullscreen="" width="1200" height="682" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Albacore on Twitter)</span></figcaption></figure><p>We rarely get such a public commitment with specific types of changes. So, what is Microsoft committing to?</p><p>Initially, in April, the changes will start with the ability to reposition the taskbar to the top or sides of the screen and a reduction of Copilot integration in Windows apps like Photos, Notepad and the Snipping Tool. </p><p>Expect less disruptive Windows updates with “fewer automatic restarts and notifications." Plus, you'll get the ability to skip updates during initial device setup.</p><p>Microsoft is also planning to improve File Explorer in the first rounds of improvements. “Our first round of improvements will focus on a quicker launch experience, reduced flicker, smoother navigation and more reliable performance for everyday file tasks,” Davuluri promises.</p><p>After that, widgets in Windows 11 will get more personalization features and "quieter defaults."</p><p>Reliability and performance are two of the big promises with Microsoft promising to reduce the number of resources Windows consumes and "improving the baseline reliability." That includes what Davuluri calls craft with a focus on "raising the bar" on the overall usability of the Windows 11 experience. </p><p>In all, it's a broad list of fixes. I'm not certain it directly covers everything, including the annoying pop-ups demanding you use Edge or Bing or anything Copilot. You should read the full memo for all the promised fixes.</p><p>Still, Davuluri is promising a more nuanced approach to Copilot integration. This fits with a <a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-is-reportedly-pulling-back-on-stuffing-windows-11-with-ai-and-i-couldnt-be-happier">January report that Microsoft is pulling back</a> on stuffing Windows 11 with AI.</p><p>It's one of the few companies that actually seems to be stepping away from AI as everyone else bull rushes through the china shop to shove it in every piece of tech.</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/is-the-macbook-neo-as-good-as-a-budget-windows-laptop-here-are-our-lab-tested-results">We benchmarked the MacBook Neo vs Windows laptops — here's the truth</a></li><li><a href="https://www.tomsguide.com/computing/online-security/microsoft-confirms-copilot-bug-let-its-ai-read-sensitive-and-confidential-emails">Microsoft confirms Copilot bug let its AI read sensitive and confidential emails</a></li><li><a href="https://www.tomsguide.com/gaming/xbox/microsoft-reveals-new-details-on-its-project-helix-pc-console-hybrid-heres-all-the-latest-on-the-next-xbox">Microsoft reveals new details on its Project Helix PC-console hybrid: here's all the latest on the next Xbox</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Microsoft reveals new details on its Project Helix PC-console hybrid: here's all the latest on the next Xbox ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The annual Game Developers' Conference (GDC) is taking place this week in San Francisco. New Xbox CEO Asha Sharma promised last week that more details about<a href="https://www.tomsguide.com/gaming/xbox/next-xbox-will-play-your-xbox-and-pc-games-new-ceo-promises"> Project Helix</a>, the next Xbox, would be revealed at GDC and Microsoft did in fact provide some new details on the upcoming device.</p><p>Helix is meant to be a hybrid console-PC. During a talk titled "Building for the Future with Xbox" VP of Next Generation Jason Ronald explained what the hybrid means. Think of Helix as akin to Valve's <a href="https://www.tomsguide.com/gaming/valve-hope-to-ship-steam-machines-in-2026-but-memory-shortages-could-cause-delays">delayed Steam Machine</a> as it will play both PC games and Xbox ones. </p><p>Unsurprisingly, Helix will be <a href="https://www.tomsguide.com/gaming/xbox/amd-hinted-the-next-gen-xbox-could-launch-in-2027-heres-why-im-not-convinced">powered by AMD</a> featuring the company's next-gen upscaling, frame generation and ray tracing abilities thanks to a custom chip.</p><blockquote class="bluesky-embed" data-bluesky-uri="at://did:plc:gchnxhvicqmurphv5jkh5uhk/app.bsky.feed.post/3mgsfktotws2g" data-bluesky-cid="bafyreig323wsuw4injxih4yk2kpd3d3mrjd4gvehspnvftqeiixxkybv6e" cite="https://bsky.app/profile/haydendingman.bsky.social/post/3mgsfktotws2g"><p lang="en">Here's an overview of Project Helix features. Partnered with AMD, designed for the next generation of DirectX.</p>— @haydendingman.bsky.social (<a href="https://bsky.app/profile/did:plc:gchnxhvicqmurphv5jkh5uhk?ref_src=embed">@haydendingman.bsky.social.bsky.social</a>) <a href="https://bsky.app/profile/haydendingman.bsky.social/post/3mgsfktotws2g">2026-03-11T23:55:07.494Z</a></blockquote><p>"The days of people defining themselves as (console/PC/mobile gamer) don't really exist anymore," Ronald said in his presentation. "What we've really learned is as we look at it, PC is becoming an increasingly important part of the Xbox experience." </p><p>A summary of Ronald's speech was <a href="https://news.xbox.com/en-us/2026/03/11/project-helix-building-next-generation-of-xbox/">posted to the Xbox site</a>. </p><h2 id="we-maybe-waiting-awhile">We maybe waiting awhile</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NvJH2eGqFZwe2hTDM43dDF" name="Xbox Project Helix" alt="Xbox Project Helix" src="https://cdn.mos.cms.futurecdn.net/NvJH2eGqFZwe2hTDM43dDF.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Ronald announced that alpha versions of Helix wouldn't ship to developers until 2027. Which means we might not see the console actually launch until 2028 despite <a href="https://www.tomsguide.com/gaming/xbox/amd-hinted-the-next-gen-xbox-could-launch-in-2027-heres-why-im-not-convinced">hints at a 2027 reveal by AMD's Lisa Su</a>.</p><p>Other than an AMD chip and its hybrid nature, we don't know anything else about Helix at this time.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X74nde"></div>                            </div>                            <script src="https://kwizly.com/embed/X74nde.js" async></script><p>A pushed out launch window might actually help Xbox since the ongoing<a href="https://www.tomsguide.com/computing/ram-price-crisis-2026-everything-you-need-to-know"> memory shortage </a>isn't supposed to even begin resolving until 2028, at the earliest. By then, new factories should be handling the demand, assuming the AI bubble doesn't pop by then.</p><p>It's part of the reason Valve has delayed the Steam Machine and is struggling to maintain Steam Deck stock. At this rate, the Steam Machine and Xbox might launch around the same time and actually go head to head a la the battle Xbox used to have PlayStation.</p><h2 id="xbox-mode-for-windows">Xbox mode for Windows</h2><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="gXNsUtN9tWocRgJPBwNm8d" name="ROG Xbox Ally" alt="ROG Xbox Ally" src="https://cdn.mos.cms.futurecdn.net/gXNsUtN9tWocRgJPBwNm8d.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>Microsoft is apparently expanding its work on "Xbox Mode" for Windows PCs based around the work it did on the <a href="https://www.tomsguide.com/gaming/handheld-gaming/rog-xbox-ally-x-review">Asus Rog Xbox Ally X</a> handheld consoles. The goal is to optimize Windows 11 to like an Xbox console with reduced background processes and a prioritization of game performance. </p><p>This would include faster boot times, better controller support and improved frame stability.</p><p>"Xbox mode lets players seamlessly switch between productivity and play, with a familiar full screen and controller optimized Xbox experience while embracing the openness of Windows," Ronald said.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/gaming/xbox-isnt-dead-yet-heres-how-the-gaming-brand-can-make-a-comeback">Xbox isn’t dead yet — here’s how the gaming brand can make a comeback</a></li><li><a href="https://www.tomsguide.com/wellness/sleep/hybrid-mattresses-are-a-game-changer-for-a-good-nights-sleep-and-heres-how-to-pick-the-right-one">Hybrid mattresses are a game-changer for a good night's sleep, and here's how to pick the right one</a></li><li><a href="https://www.tomsguide.com/computing/microsoft-wont-stop-trying-to-make-edge-happen-now-its-coming-to-teams-but-there-is-a-quick-fix">Microsoft won’t stop trying to make Edge happen — now it’s coming to Teams, but there is a quick fix</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/xbox/microsoft-reveals-new-details-on-its-project-helix-pc-console-hybrid-heres-all-the-latest-on-the-next-xbox</link>
                                                                            <description>
                            <![CDATA[ Microsoft revealed more about Project Helix during GDC 2026. Here's what we know so far. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Q6pdJiCVD38uFJMTYFXYzV</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/aKPAQXv6svykbGDuRK5CgS-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 12 Mar 2026 00:01:19 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Xbox]]></category>
                                                    <category><![CDATA[Computing]]></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/aKPAQXv6svykbGDuRK5CgS-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Xbox Series X controller]]></media:description>                                                            <media:text><![CDATA[Xbox Series X controller]]></media:text>
                                <media:title type="plain"><![CDATA[Xbox Series X controller]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/aKPAQXv6svykbGDuRK5CgS-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The annual Game Developers' Conference (GDC) is taking place this week in San Francisco. New Xbox CEO Asha Sharma promised last week that more details about<a href="https://www.tomsguide.com/gaming/xbox/next-xbox-will-play-your-xbox-and-pc-games-new-ceo-promises"> Project Helix</a>, the next Xbox, would be revealed at GDC and Microsoft did in fact provide some new details on the upcoming device.</p><p>Helix is meant to be a hybrid console-PC. During a talk titled "Building for the Future with Xbox" VP of Next Generation Jason Ronald explained what the hybrid means. Think of Helix as akin to Valve's <a href="https://www.tomsguide.com/gaming/valve-hope-to-ship-steam-machines-in-2026-but-memory-shortages-could-cause-delays">delayed Steam Machine</a> as it will play both PC games and Xbox ones. </p><p>Unsurprisingly, Helix will be <a href="https://www.tomsguide.com/gaming/xbox/amd-hinted-the-next-gen-xbox-could-launch-in-2027-heres-why-im-not-convinced">powered by AMD</a> featuring the company's next-gen upscaling, frame generation and ray tracing abilities thanks to a custom chip.</p><blockquote class="bluesky-embed" data-bluesky-uri="at://did:plc:gchnxhvicqmurphv5jkh5uhk/app.bsky.feed.post/3mgsfktotws2g" data-bluesky-cid="bafyreig323wsuw4injxih4yk2kpd3d3mrjd4gvehspnvftqeiixxkybv6e" cite="https://bsky.app/profile/haydendingman.bsky.social/post/3mgsfktotws2g"><p lang="en">Here's an overview of Project Helix features. Partnered with AMD, designed for the next generation of DirectX.</p>— @haydendingman.bsky.social (<a href="https://bsky.app/profile/did:plc:gchnxhvicqmurphv5jkh5uhk?ref_src=embed">@haydendingman.bsky.social.bsky.social</a>) <a href="https://bsky.app/profile/haydendingman.bsky.social/post/3mgsfktotws2g">2026-03-11T23:55:07.494Z</a></blockquote><p>"The days of people defining themselves as (console/PC/mobile gamer) don't really exist anymore," Ronald said in his presentation. "What we've really learned is as we look at it, PC is becoming an increasingly important part of the Xbox experience." </p><p>A summary of Ronald's speech was <a href="https://news.xbox.com/en-us/2026/03/11/project-helix-building-next-generation-of-xbox/">posted to the Xbox site</a>. </p><h2 id="we-maybe-waiting-awhile">We maybe waiting awhile</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NvJH2eGqFZwe2hTDM43dDF" name="Xbox Project Helix" alt="Xbox Project Helix" src="https://cdn.mos.cms.futurecdn.net/NvJH2eGqFZwe2hTDM43dDF.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Ronald announced that alpha versions of Helix wouldn't ship to developers until 2027. Which means we might not see the console actually launch until 2028 despite <a href="https://www.tomsguide.com/gaming/xbox/amd-hinted-the-next-gen-xbox-could-launch-in-2027-heres-why-im-not-convinced">hints at a 2027 reveal by AMD's Lisa Su</a>.</p><p>Other than an AMD chip and its hybrid nature, we don't know anything else about Helix at this time.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X74nde"></div>                            </div>                            <script src="https://kwizly.com/embed/X74nde.js" async></script><p>A pushed out launch window might actually help Xbox since the ongoing<a href="https://www.tomsguide.com/computing/ram-price-crisis-2026-everything-you-need-to-know"> memory shortage </a>isn't supposed to even begin resolving until 2028, at the earliest. By then, new factories should be handling the demand, assuming the AI bubble doesn't pop by then.</p><p>It's part of the reason Valve has delayed the Steam Machine and is struggling to maintain Steam Deck stock. At this rate, the Steam Machine and Xbox might launch around the same time and actually go head to head a la the battle Xbox used to have PlayStation.</p><h2 id="xbox-mode-for-windows">Xbox mode for Windows</h2><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="gXNsUtN9tWocRgJPBwNm8d" name="ROG Xbox Ally" alt="ROG Xbox Ally" src="https://cdn.mos.cms.futurecdn.net/gXNsUtN9tWocRgJPBwNm8d.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>Microsoft is apparently expanding its work on "Xbox Mode" for Windows PCs based around the work it did on the <a href="https://www.tomsguide.com/gaming/handheld-gaming/rog-xbox-ally-x-review">Asus Rog Xbox Ally X</a> handheld consoles. The goal is to optimize Windows 11 to like an Xbox console with reduced background processes and a prioritization of game performance. </p><p>This would include faster boot times, better controller support and improved frame stability.</p><p>"Xbox mode lets players seamlessly switch between productivity and play, with a familiar full screen and controller optimized Xbox experience while embracing the openness of Windows," Ronald said.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/gaming/xbox-isnt-dead-yet-heres-how-the-gaming-brand-can-make-a-comeback">Xbox isn’t dead yet — here’s how the gaming brand can make a comeback</a></li><li><a href="https://www.tomsguide.com/wellness/sleep/hybrid-mattresses-are-a-game-changer-for-a-good-nights-sleep-and-heres-how-to-pick-the-right-one">Hybrid mattresses are a game-changer for a good night's sleep, and here's how to pick the right one</a></li><li><a href="https://www.tomsguide.com/computing/microsoft-wont-stop-trying-to-make-edge-happen-now-its-coming-to-teams-but-there-is-a-quick-fix">Microsoft won’t stop trying to make Edge happen — now it’s coming to Teams, but there is a quick fix</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The next Xbox console is Project Helix and it will 'play your Xbox and PC games,' new CEO promises ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Xbox's new CEO Asha Sharma has a tough job ahead as she tries to revive the 25-year old gaming brand, or as some on the internet believe, lead it gently into the good night.</p><p>After trying to prove her gaming bona fides to the unwashed masses of X, <a href="https://x.com/asha_shar/status/2029645713962156149" target="_blank">Sharma has confirmed</a> the next-generation Xbox is in the works with a codename, Project Helix.</p><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2029645713962156149"><p lang="en" dir="ltr">Great start to the morning with Team Xbox, where we talked about our commitment to the return of Xbox including Project Helix, the code name for our next generation console.Project Helix will lead in performance and play your Xbox and PC games. Looking forward to chatting about… pic.twitter.com/Xx5rpVnAZI<a href="https://twitter.com/cantworkitout/status/2029645713962156149">March 5, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>"Project Helix will lead in performance and play your Xbox and PC games," Sharma wrote on X. She added that she'll be discussing the console with partners and studios at GDC this month. Potentially, more details could be revealed to us then.</p><p>Sharma's post seems to confirm the rumors that Xbox is working on a <a href="https://www.tomsguide.com/gaming/xbox/microsoft-tipped-to-potentially-unveil-an-xbox-pc-later-this-year-what-we-know">hybrid console/PC</a>. Previous rumors have suggested that Xbox will reveal its new console before the end of 2026. It's also possible the company could unveil an Xbox PC. </p><p>Previous Xbox president, Sarah Bond, hinted that the next Xbox console would be a "very premium, very high-end curated experience."</p><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2029646886408515623"><p lang="en" dir="ltr">The next generation of Xbox console: Project Helix pic.twitter.com/YQUrCgCb9J<a href="https://twitter.com/cantworkitout/status/2029646886408515623">March 5, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>Sharma just took over the gaming division at Microsoft after longtime Xbox head <a href="https://www.tomsguide.com/gaming/xbox/end-of-an-era-xboxs-ceo-phil-spencer-is-officially-retiring-next-week">Phil Spencer retired</a>. It'll be interesting to see if she is pivoting away from the projects Spencer and Bond were working on, or if she'll stay the course based on what's already available.</p><p>Sharma has <a href="https://www.tomsguide.com/gaming/xbox/xboxs-asha-sharma-promises-the-return-of-xbox-and-a-distinct-point-of-view-in-new-interview">described herself as a "platform builder"</a> in an interview, and she is committed to "being grounded in what the community is telling us."</p><p>Over the summer, a<a href="https://www.tomsguide.com/gaming/xbox/is-the-console-war-over-next-gen-xbox-could-be-aiming-at-pcs-not-ps6"> leaked "Magnus APU"</a> suggested Microsoft was working on an upgradeable console that would get more frequent updates than your usual seven-year console lifecycle. Basically, the leak hinted that the next Xbox would be more akin to a pre-built PC.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X74nde"></div>                            </div>                            <script src="https://kwizly.com/embed/X74nde.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/nintendo/nintendo-switch-2-is-under-threat-from-soaring-prices-for-data-storage-as-owners-buy-fewer-games-new-report-says">Nintendo Switch 2 is ‘under threat from soaring prices for data storage’ as owners buy fewer games, new report says</a></li><li><a href="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">I wore Razer’s Project Motoko AI gaming headset — and I’m not sure real life is supposed to have cheat codes like this</a></li><li><a href="https://www.tomsguide.com/gaming/nintendo/pokemons-30th-anniversary-has-destroyed-my-bank-balance-but-these-9-tried-and-tested-products-are-excellent-ways-to-celebrate-pikachu-and-friends">Pokémon day has destroyed my bank balance, but these 9 tried and tested products are excellent ways to celebrate Pikachu and friends</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/xbox/next-xbox-will-play-your-xbox-and-pc-games-new-ceo-promises</link>
                                                                            <description>
                            <![CDATA[ Xbox's new CEO, Asha Sharma, teased the next Xbox console with the codename "Project Helix." ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Ahr3sF4b9yii987EXDMQ69</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/NvJH2eGqFZwe2hTDM43dDF-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 05 Mar 2026 21:07:59 +0000</pubDate>                                                                                                                                <updated>Thu, 05 Mar 2026 21:13:04 +0000</updated>
                                                                                                                                            <category><![CDATA[Xbox]]></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/NvJH2eGqFZwe2hTDM43dDF-1280-80.jpg">
                                                            <media:credit><![CDATA[Microsoft]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Xbox Project Helix]]></media:description>                                                            <media:text><![CDATA[Xbox Project Helix]]></media:text>
                                <media:title type="plain"><![CDATA[Xbox Project Helix]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/NvJH2eGqFZwe2hTDM43dDF-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Xbox's new CEO Asha Sharma has a tough job ahead as she tries to revive the 25-year old gaming brand, or as some on the internet believe, lead it gently into the good night.</p><p>After trying to prove her gaming bona fides to the unwashed masses of X, <a href="https://x.com/asha_shar/status/2029645713962156149" target="_blank">Sharma has confirmed</a> the next-generation Xbox is in the works with a codename, Project Helix.</p><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2029645713962156149"><p lang="en" dir="ltr">Great start to the morning with Team Xbox, where we talked about our commitment to the return of Xbox including Project Helix, the code name for our next generation console.Project Helix will lead in performance and play your Xbox and PC games. Looking forward to chatting about… pic.twitter.com/Xx5rpVnAZI<a href="https://twitter.com/cantworkitout/status/2029645713962156149">March 5, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>"Project Helix will lead in performance and play your Xbox and PC games," Sharma wrote on X. She added that she'll be discussing the console with partners and studios at GDC this month. Potentially, more details could be revealed to us then.</p><p>Sharma's post seems to confirm the rumors that Xbox is working on a <a href="https://www.tomsguide.com/gaming/xbox/microsoft-tipped-to-potentially-unveil-an-xbox-pc-later-this-year-what-we-know">hybrid console/PC</a>. Previous rumors have suggested that Xbox will reveal its new console before the end of 2026. It's also possible the company could unveil an Xbox PC. </p><p>Previous Xbox president, Sarah Bond, hinted that the next Xbox console would be a "very premium, very high-end curated experience."</p><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2029646886408515623"><p lang="en" dir="ltr">The next generation of Xbox console: Project Helix pic.twitter.com/YQUrCgCb9J<a href="https://twitter.com/cantworkitout/status/2029646886408515623">March 5, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>Sharma just took over the gaming division at Microsoft after longtime Xbox head <a href="https://www.tomsguide.com/gaming/xbox/end-of-an-era-xboxs-ceo-phil-spencer-is-officially-retiring-next-week">Phil Spencer retired</a>. It'll be interesting to see if she is pivoting away from the projects Spencer and Bond were working on, or if she'll stay the course based on what's already available.</p><p>Sharma has <a href="https://www.tomsguide.com/gaming/xbox/xboxs-asha-sharma-promises-the-return-of-xbox-and-a-distinct-point-of-view-in-new-interview">described herself as a "platform builder"</a> in an interview, and she is committed to "being grounded in what the community is telling us."</p><p>Over the summer, a<a href="https://www.tomsguide.com/gaming/xbox/is-the-console-war-over-next-gen-xbox-could-be-aiming-at-pcs-not-ps6"> leaked "Magnus APU"</a> suggested Microsoft was working on an upgradeable console that would get more frequent updates than your usual seven-year console lifecycle. Basically, the leak hinted that the next Xbox would be more akin to a pre-built PC.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X74nde"></div>                            </div>                            <script src="https://kwizly.com/embed/X74nde.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/nintendo/nintendo-switch-2-is-under-threat-from-soaring-prices-for-data-storage-as-owners-buy-fewer-games-new-report-says">Nintendo Switch 2 is ‘under threat from soaring prices for data storage’ as owners buy fewer games, new report says</a></li><li><a href="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">I wore Razer’s Project Motoko AI gaming headset — and I’m not sure real life is supposed to have cheat codes like this</a></li><li><a href="https://www.tomsguide.com/gaming/nintendo/pokemons-30th-anniversary-has-destroyed-my-bank-balance-but-these-9-tried-and-tested-products-are-excellent-ways-to-celebrate-pikachu-and-friends">Pokémon day has destroyed my bank balance, but these 9 tried and tested products are excellent ways to celebrate Pikachu and friends</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Xbox isn’t dead yet — here’s how the gaming brand can make a comeback ]]></title>
                                                                                                <dc:content><![CDATA[ <p>In case you’ve missed the news, <a href="https://www.tomsguide.com/gaming/xbox/end-of-an-era-xboxs-ceo-phil-spencer-is-officially-retiring-next-week">Phil Spencer has retired from Xbox</a>, and Sarah Bond has departed. <a href="https://www.tomsguide.com/gaming/xbox/xboxs-asha-sharma-promises-the-return-of-xbox-and-a-distinct-point-of-view-in-new-interview">New CEO Asha Sharma</a> and freshly minted Chief Content Officer Matt Booty will now run Microsoft Gaming. It’s a huge shakeup, to say the least.</p><p>While this news is shocking (gotta love that late Friday news dump!), I can’t say I’m totally surprised. The Xbox brand has been in a slow-motion decline since the Xbox One’s announcement in 2013. Who can forget the always-online disaster, the Kinect fiasco, and the $399 PS4 memes?</p><p>And now the Series X/S has sold roughly <a href="https://www.purexbox.com/news/2025/12/latest-sales-estimates-suggest-xbox-sold-over-two-million-series-xs-consoles-in-2025" target="_blank">35 million units to date</a>, compared with the <a href="https://www.gematsu.com/2026/02/ps5-shipments-top-92-2-million" target="_blank">PS5’s 92+ million</a> and the original <a href="https://www.bbc.com/news/articles/ckglk543x3go" target="_blank">Switch’s 155 million</a>. In 2025, <a href="https://www.ign.com/articles/xbox-hardware-revenue-has-been-dropping-for-two-years-straight" target="_blank">Xbox console sales saw a brutal 45% drop</a> from the previous year. Though content and services like <a href="https://www.tomsguide.com/news/xbox-game-pass">Xbox Game Pass</a> keep the lights on, hardware is tanking.</p><p>With new leadership at the helm, now is the time for the Xbox brand to take bold steps to ensure a viable future. Here’s how the Xbox brand can survive and thrive in the coming years.</p><h2 id="embrace-being-a-third-party-developer">Embrace being a third-party developer</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="t5TDnrSHzKCojj3a8efWW4" name="xbox-live-gold-promo-image-microsoft.jpg" alt="A promo image for Xbox Live Gold showing four people playing video games on a couch" src="https://cdn.mos.cms.futurecdn.net/t5TDnrSHzKCojj3a8efWW4.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>The console business clearly isn’t working for Microsoft and hasn’t for well over a decade. The days of the Xbox 360’s dominance are in the distant past, a fact that’s abundantly clear in 2026. Though Microsoft is working on a next-gen system (as <a href="https://mashable.com/article/former-xbox-president-sarah-bond-breaks-silence-after-exit" target="_blank">Sarah Bond stated in her farewell message to the team</a>), that system (the <a href="https://www.tomsguide.com/gaming/xbox/is-the-console-war-over-next-gen-xbox-could-be-aiming-at-pcs-not-ps6">rumored PC-like Project Magnus</a>) shouldn’t be the focus for the company.</p><p>Right now, <a href="https://blogs.microsoft.com/on-the-issues/2024/10/15/one-year-activision-blizzard/#:~:text=Microsoft%20365-,One%20year%20on:%20Microsoft's%20acquisition%20of%20Activision%20Blizzard,fueling%20gaming%20innovation%20and%20competition&text=A%20year%20and%20two%20days,on%20this%20work%20moving%20forward." target="_blank"><u>Microsoft is already the biggest third-party publisher in gaming</u></a>. Between Xbox Game Studios, Bethesda, Activision Blizzard, and a slew of others, the company owns dozens of studios. With such a huge army of developers, you don’t need dedicated hardware to sell games. You can sell them on other platforms.</p><p>Going from hardware manufacturer to purely software developer wouldn’t be unheard of, either — just look at Sega. After the Dreamcast flopped, Nintendo’s former rival pulled the plug on hardware in 2001 and went full third-party. Though the transition wasn’t exactly smooth, the move benefited Sega over time. Sega stopped the bleeding, focused on delivering excellent games for all systems, and is currently one of the most respected and beloved developers in the industry.</p><p>There’s absolutely no reason why Xbox can’t do the same. The company doesn’t need to release another system with a confusing name for folks to play its games. As it’s already doing, it should keep releasing on <a href="https://www.tomsguide.com/reviews/ps5">PS5</a>, PC, <a href="https://www.tomsguide.com/gaming/nintendo/ive-spent-24-hours-with-the-nintendo-switch-2-for-review-heres-5-things-i-love-and-2-things-i-dont">Nintendo Switch 2</a>, and wherever else it makes sense. Focus on making awesome games and let Game Pass be the subscription hook (more on that shortly). This way, the Xbox brand can finally become the true multiplatform powerhouse Microsoft has always wanted it to be.</p><h2 id="quality-over-quantity">Quality over quantity</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="K3EnX2DPWRtYVqP4X2ehxe" name="best_PC_games_Forza_Horizon_5.jpg" alt="Forza Horizon 5" src="https://cdn.mos.cms.futurecdn.net/K3EnX2DPWRtYVqP4X2ehxe.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Xbox Game Studios)</span></figcaption></figure><p>Though plenty of games land on Game Pass, few of them make a significant impact with gamers. Despite having a legion of AAA studios, actual blockbuster titles can sometimes feel few and far between. We see more headlines about layoffs, cancellations, and delayed projects than we do about must-play releases.</p><p>To fix that, Microsoft must do a better job of curating its output and enforcing faster, more reliable development cycles for its heavy hitters. There’s no reason players should have to wait the better part of a decade for new installments of bedrock franchises like Halo, Gears of War, and Forza. The company needs to find the right balance between quality and timely releases for the games that actually define Xbox.</p><p>The same standard should apply to the rest of the mid-tier and indie portfolio. With so many teams, there’s no excuse for inconsistent output, but that output also can’t be filler just to pad Game Pass day-one slates. Even if it means fewer releases overall, true quality titles will win players back over time. That’s how you rebuild trust and turn folks into loyal subscribers.</p><h2 id="expand-game-pass">Expand Game Pass</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1739px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="LjjE6UXJs4nK6SNf3r3vfR" name="TG_Xbox-Xcloud.jpg" alt="Xbox Cloud gaming" src="https://cdn.mos.cms.futurecdn.net/LjjE6UXJs4nK6SNf3r3vfR.jpg" mos="" align="middle" fullscreen="" width="1739" height="978" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>I’m sure some of you are wondering what the point of Game Pass is without dedicated hardware. While the subscription service has certainly been a big reason to buy an Xbox console, it doesn’t have to live primarily on the company’s hardware. Given the poor sales of Xbox, Game Pass shouldn’t be tied to it. In fact, the subscription service can thrive outside of Xbox.</p><p>And you don’t even have to imagine this scenario. You can already stream hundreds of titles via the <a href="https://www.xbox.com/en-US/xbox-on-tvs" target="_blank"><u>Xbox app on Samsung and LG smart TVs</u></a>, <a href="https://www.pcmag.com/news/some-amazon-fire-smart-tvs-now-let-you-play-xbox-games"><u>Amazon Fire TV devices</u></a>, and more. Going further, Microsoft should strike aggressive partnerships for native apps on Roku, Apple TV, every major phone carrier (bundled data plans, anyone?), and every TV manufacturer on the planet. Make Game Pass the true Netflix of gaming.</p><p>It can also become the ultimate first-party destination: day-one releases from every major Microsoft-owned studio, plus the full back catalog of legacy Xbox, Xbox 360, and original Xbox games. With that massive library, Game Pass wouldn’t need third-party day-ones from the likes of Capcom or Square Enix. Think of it like a good version of EA Play or Ubisoft+ that you actually want to subscribe to.</p><p>To address the elephant in the room, this would also mean bringing Game Pass to PlayStation and Nintendo systems. That would ultimately be up to Sony and Nintendo to approve, but if the service only features Xbox-owned titles (which players could still buy individually on those storefronts), I don’t see a strong reason for them to object, especially since EA Play and Ubisoft+ are already available on PS5. That said, I wouldn’t hold my breath for Nintendo to play ball.</p><h2 id="set-realistic-expectations">Set realistic expectations</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:66.67%;"><img id="4TEfwqu9hSy4uToJ2pRoDT" name="asha-sharma-matt-booty" alt="Asha Sharma, Xbox CEO" src="https://cdn.mos.cms.futurecdn.net/4TEfwqu9hSy4uToJ2pRoDT.jpg" mos="" align="middle" fullscreen="" width="1920" height="1280" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Xbox’s communication isn’t bad. We’re generally not left in the dark about what’s in the pipeline. That said, it could still use some serious restructuring to keep players informed and excited without the usual drama.</p><p>Though the company has improved over the years, we need to see an end to the overhype. Aaron Greenberg and the old hype machine loved promising the moon only to underdeliver. The new regime needs to get fans excited for what’s actually coming without setting itself up for backlash when plans change.</p><p>Games shouldn’t be announced years before they’re ready. Want an example? Look no further than Perfect Dark, announced in 2020, hyped for half a decade, <a href="https://www.vice.com/en/article/xboxs-cancelled-perfect-dark-reboot-just-had-concept-art-and-details-leak-online/" target="_blank"><u>and then completely cancelled in 2025 along with its entire studio</u></a>. If a delay is coming, say it early instead of stringing people along.</p><p>This last point is controversial but important: Xbox needs to let fans understand the company is not their friend. I’m all for open communication and more fan-centric events to keep people invested, but execs hopping on social media and acting like your buddy is cringey as hell. It has fostered some genuinely toxic parasocial relationships on social media. Like Sony and Nintendo, let fans feel welcome without the fake intimacy that breeds toxicity when expectations aren’t met.</p><h2 id="outlook-4">Outlook</h2><p>Xbox isn’t in great shape today, but that doesn’t mean the 25-year-old brand is finished. With Asha Sharma’s experience as a platform builder and fresh perspective, now is the perfect time for Microsoft to take the drastic measures required to make Xbox thrive again.</p><p>Sega came back stronger after it abandoned hardware, and I don’t see why Xbox can’t follow suit. The brand can absolutely prosper without a dedicated plastic box in your living room. The console wars are over and there's no reason for Xbox to continue focusing on hardware. Microsoft can become the ultimate third-party publisher that also offers the ultimate gaming subscription service. </p><p>While that might sound absurd or even blasphemous, I think this is the best course for Xbox. After all, Microsoft is and always has been a software-first company. If it can follow through, Xbox won’t be relegated to the landfill of gaming history. By focusing on software and putting it everywhere, Xbox might just pull off the greatest comeback story in gaming.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X74nde"></div>                            </div>                            <script src="https://kwizly.com/embed/X74nde.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/hardware/europes-ddr5-prices-are-finally-falling-the-glimmer-of-hope-weve-been-waiting-for">Europe’s DDR5 prices are finally falling — the glimmer of hope we’ve been waiting for</a></li><li><a href="https://www.tomsguide.com/gaming/handheld-gaming/cant-find-a-steam-deck-here-are-3-handhelds-you-can-buy-right-now">Can’t find a Steam Deck? Here are 3 handhelds you can buy right now</a></li><li><a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-tested-the-razer-raiju-v3-pro-for-a-week-heres-why-its-the-best-ps5-pro-controller">I tested the Razer Raiju V3 Pro for a week — here’s why it’s the best PS5 'pro' controller</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/xbox-isnt-dead-yet-heres-how-the-gaming-brand-can-make-a-comeback</link>
                                                                            <description>
                            <![CDATA[ With a new CEO at the helm, Xbox has a new chance to reinvent itself and remain competitive. Here are some of the steps it can take to survive. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">6zPg4egBpzfFyxajqZoPRo</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/MuHXJCguraXv9UiUQoHsBo-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 25 Feb 2026 12:30:00 +0000</pubDate>                                                                                                                                                                                                                                <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/MuHXJCguraXv9UiUQoHsBo-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Xbox Game Pass cloud gaming titles shown Xbox controller and Xbox Series X titles]]></media:description>                                                            <media:text><![CDATA[Xbox Game Pass cloud gaming titles shown Xbox controller and Xbox Series X titles]]></media:text>
                                <media:title type="plain"><![CDATA[Xbox Game Pass cloud gaming titles shown Xbox controller and Xbox Series X titles]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/MuHXJCguraXv9UiUQoHsBo-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>In case you’ve missed the news, <a href="https://www.tomsguide.com/gaming/xbox/end-of-an-era-xboxs-ceo-phil-spencer-is-officially-retiring-next-week">Phil Spencer has retired from Xbox</a>, and Sarah Bond has departed. <a href="https://www.tomsguide.com/gaming/xbox/xboxs-asha-sharma-promises-the-return-of-xbox-and-a-distinct-point-of-view-in-new-interview">New CEO Asha Sharma</a> and freshly minted Chief Content Officer Matt Booty will now run Microsoft Gaming. It’s a huge shakeup, to say the least.</p><p>While this news is shocking (gotta love that late Friday news dump!), I can’t say I’m totally surprised. The Xbox brand has been in a slow-motion decline since the Xbox One’s announcement in 2013. Who can forget the always-online disaster, the Kinect fiasco, and the $399 PS4 memes?</p><p>And now the Series X/S has sold roughly <a href="https://www.purexbox.com/news/2025/12/latest-sales-estimates-suggest-xbox-sold-over-two-million-series-xs-consoles-in-2025" target="_blank">35 million units to date</a>, compared with the <a href="https://www.gematsu.com/2026/02/ps5-shipments-top-92-2-million" target="_blank">PS5’s 92+ million</a> and the original <a href="https://www.bbc.com/news/articles/ckglk543x3go" target="_blank">Switch’s 155 million</a>. In 2025, <a href="https://www.ign.com/articles/xbox-hardware-revenue-has-been-dropping-for-two-years-straight" target="_blank">Xbox console sales saw a brutal 45% drop</a> from the previous year. Though content and services like <a href="https://www.tomsguide.com/news/xbox-game-pass">Xbox Game Pass</a> keep the lights on, hardware is tanking.</p><p>With new leadership at the helm, now is the time for the Xbox brand to take bold steps to ensure a viable future. Here’s how the Xbox brand can survive and thrive in the coming years.</p><h2 id="embrace-being-a-third-party-developer">Embrace being a third-party developer</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="t5TDnrSHzKCojj3a8efWW4" name="xbox-live-gold-promo-image-microsoft.jpg" alt="A promo image for Xbox Live Gold showing four people playing video games on a couch" src="https://cdn.mos.cms.futurecdn.net/t5TDnrSHzKCojj3a8efWW4.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>The console business clearly isn’t working for Microsoft and hasn’t for well over a decade. The days of the Xbox 360’s dominance are in the distant past, a fact that’s abundantly clear in 2026. Though Microsoft is working on a next-gen system (as <a href="https://mashable.com/article/former-xbox-president-sarah-bond-breaks-silence-after-exit" target="_blank">Sarah Bond stated in her farewell message to the team</a>), that system (the <a href="https://www.tomsguide.com/gaming/xbox/is-the-console-war-over-next-gen-xbox-could-be-aiming-at-pcs-not-ps6">rumored PC-like Project Magnus</a>) shouldn’t be the focus for the company.</p><p>Right now, <a href="https://blogs.microsoft.com/on-the-issues/2024/10/15/one-year-activision-blizzard/#:~:text=Microsoft%20365-,One%20year%20on:%20Microsoft's%20acquisition%20of%20Activision%20Blizzard,fueling%20gaming%20innovation%20and%20competition&text=A%20year%20and%20two%20days,on%20this%20work%20moving%20forward." target="_blank"><u>Microsoft is already the biggest third-party publisher in gaming</u></a>. Between Xbox Game Studios, Bethesda, Activision Blizzard, and a slew of others, the company owns dozens of studios. With such a huge army of developers, you don’t need dedicated hardware to sell games. You can sell them on other platforms.</p><p>Going from hardware manufacturer to purely software developer wouldn’t be unheard of, either — just look at Sega. After the Dreamcast flopped, Nintendo’s former rival pulled the plug on hardware in 2001 and went full third-party. Though the transition wasn’t exactly smooth, the move benefited Sega over time. Sega stopped the bleeding, focused on delivering excellent games for all systems, and is currently one of the most respected and beloved developers in the industry.</p><p>There’s absolutely no reason why Xbox can’t do the same. The company doesn’t need to release another system with a confusing name for folks to play its games. As it’s already doing, it should keep releasing on <a href="https://www.tomsguide.com/reviews/ps5">PS5</a>, PC, <a href="https://www.tomsguide.com/gaming/nintendo/ive-spent-24-hours-with-the-nintendo-switch-2-for-review-heres-5-things-i-love-and-2-things-i-dont">Nintendo Switch 2</a>, and wherever else it makes sense. Focus on making awesome games and let Game Pass be the subscription hook (more on that shortly). This way, the Xbox brand can finally become the true multiplatform powerhouse Microsoft has always wanted it to be.</p><h2 id="quality-over-quantity">Quality over quantity</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="K3EnX2DPWRtYVqP4X2ehxe" name="best_PC_games_Forza_Horizon_5.jpg" alt="Forza Horizon 5" src="https://cdn.mos.cms.futurecdn.net/K3EnX2DPWRtYVqP4X2ehxe.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Xbox Game Studios)</span></figcaption></figure><p>Though plenty of games land on Game Pass, few of them make a significant impact with gamers. Despite having a legion of AAA studios, actual blockbuster titles can sometimes feel few and far between. We see more headlines about layoffs, cancellations, and delayed projects than we do about must-play releases.</p><p>To fix that, Microsoft must do a better job of curating its output and enforcing faster, more reliable development cycles for its heavy hitters. There’s no reason players should have to wait the better part of a decade for new installments of bedrock franchises like Halo, Gears of War, and Forza. The company needs to find the right balance between quality and timely releases for the games that actually define Xbox.</p><p>The same standard should apply to the rest of the mid-tier and indie portfolio. With so many teams, there’s no excuse for inconsistent output, but that output also can’t be filler just to pad Game Pass day-one slates. Even if it means fewer releases overall, true quality titles will win players back over time. That’s how you rebuild trust and turn folks into loyal subscribers.</p><h2 id="expand-game-pass">Expand Game Pass</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1739px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="LjjE6UXJs4nK6SNf3r3vfR" name="TG_Xbox-Xcloud.jpg" alt="Xbox Cloud gaming" src="https://cdn.mos.cms.futurecdn.net/LjjE6UXJs4nK6SNf3r3vfR.jpg" mos="" align="middle" fullscreen="" width="1739" height="978" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>I’m sure some of you are wondering what the point of Game Pass is without dedicated hardware. While the subscription service has certainly been a big reason to buy an Xbox console, it doesn’t have to live primarily on the company’s hardware. Given the poor sales of Xbox, Game Pass shouldn’t be tied to it. In fact, the subscription service can thrive outside of Xbox.</p><p>And you don’t even have to imagine this scenario. You can already stream hundreds of titles via the <a href="https://www.xbox.com/en-US/xbox-on-tvs" target="_blank"><u>Xbox app on Samsung and LG smart TVs</u></a>, <a href="https://www.pcmag.com/news/some-amazon-fire-smart-tvs-now-let-you-play-xbox-games"><u>Amazon Fire TV devices</u></a>, and more. Going further, Microsoft should strike aggressive partnerships for native apps on Roku, Apple TV, every major phone carrier (bundled data plans, anyone?), and every TV manufacturer on the planet. Make Game Pass the true Netflix of gaming.</p><p>It can also become the ultimate first-party destination: day-one releases from every major Microsoft-owned studio, plus the full back catalog of legacy Xbox, Xbox 360, and original Xbox games. With that massive library, Game Pass wouldn’t need third-party day-ones from the likes of Capcom or Square Enix. Think of it like a good version of EA Play or Ubisoft+ that you actually want to subscribe to.</p><p>To address the elephant in the room, this would also mean bringing Game Pass to PlayStation and Nintendo systems. That would ultimately be up to Sony and Nintendo to approve, but if the service only features Xbox-owned titles (which players could still buy individually on those storefronts), I don’t see a strong reason for them to object, especially since EA Play and Ubisoft+ are already available on PS5. That said, I wouldn’t hold my breath for Nintendo to play ball.</p><h2 id="set-realistic-expectations">Set realistic expectations</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:66.67%;"><img id="4TEfwqu9hSy4uToJ2pRoDT" name="asha-sharma-matt-booty" alt="Asha Sharma, Xbox CEO" src="https://cdn.mos.cms.futurecdn.net/4TEfwqu9hSy4uToJ2pRoDT.jpg" mos="" align="middle" fullscreen="" width="1920" height="1280" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Xbox’s communication isn’t bad. We’re generally not left in the dark about what’s in the pipeline. That said, it could still use some serious restructuring to keep players informed and excited without the usual drama.</p><p>Though the company has improved over the years, we need to see an end to the overhype. Aaron Greenberg and the old hype machine loved promising the moon only to underdeliver. The new regime needs to get fans excited for what’s actually coming without setting itself up for backlash when plans change.</p><p>Games shouldn’t be announced years before they’re ready. Want an example? Look no further than Perfect Dark, announced in 2020, hyped for half a decade, <a href="https://www.vice.com/en/article/xboxs-cancelled-perfect-dark-reboot-just-had-concept-art-and-details-leak-online/" target="_blank"><u>and then completely cancelled in 2025 along with its entire studio</u></a>. If a delay is coming, say it early instead of stringing people along.</p><p>This last point is controversial but important: Xbox needs to let fans understand the company is not their friend. I’m all for open communication and more fan-centric events to keep people invested, but execs hopping on social media and acting like your buddy is cringey as hell. It has fostered some genuinely toxic parasocial relationships on social media. Like Sony and Nintendo, let fans feel welcome without the fake intimacy that breeds toxicity when expectations aren’t met.</p><h2 id="outlook-4">Outlook</h2><p>Xbox isn’t in great shape today, but that doesn’t mean the 25-year-old brand is finished. With Asha Sharma’s experience as a platform builder and fresh perspective, now is the perfect time for Microsoft to take the drastic measures required to make Xbox thrive again.</p><p>Sega came back stronger after it abandoned hardware, and I don’t see why Xbox can’t follow suit. The brand can absolutely prosper without a dedicated plastic box in your living room. The console wars are over and there's no reason for Xbox to continue focusing on hardware. Microsoft can become the ultimate third-party publisher that also offers the ultimate gaming subscription service. </p><p>While that might sound absurd or even blasphemous, I think this is the best course for Xbox. After all, Microsoft is and always has been a software-first company. If it can follow through, Xbox won’t be relegated to the landfill of gaming history. By focusing on software and putting it everywhere, Xbox might just pull off the greatest comeback story in gaming.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X74nde"></div>                            </div>                            <script src="https://kwizly.com/embed/X74nde.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/hardware/europes-ddr5-prices-are-finally-falling-the-glimmer-of-hope-weve-been-waiting-for">Europe’s DDR5 prices are finally falling — the glimmer of hope we’ve been waiting for</a></li><li><a href="https://www.tomsguide.com/gaming/handheld-gaming/cant-find-a-steam-deck-here-are-3-handhelds-you-can-buy-right-now">Can’t find a Steam Deck? Here are 3 handhelds you can buy right now</a></li><li><a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-tested-the-razer-raiju-v3-pro-for-a-week-heres-why-its-the-best-ps5-pro-controller">I tested the Razer Raiju V3 Pro for a week — here’s why it’s the best PS5 'pro' controller</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ New Xbox CEO Asha Sharma explains her plans for the future of Microsoft gaming in latest interview ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Microsoft shook up the leadership of its Xbox division in a late Friday news dump that revealed the <a href="https://www.tomsguide.com/gaming/xbox/end-of-an-era-xboxs-ceo-phil-spencer-is-officially-retiring-next-week">retirement of longtime Xbox head Phil Spencer</a> and the new CEO, Asha Sharma.</p><p>Sharma was previously the head of product development for Microsoft's CoreAI, and had stints at Instacart and Whatnot, a "living shopping platform." In an <a href="https://blogs.microsoft.com/blog/2026/02/20/asha-sharma-named-evp-and-ceo-microsoft-gaming/" target="_blank">announcement letter</a>, Sharma stated that her first job is to "understand what makes this work and protect it."</p><p>Since the reveal, she spent this past weekend <a href="https://x.com/asha_shar/with_replies" target="_blank">bolstering her gaming bona fides</a> against the tidal wave of the usual nefarious sorts you'll see on "Gaming Twitter."</p><p>Sharma is stepping into a tumultuous time in gaming. Between <a href="https://www.tomsguide.com/news/live/microsoft-q2-earnings-2026">Xbox's lagging sales</a> and the ongoing <a href="https://www.tomsguide.com/computing/the-ram-crisis-is-so-much-bigger-than-pcs-heres-the-rest-of-the-products-caught-in-the-crossfire">RAM crisis</a>, she will need to weather a few different storms.</p><h2 id="what-sharma-is-saying-so-far">What Sharma is saying so far?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:66.67%;"><img id="4TEfwqu9hSy4uToJ2pRoDT" name="asha-sharma-matt-booty" alt="Asha Sharma, Xbox CEO" src="https://cdn.mos.cms.futurecdn.net/4TEfwqu9hSy4uToJ2pRoDT.jpg" mos="" align="middle" fullscreen="" width="1920" height="1280" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Sharma is stepping into some big shoes, so outside of an attempt to appease gamers, what is she saying about the future of Xbox?</p><p>We have some answers thanks to an <a href="https://variety.com/2026/gaming/news/new-microsoft-gaming-ceo-asha-sharma-xbox-games-ai-1236668829/" target="_blank">interview she gave to Variety</a>. In her internal memo, Sharma said that her commitment to Xbox required three things: great games, the return of Xbox, and understanding the future of play. "We are witnessing the reinvention of play," she wrote.</p><p>A great game to Sharma has "deep emotional resonance" and a "distinct point of view." She added that she wants to make stories that make players "feel something," highlighting the excellent indie game Firewatch.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XZ3VKe"></div>                            </div>                            <script src="https://kwizly.com/embed/XZ3VKe.js" async></script><p>“I’m coming into gaming as a platform builder,” Sharma told Variety. She added that the goal is to be consistent and earn the trust of players and developers.</p><p>She acknowledged that she has a lot to learn but is committed to "being grounded in what the community is telling us."</p><p>Sharma's background in AI has been a concern, with some backlash against the potential use of generative AI in development. Sharma said she has "no tolerance for bad AI," while adding that AI has been and will continue to be a part of gaming.</p><p>But she does note that “great stories are created by humans," echoing a similar sentiment from her announcement letter.</p><h2 id="the-future-of-xbox">The future of Xbox</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1739px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="LjjE6UXJs4nK6SNf3r3vfR" name="TG_Xbox-Xcloud.jpg" alt="Xbox Cloud gaming" src="https://cdn.mos.cms.futurecdn.net/LjjE6UXJs4nK6SNf3r3vfR.jpg" mos="" align="middle" fullscreen="" width="1739" height="978" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>For now, we have platitudes, and it might take a minute for action to show up. We'll see what direction Xbox faces during the Game Developers Conference in March and an expected Xbox Games Showcase later this spring.</p><p>Meanwhile, <a href="https://www.theverge.com/tech/883015/microsoft-xbox-new-ceo-shakeup-notepad" target="_blank">The Verge is reporting</a> that former president Sarah Bond was pushing the gaming division at Microsoft in a direction that employees disagreed with, from the "Xbox everywhere" strategy to pushing for multi-platform access. </p><p>Sharma's hiring is seen as a reset button, so it will be interesting to see how she pivots away from the previous strategy.</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/windows-operating-systems/microsoft-is-reportedly-pulling-back-on-stuffing-windows-11-with-ai-and-i-couldnt-be-happier">Microsoft is reportedly 'pulling back' on stuffing Windows 11 with AI — and I couldn't be happier</a></li><li><a href="https://www.tomsguide.com/news/live/microsoft-q2-earnings-2026">Microsoft earnings — 'You can think of agents as the new apps,' CEO Satya Nadella</a></li><li><a href="https://www.tomsguide.com/computing/online-security/microsoft-confirms-copilot-bug-let-its-ai-read-sensitive-and-confidential-emails">Microsoft confirms Copilot bug let its AI read sensitive and confidential emails</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/xbox/xboxs-asha-sharma-promises-the-return-of-xbox-and-a-distinct-point-of-view-in-new-interview</link>
                                                                            <description>
                            <![CDATA[ Who is Asha Sharma, and what is she saying about Xbox as she takes over the reins from Phil Spencer? ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Nr9UzPoR3UuJPWAAJ7DFjd</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/kwJBZ2i4EdEyxmKQhN5hcS-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 23 Feb 2026 22:30:32 +0000</pubDate>                                                                                                                                <updated>Tue, 24 Feb 2026 18:16:44 +0000</updated>
                                                                                                                                            <category><![CDATA[Xbox]]></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/kwJBZ2i4EdEyxmKQhN5hcS-1280-80.jpg">
                                                            <media:credit><![CDATA[Microsoft]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Asha Sharma, Xbox CEO]]></media:description>                                                            <media:text><![CDATA[Asha Sharma, Xbox CEO]]></media:text>
                                <media:title type="plain"><![CDATA[Asha Sharma, Xbox CEO]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/kwJBZ2i4EdEyxmKQhN5hcS-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Microsoft shook up the leadership of its Xbox division in a late Friday news dump that revealed the <a href="https://www.tomsguide.com/gaming/xbox/end-of-an-era-xboxs-ceo-phil-spencer-is-officially-retiring-next-week">retirement of longtime Xbox head Phil Spencer</a> and the new CEO, Asha Sharma.</p><p>Sharma was previously the head of product development for Microsoft's CoreAI, and had stints at Instacart and Whatnot, a "living shopping platform." In an <a href="https://blogs.microsoft.com/blog/2026/02/20/asha-sharma-named-evp-and-ceo-microsoft-gaming/" target="_blank">announcement letter</a>, Sharma stated that her first job is to "understand what makes this work and protect it."</p><p>Since the reveal, she spent this past weekend <a href="https://x.com/asha_shar/with_replies" target="_blank">bolstering her gaming bona fides</a> against the tidal wave of the usual nefarious sorts you'll see on "Gaming Twitter."</p><p>Sharma is stepping into a tumultuous time in gaming. Between <a href="https://www.tomsguide.com/news/live/microsoft-q2-earnings-2026">Xbox's lagging sales</a> and the ongoing <a href="https://www.tomsguide.com/computing/the-ram-crisis-is-so-much-bigger-than-pcs-heres-the-rest-of-the-products-caught-in-the-crossfire">RAM crisis</a>, she will need to weather a few different storms.</p><h2 id="what-sharma-is-saying-so-far">What Sharma is saying so far?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:66.67%;"><img id="4TEfwqu9hSy4uToJ2pRoDT" name="asha-sharma-matt-booty" alt="Asha Sharma, Xbox CEO" src="https://cdn.mos.cms.futurecdn.net/4TEfwqu9hSy4uToJ2pRoDT.jpg" mos="" align="middle" fullscreen="" width="1920" height="1280" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Sharma is stepping into some big shoes, so outside of an attempt to appease gamers, what is she saying about the future of Xbox?</p><p>We have some answers thanks to an <a href="https://variety.com/2026/gaming/news/new-microsoft-gaming-ceo-asha-sharma-xbox-games-ai-1236668829/" target="_blank">interview she gave to Variety</a>. In her internal memo, Sharma said that her commitment to Xbox required three things: great games, the return of Xbox, and understanding the future of play. "We are witnessing the reinvention of play," she wrote.</p><p>A great game to Sharma has "deep emotional resonance" and a "distinct point of view." She added that she wants to make stories that make players "feel something," highlighting the excellent indie game Firewatch.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XZ3VKe"></div>                            </div>                            <script src="https://kwizly.com/embed/XZ3VKe.js" async></script><p>“I’m coming into gaming as a platform builder,” Sharma told Variety. She added that the goal is to be consistent and earn the trust of players and developers.</p><p>She acknowledged that she has a lot to learn but is committed to "being grounded in what the community is telling us."</p><p>Sharma's background in AI has been a concern, with some backlash against the potential use of generative AI in development. Sharma said she has "no tolerance for bad AI," while adding that AI has been and will continue to be a part of gaming.</p><p>But she does note that “great stories are created by humans," echoing a similar sentiment from her announcement letter.</p><h2 id="the-future-of-xbox">The future of Xbox</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1739px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="LjjE6UXJs4nK6SNf3r3vfR" name="TG_Xbox-Xcloud.jpg" alt="Xbox Cloud gaming" src="https://cdn.mos.cms.futurecdn.net/LjjE6UXJs4nK6SNf3r3vfR.jpg" mos="" align="middle" fullscreen="" width="1739" height="978" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>For now, we have platitudes, and it might take a minute for action to show up. We'll see what direction Xbox faces during the Game Developers Conference in March and an expected Xbox Games Showcase later this spring.</p><p>Meanwhile, <a href="https://www.theverge.com/tech/883015/microsoft-xbox-new-ceo-shakeup-notepad" target="_blank">The Verge is reporting</a> that former president Sarah Bond was pushing the gaming division at Microsoft in a direction that employees disagreed with, from the "Xbox everywhere" strategy to pushing for multi-platform access. </p><p>Sharma's hiring is seen as a reset button, so it will be interesting to see how she pivots away from the previous strategy.</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/windows-operating-systems/microsoft-is-reportedly-pulling-back-on-stuffing-windows-11-with-ai-and-i-couldnt-be-happier">Microsoft is reportedly 'pulling back' on stuffing Windows 11 with AI — and I couldn't be happier</a></li><li><a href="https://www.tomsguide.com/news/live/microsoft-q2-earnings-2026">Microsoft earnings — 'You can think of agents as the new apps,' CEO Satya Nadella</a></li><li><a href="https://www.tomsguide.com/computing/online-security/microsoft-confirms-copilot-bug-let-its-ai-read-sensitive-and-confidential-emails">Microsoft confirms Copilot bug let its AI read sensitive and confidential emails</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Microsoft won’t stop trying to make Edge happen — now it’s coming to Teams, but there is a quick fix ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Three things in life are certain: death, taxes and <a href="https://www.tomsguide.com/news/take-the-hint-microsoft-im-not-using-edge-no-matter-how-many-obstacles-you-throw-at-me">Microsoft continuing to push its Edge browser</a> onto users. Now, the company is at it again, this time with a new feature in the Teams app for iOS and Android. </p><p>Microsoft has announced a new "<a href="https://admin.microsoft.com/#/MessageCenter/:/messages/MC1216263" target="_blank">Links in Teams</a>" feature that will prompt users to choose a browser when opening non-Office (Word, Excel, PowerPoint) and PDF links in the Teams app. The update's goal? "Encouraging" the use of Microsoft Edge. </p><p>This affects all users of Microsoft Teams on iPhone and Android, with the feature rolling out to all by default in late February. As noted, the Redmond tech giant will be monitoring Microsoft Edge installation rates and retention, along with user satisfaction, during the rollout of the new feature. </p><h2 id="yet-another-push-for-edge">Yet another push for Edge</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VGtB7V6BJ8LtyCkvo2Qvmm" name="Microsoft Edge laptop.jpg" alt="Microsoft Edge Browser" src="https://cdn.mos.cms.futurecdn.net/VGtB7V6BJ8LtyCkvo2Qvmm.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Microsoft has been trying to push its Edge browser on all platforms for years, so much so that the Digital Markets Act in Europe <a href="https://www.tomsguide.com/computing/windows-operating-systems/finally-microsoft-will-stop-begging-you-to-make-edge-your-default-browser-but-not-for-everyone">forced Microsoft to stop prompting Windows users</a> to set Edge as their default browser. Now, the company has found a new way to tempt users to switch browsers. </p><p>With Links in Teams, whenever you tap on a link in chats that's not from Microsoft's suite of Office apps, or just a PDF, a (you guessed it) pop-up will appear at the bottom of the screen, giving users the option to choose a browser. </p><p>Of course, Microsoft Edge will be an option, even when the browser isn't installed. If you select Edge, you will then be taken to the App Store or Play Store to download it. It's another way for the company to force its Edge browser to be a prominent option, despite links in Teams already opening up in users' default browsers. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ODjKme"></div>                            </div>                            <script src="https://kwizly.com/embed/ODjKme.js" async></script><p>“Using Teams to push users toward Edge, rather than honoring their browser preferences, introduces unnecessary hurdles that override consumer choice," a <a href="https://browserchoicealliance.org/the-issue/" target="_blank">Browser Choice Alliance</a> representative shared with Tom's Guide. "Microsoft should stand on the side of users instead of expanding its campaign to lock out competing browsers.”</p><p>Microsoft is promoting Edge with its support for "Single Sign-On (SSO), Copilot, and enhanced security," including its <a href="https://www.tomsguide.com/ai/microsofts-edge-just-got-a-major-ai-makeover-meet-copilot-mode">Copilot Mode</a> released last year. Teams is Microsoft's own communication platform, so it makes sense that the company would include its browser as an option, but it's no secret that the Redmond giant is relentless when it comes to introducing new ways to push Edge, and this is another sticking point. </p><h2 id="a-quick-way-to-stop-it">A quick way to stop 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:4000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wb2B33wMVjGsrY5dWg23Nh" name="Microsoft Links in Teams" alt="Microsoft Links in Teams screenshot of settings" src="https://cdn.mos.cms.futurecdn.net/wb2B33wMVjGsrY5dWg23Nh.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: Microsoft)</span></figcaption></figure><p>Fortunately, Microsoft Edge isn't automatically chosen as the default browser in Teams. A new Links in Teams setting will be available once the update rolls out, allowing users their choice of browser before being prompted. </p><p>Once available, just follow these steps:</p><ul><li>Open the Microsoft Teams app.</li><li>Tap the profile icon in the top-left corner of the app.</li><li>Tap Settings.</li><li>Select Links in Teams.</li><li>Choose your default browser of choice.</li></ul><p>As before, Microsoft Edge will appear as an option even if you don't have the app downloaded, and if this is chosen, you will be prompted to download it. Notably, it doesn't appear like other browsers are options, like Google Chrome, Opera, Firefox and more. </p><p>Microsoft notes that IT admins in organizations can disable the feature via PowerShell if needed, especially if companies already make use of specific browsers.</p><p>According to <a href="https://gs.statcounter.com/browser-market-share" target="_blank">Statcounter</a>, Google Chrome continues to dominate as the leading browser at over 70%, with Edge far behind at 4%. Clearly, Microsoft wants Edge to be widely adopted, and only time will tell if its latest campaign with Links in Teams will make a difference.</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/concentrate-on-keeping-it-simple-bill-gates-wanted-pcs-to-be-straightforward-and-windows-11s-ai-push-is-a-betrayal">'Concentrate on keeping it simple': Bill Gates wanted PCs to be straightforward, and Windows 11’s AI push is a betrayal</a></li><li><a href="https://www.tomsguide.com/computing/windows-operating-systems/windows-11-is-getting-3-new-features-in-a-major-quality-of-life-update-is-microsoft-starting-to-pull-back-on-ai-slop">Windows 11 is getting 3 new features in a major quality of life update — is Microsoft starting to pull back on AI slop?</a></li><li><a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-is-reportedly-pulling-back-on-stuffing-windows-11-with-ai-and-i-couldnt-be-happier">Microsoft is reportedly 'pulling back' on stuffing Windows 11 with AI — and I couldn't be happier</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/microsoft-wont-stop-trying-to-make-edge-happen-now-its-coming-to-teams-but-there-is-a-quick-fix</link>
                                                                            <description>
                            <![CDATA[ Microsoft just found another way to 'encourage' you to use Edge in Teams, but there's a quick fix ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">86vp5qh2TxMCnS3tjXpQCo</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/ZNosfAN6RXL7bQy6sRhkHZ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 20 Feb 2026 11:56:03 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Computing]]></category>
                                                                                                                    <dc:creator><![CDATA[ Darragh Murphy ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/5QiaTSWf9FcVB7STxcdo4M.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Darragh is Tom’s Guide’s Computing Editor and is fascinated by all things bizarre in tech. This usually leads to assorted coverage varying from washing machines designed for earbuds to the wild world of laptops. Whether it&#039;s connecting Scar from The Lion King to two-factor authentication or turning his love for laptops into a fabricated rap battle from 8 Mile, he believes there’s always a quirky spin to be made.&lt;br&gt;&lt;br&gt;Darragh has previously been an Editor for Laptop Mag and a News Editor for Time Out Dubai, where he also headed the gaming and tech section. His work can be seen in Mashable, Android Police, Shortlist Dubai, Proton, theBit.nz, ReviewsFire and more. &lt;br&gt;&lt;br&gt;While laptops are his bread and butter, he’s also reviewed smartphones, monitors, speakers, docking stations and VPNs. He’s covered IFA, MWC Barcelona, the Consumer Electronics Show (&lt;a href=&quot;https://www.tomsguide.com/uk/tag/ces&quot; target=&quot;_blank&quot;&gt;CES&lt;/a&gt;) and more.&lt;br&gt;&lt;br&gt;When he&#039;s not checking out the latest devices and all things computing, he can be found going for dreaded long runs, watching terrible shark movies, and trying to find time to game.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/ZNosfAN6RXL7bQy6sRhkHZ-1280-80.jpg">
                                                            <media:credit><![CDATA[Getty Images]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Microsoft Teams]]></media:description>                                                            <media:text><![CDATA[Microsoft Teams]]></media:text>
                                <media:title type="plain"><![CDATA[Microsoft Teams]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/ZNosfAN6RXL7bQy6sRhkHZ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Three things in life are certain: death, taxes and <a href="https://www.tomsguide.com/news/take-the-hint-microsoft-im-not-using-edge-no-matter-how-many-obstacles-you-throw-at-me">Microsoft continuing to push its Edge browser</a> onto users. Now, the company is at it again, this time with a new feature in the Teams app for iOS and Android. </p><p>Microsoft has announced a new "<a href="https://admin.microsoft.com/#/MessageCenter/:/messages/MC1216263" target="_blank">Links in Teams</a>" feature that will prompt users to choose a browser when opening non-Office (Word, Excel, PowerPoint) and PDF links in the Teams app. The update's goal? "Encouraging" the use of Microsoft Edge. </p><p>This affects all users of Microsoft Teams on iPhone and Android, with the feature rolling out to all by default in late February. As noted, the Redmond tech giant will be monitoring Microsoft Edge installation rates and retention, along with user satisfaction, during the rollout of the new feature. </p><h2 id="yet-another-push-for-edge">Yet another push for Edge</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VGtB7V6BJ8LtyCkvo2Qvmm" name="Microsoft Edge laptop.jpg" alt="Microsoft Edge Browser" src="https://cdn.mos.cms.futurecdn.net/VGtB7V6BJ8LtyCkvo2Qvmm.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Microsoft has been trying to push its Edge browser on all platforms for years, so much so that the Digital Markets Act in Europe <a href="https://www.tomsguide.com/computing/windows-operating-systems/finally-microsoft-will-stop-begging-you-to-make-edge-your-default-browser-but-not-for-everyone">forced Microsoft to stop prompting Windows users</a> to set Edge as their default browser. Now, the company has found a new way to tempt users to switch browsers. </p><p>With Links in Teams, whenever you tap on a link in chats that's not from Microsoft's suite of Office apps, or just a PDF, a (you guessed it) pop-up will appear at the bottom of the screen, giving users the option to choose a browser. </p><p>Of course, Microsoft Edge will be an option, even when the browser isn't installed. If you select Edge, you will then be taken to the App Store or Play Store to download it. It's another way for the company to force its Edge browser to be a prominent option, despite links in Teams already opening up in users' default browsers. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ODjKme"></div>                            </div>                            <script src="https://kwizly.com/embed/ODjKme.js" async></script><p>“Using Teams to push users toward Edge, rather than honoring their browser preferences, introduces unnecessary hurdles that override consumer choice," a <a href="https://browserchoicealliance.org/the-issue/" target="_blank">Browser Choice Alliance</a> representative shared with Tom's Guide. "Microsoft should stand on the side of users instead of expanding its campaign to lock out competing browsers.”</p><p>Microsoft is promoting Edge with its support for "Single Sign-On (SSO), Copilot, and enhanced security," including its <a href="https://www.tomsguide.com/ai/microsofts-edge-just-got-a-major-ai-makeover-meet-copilot-mode">Copilot Mode</a> released last year. Teams is Microsoft's own communication platform, so it makes sense that the company would include its browser as an option, but it's no secret that the Redmond giant is relentless when it comes to introducing new ways to push Edge, and this is another sticking point. </p><h2 id="a-quick-way-to-stop-it">A quick way to stop 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:4000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wb2B33wMVjGsrY5dWg23Nh" name="Microsoft Links in Teams" alt="Microsoft Links in Teams screenshot of settings" src="https://cdn.mos.cms.futurecdn.net/wb2B33wMVjGsrY5dWg23Nh.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: Microsoft)</span></figcaption></figure><p>Fortunately, Microsoft Edge isn't automatically chosen as the default browser in Teams. A new Links in Teams setting will be available once the update rolls out, allowing users their choice of browser before being prompted. </p><p>Once available, just follow these steps:</p><ul><li>Open the Microsoft Teams app.</li><li>Tap the profile icon in the top-left corner of the app.</li><li>Tap Settings.</li><li>Select Links in Teams.</li><li>Choose your default browser of choice.</li></ul><p>As before, Microsoft Edge will appear as an option even if you don't have the app downloaded, and if this is chosen, you will be prompted to download it. Notably, it doesn't appear like other browsers are options, like Google Chrome, Opera, Firefox and more. </p><p>Microsoft notes that IT admins in organizations can disable the feature via PowerShell if needed, especially if companies already make use of specific browsers.</p><p>According to <a href="https://gs.statcounter.com/browser-market-share" target="_blank">Statcounter</a>, Google Chrome continues to dominate as the leading browser at over 70%, with Edge far behind at 4%. Clearly, Microsoft wants Edge to be widely adopted, and only time will tell if its latest campaign with Links in Teams will make a difference.</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/concentrate-on-keeping-it-simple-bill-gates-wanted-pcs-to-be-straightforward-and-windows-11s-ai-push-is-a-betrayal">'Concentrate on keeping it simple': Bill Gates wanted PCs to be straightforward, and Windows 11’s AI push is a betrayal</a></li><li><a href="https://www.tomsguide.com/computing/windows-operating-systems/windows-11-is-getting-3-new-features-in-a-major-quality-of-life-update-is-microsoft-starting-to-pull-back-on-ai-slop">Windows 11 is getting 3 new features in a major quality of life update — is Microsoft starting to pull back on AI slop?</a></li><li><a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-is-reportedly-pulling-back-on-stuffing-windows-11-with-ai-and-i-couldnt-be-happier">Microsoft is reportedly 'pulling back' on stuffing Windows 11 with AI — and I couldn't be happier</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Microsoft confirms Copilot bug let its AI read sensitive and confidential emails ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Microsoft confirmed that a <a href="https://www.tomsguide.com/ai/copilot/microsoft-copilot-what-it-is-and-how-it-works">Copilot </a>security bug was allowing the AI assistant to read and summarize emails that were labeled as confidential. According to a <a href="https://www.bleepingcomputer.com/news/microsoft/microsoft-says-bug-causes-copilot-to-summarize-confidential-emails/">report from Bleeping Computer</a>, the bug bypassed Microsoft's data loss prevention policies, which are meant to protect sensitive information.</p><p>The bug was discovered in late January (tracked as <a href="admin.microsoft.com/#/MessageCenter/:/messages/CW1226324" target="_blank">CW1226324</a>) and specifically affects Copilot Chat and the "work tab" feature. The bug let Copilot read and summarize emails in the sent and drafts folders, including messages that were explicitly labeled as confidential, which should have had restricted access.</p><p>Copilot Chat is Microsoft's version of Google Gemini or ChatGPT. It's meant to be content-aware and can interact with 365 apps like Word, Excel, Powerpoint and Outlook. The company began rolling it out to Microsoft 365 business customers in September 2025.</p><p>"Users' email messages with a confidential label applied are being incorrectly processed by Microsoft 365 Copilot chat," Microsoft confirmed.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XpJL8W"></div>                            </div>                            <script src="https://kwizly.com/embed/XpJL8W.js" async></script><p>The company said that an unspecified code error was responsible for the issue. A fix began rolling out in early February with Microsoft saying that it is continuing to monitor it. A final timeline for the rollout has not been revealed, nor has Microsoft stated how many organizations or individuals were affected.</p><p>That said, the issue has been tagged as "advisory," which usually means that the incident was limited in scope or impact. </p><p>"We identified and addressed an issue where Microsoft 365 Copilot Chat could return content from emails labeled confidential authored by a user and stored within their Draft and Sent Items in Outlook desktop. This did not provide anyone access to information they weren’t already authorized to see," a spokesperson told Bleeping Computer.</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/windows-operating-systems/windows-11-is-getting-3-new-features-in-a-major-quality-of-life-update-is-microsoft-starting-to-pull-back-on-ai-slop">Windows 11 is getting 3 new features in a major quality of life update — is Microsoft starting to pull back on AI slop?</a></li><li><a href="https://www.tomsguide.com/computing/concentrate-on-keeping-it-simple-bill-gates-wanted-pcs-to-be-straightforward-and-windows-11s-ai-push-is-a-betrayal">'Concentrate on keeping it simple': Bill Gates wanted PCs to be straightforward, and Windows 11’s AI push is a betrayal</a></li><li><a href="https://www.tomsguide.com/computing/windows-operating-systems/windows-10-users-warned-to-upgrade-now-or-risk-a-degraded-security-state-as-microsoft-ends-secure-boot-support">Windows 10 users warned to upgrade now or risk a ‘degraded security state’ as Microsoft ends Secure Boot support</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/online-security/microsoft-confirms-copilot-bug-let-its-ai-read-sensitive-and-confidential-emails</link>
                                                                            <description>
                            <![CDATA[ Microsoft confirmed a bug in Copilot was letting the AI assistant read and summarize confidential emails. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">jzHBefDQ3f53s7NCXBpqDZ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/wZGmfPwAivKWvikiWeJGM8-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Thu, 19 Feb 2026 18:21:34 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Online Security]]></category>
                                                    <category><![CDATA[AI]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Internet]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/wZGmfPwAivKWvikiWeJGM8-1280-80.png">
                                                            <media:credit><![CDATA[Microsoft]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Microsoft 50th anniversary Copilot Home Screen]]></media:description>                                                            <media:text><![CDATA[Microsoft 50th anniversary Copilot Home Screen]]></media:text>
                                <media:title type="plain"><![CDATA[Microsoft 50th anniversary Copilot Home Screen]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/wZGmfPwAivKWvikiWeJGM8-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Microsoft confirmed that a <a href="https://www.tomsguide.com/ai/copilot/microsoft-copilot-what-it-is-and-how-it-works">Copilot </a>security bug was allowing the AI assistant to read and summarize emails that were labeled as confidential. According to a <a href="https://www.bleepingcomputer.com/news/microsoft/microsoft-says-bug-causes-copilot-to-summarize-confidential-emails/">report from Bleeping Computer</a>, the bug bypassed Microsoft's data loss prevention policies, which are meant to protect sensitive information.</p><p>The bug was discovered in late January (tracked as <a href="admin.microsoft.com/#/MessageCenter/:/messages/CW1226324" target="_blank">CW1226324</a>) and specifically affects Copilot Chat and the "work tab" feature. The bug let Copilot read and summarize emails in the sent and drafts folders, including messages that were explicitly labeled as confidential, which should have had restricted access.</p><p>Copilot Chat is Microsoft's version of Google Gemini or ChatGPT. It's meant to be content-aware and can interact with 365 apps like Word, Excel, Powerpoint and Outlook. The company began rolling it out to Microsoft 365 business customers in September 2025.</p><p>"Users' email messages with a confidential label applied are being incorrectly processed by Microsoft 365 Copilot chat," Microsoft confirmed.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XpJL8W"></div>                            </div>                            <script src="https://kwizly.com/embed/XpJL8W.js" async></script><p>The company said that an unspecified code error was responsible for the issue. A fix began rolling out in early February with Microsoft saying that it is continuing to monitor it. A final timeline for the rollout has not been revealed, nor has Microsoft stated how many organizations or individuals were affected.</p><p>That said, the issue has been tagged as "advisory," which usually means that the incident was limited in scope or impact. </p><p>"We identified and addressed an issue where Microsoft 365 Copilot Chat could return content from emails labeled confidential authored by a user and stored within their Draft and Sent Items in Outlook desktop. This did not provide anyone access to information they weren’t already authorized to see," a spokesperson told Bleeping Computer.</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/windows-operating-systems/windows-11-is-getting-3-new-features-in-a-major-quality-of-life-update-is-microsoft-starting-to-pull-back-on-ai-slop">Windows 11 is getting 3 new features in a major quality of life update — is Microsoft starting to pull back on AI slop?</a></li><li><a href="https://www.tomsguide.com/computing/concentrate-on-keeping-it-simple-bill-gates-wanted-pcs-to-be-straightforward-and-windows-11s-ai-push-is-a-betrayal">'Concentrate on keeping it simple': Bill Gates wanted PCs to be straightforward, and Windows 11’s AI push is a betrayal</a></li><li><a href="https://www.tomsguide.com/computing/windows-operating-systems/windows-10-users-warned-to-upgrade-now-or-risk-a-degraded-security-state-as-microsoft-ends-secure-boot-support">Windows 10 users warned to upgrade now or risk a ‘degraded security state’ as Microsoft ends Secure Boot support</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Windows 11’s taskbar internet speed test is a real quality-of-life upgrade — now, where is Microsoft's AI dial back? ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Microsoft just issued a <a href="https://blogs.windows.com/windows-insider/2026/02/17/releasing-windows-11-builds-26100-7918-and-26200-7918-to-the-release-preview-channel/" target="_blank" rel="nofollow">Windows 11 Release Preview build</a> that previews a bunch of new features coming to the OS. </p><p>The team at Redmond has been doing this on a regular basis for months, but this one follows the company reportedly <a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-is-reportedly-pulling-back-on-stuffing-windows-11-with-ai-and-i-couldnt-be-happier">pulling back on stuffing Windows 11 with AI</a>. </p><p>The name of the game here is optimization and upgrading the quality of life of using Windows, and these new features make me cautiously optimistic that we’re heading in the right direction.</p><h2 id="the-taskbar-is-getting-more-helpful">The Taskbar is getting more helpful</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="KFH472wUKHSPF9egYBenug" name="Autohide Windows 11 taskbar" alt="The taskbar settings menu in Windows 11." src="https://cdn.mos.cms.futurecdn.net/KFH472wUKHSPF9egYBenug.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>First of all, there is now an option to run a network speed test directly from the taskbar — great for helping check network performance or identify any issues if you’re not seeing pages load.</p><p>Also, shout-out to the improvement that doesn’t move multiple windows of the same app into an overflow area, and just uses the space available on the bar itself.</p><h2 id="faster-wake-up-times-for-your-pc">Faster ‘wake up’ times for your PC</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xaL6EAfk6hDbtBpCjbgkfM" name="win11widgets2025" alt="Windows 11 lock screen widgets in action" src="https://cdn.mos.cms.futurecdn.net/xaL6EAfk6hDbtBpCjbgkfM.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Microsoft has made some performance improvements and optimized how Windows resumes from “sleep” mode. If you’ve ever felt like your laptop takes a while to wake up when you leave a lot of apps open before closing the lid, this update specifically targets that.</p><p>You can expect your system (be it notebook or desktop) to feel snappier when you wake it up, which should bring some equality between the zippy Snapdragon X Elite systems and those from Intel and AMD.</p><h2 id="camera-control">Camera control</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="beQ8MGurtXAZXdLqj7APRN" name="Logitech MX Master Series-5" alt="The Logitech MX Brio webcam perched on top of a display" src="https://cdn.mos.cms.futurecdn.net/beQ8MGurtXAZXdLqj7APRN.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Tired of AI trying to frame your face on the webcam? Now there are manual controls! Within “Bluetooth & devices” settings, you’re now able to control the pan and tilt for supported cameras.</p><p>This is because it’s often easy to trick AI framing, and many people may not want dramatic zooms that are out of their control.</p><h2 id="that-s-not-all">That’s not all…</h2><p>There are other noteworthy updates coming, too, and all of them seem to indicate a shift from Microsoft towards “pulling back” from stuffing Windows 11 with AI. Not groundbreaking, but useful features and optimizations:</p><ul><li>You’ll finally be able to set .webp image files as your desktop wallpaper.</li><li>The “Storage Settings” page is now much faster at scanning for temporary files to help you reclaim disk space.</li><li>Windows update page now responds faster when you click “Check for updates.”</li><li>New emoji alongside the <a href="https://www.unicode.org/emoji/charts-16.0/emoji-released.html" target="_blank" rel="nofollow">16.0 release</a> — including a harp, splatter and a face with bags under eyes (hard relate).</li></ul><p>Of course, we have a long way to go in the area of bringing Windows 11 back to the promised land. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2880px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4UDFLABpZ6ZXYTvrdZRmdQ" name="Screenshot (6) (2024-06-18T17_23_42.980).png" alt="Copilot+ PCs" src="https://cdn.mos.cms.futurecdn.net/4UDFLABpZ6ZXYTvrdZRmdQ.png" mos="" align="middle" fullscreen="" width="2880" height="1620" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Optimizations and efficiencies need to be made to help the OS run smoother (using less memory that is currently being consumed in the <a href="https://www.tomsguide.com/computing/ram-prices-are-exploding-heres-why-and-everything-you-need-to-know-about-surviving-ramageddon">RAM crisis</a>), and my dream would be to see Microsoft tackle the many unnecessary pop-ups promoting different services to subscribe to, alongside the ads.</p><p>But this is definitely a small step in the right direction. These features are all on gradual rollout, so don’t expect to see them all immediately if you’re on the Windows Insider program!</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/windows-operating-systems/windows-10-users-warned-to-upgrade-now-or-risk-a-degraded-security-state-as-microsoft-ends-secure-boot-support">Windows 10 users warned to upgrade now or risk a ‘degraded security state’ as Microsoft ends Secure Boot support</a></li><li><a href="https://www.tomsguide.com/computing/macos/apple-buried-these-5-essential-mac-file-management-features-heres-how-to-find-and-use-them">Apple buried these 5 essential Mac file management features — here's how to use them</a></li><li><a href="https://www.tomsguide.com/computing/operating-systems/googles-leaked-aluminum-os-might-be-the-chromeos-pro-ive-waited-years-for-is-it-finally-time-to-ditch-windows-11-for-good">'Google’s leaked Aluminum OS looks like the ChromeOS I've waited years for': why I might actually ditch Windows 11</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/windows-operating-systems/windows-11-is-getting-3-new-features-in-a-major-quality-of-life-update-is-microsoft-starting-to-pull-back-on-ai-slop</link>
                                                                            <description>
                            <![CDATA[ Microsoft just issued a Windows 11 Release Preview build that previews a bunch of new features coming to the OS. The team at Redmond has been doing this on a regular basis for months, but this one follows the company reportedly pulling back on stuffing Windows 11 with AI. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">UoQW2XvgNzqgSkrG3oA56R</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/eLwm3CRPxvUCFxnXG5QAcF-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 18 Feb 2026 11:28:08 +0000</pubDate>                                                                                                                                <updated>Thu, 19 Feb 2026 18:10:09 +0000</updated>
                                                                                                                                            <category><![CDATA[Windows Operating Systems]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Software]]></category>
                                                    <category><![CDATA[Operating Systems]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6.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/eLwm3CRPxvUCFxnXG5QAcF-1280-80.jpg">
                                                            <media:credit><![CDATA[sdx15 / Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A laptop running Windows 11, representing an article about how to use task scheduler on windows]]></media:description>                                                            <media:text><![CDATA[A laptop running Windows 11, representing an article about how to use task scheduler on windows]]></media:text>
                                <media:title type="plain"><![CDATA[A laptop running Windows 11, representing an article about how to use task scheduler on windows]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/eLwm3CRPxvUCFxnXG5QAcF-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Microsoft just issued a <a href="https://blogs.windows.com/windows-insider/2026/02/17/releasing-windows-11-builds-26100-7918-and-26200-7918-to-the-release-preview-channel/" target="_blank" rel="nofollow">Windows 11 Release Preview build</a> that previews a bunch of new features coming to the OS. </p><p>The team at Redmond has been doing this on a regular basis for months, but this one follows the company reportedly <a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-is-reportedly-pulling-back-on-stuffing-windows-11-with-ai-and-i-couldnt-be-happier">pulling back on stuffing Windows 11 with AI</a>. </p><p>The name of the game here is optimization and upgrading the quality of life of using Windows, and these new features make me cautiously optimistic that we’re heading in the right direction.</p><h2 id="the-taskbar-is-getting-more-helpful">The Taskbar is getting more helpful</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="KFH472wUKHSPF9egYBenug" name="Autohide Windows 11 taskbar" alt="The taskbar settings menu in Windows 11." src="https://cdn.mos.cms.futurecdn.net/KFH472wUKHSPF9egYBenug.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>First of all, there is now an option to run a network speed test directly from the taskbar — great for helping check network performance or identify any issues if you’re not seeing pages load.</p><p>Also, shout-out to the improvement that doesn’t move multiple windows of the same app into an overflow area, and just uses the space available on the bar itself.</p><h2 id="faster-wake-up-times-for-your-pc">Faster ‘wake up’ times for your PC</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xaL6EAfk6hDbtBpCjbgkfM" name="win11widgets2025" alt="Windows 11 lock screen widgets in action" src="https://cdn.mos.cms.futurecdn.net/xaL6EAfk6hDbtBpCjbgkfM.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Microsoft has made some performance improvements and optimized how Windows resumes from “sleep” mode. If you’ve ever felt like your laptop takes a while to wake up when you leave a lot of apps open before closing the lid, this update specifically targets that.</p><p>You can expect your system (be it notebook or desktop) to feel snappier when you wake it up, which should bring some equality between the zippy Snapdragon X Elite systems and those from Intel and AMD.</p><h2 id="camera-control">Camera control</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="beQ8MGurtXAZXdLqj7APRN" name="Logitech MX Master Series-5" alt="The Logitech MX Brio webcam perched on top of a display" src="https://cdn.mos.cms.futurecdn.net/beQ8MGurtXAZXdLqj7APRN.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Tired of AI trying to frame your face on the webcam? Now there are manual controls! Within “Bluetooth & devices” settings, you’re now able to control the pan and tilt for supported cameras.</p><p>This is because it’s often easy to trick AI framing, and many people may not want dramatic zooms that are out of their control.</p><h2 id="that-s-not-all">That’s not all…</h2><p>There are other noteworthy updates coming, too, and all of them seem to indicate a shift from Microsoft towards “pulling back” from stuffing Windows 11 with AI. Not groundbreaking, but useful features and optimizations:</p><ul><li>You’ll finally be able to set .webp image files as your desktop wallpaper.</li><li>The “Storage Settings” page is now much faster at scanning for temporary files to help you reclaim disk space.</li><li>Windows update page now responds faster when you click “Check for updates.”</li><li>New emoji alongside the <a href="https://www.unicode.org/emoji/charts-16.0/emoji-released.html" target="_blank" rel="nofollow">16.0 release</a> — including a harp, splatter and a face with bags under eyes (hard relate).</li></ul><p>Of course, we have a long way to go in the area of bringing Windows 11 back to the promised land. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2880px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4UDFLABpZ6ZXYTvrdZRmdQ" name="Screenshot (6) (2024-06-18T17_23_42.980).png" alt="Copilot+ PCs" src="https://cdn.mos.cms.futurecdn.net/4UDFLABpZ6ZXYTvrdZRmdQ.png" mos="" align="middle" fullscreen="" width="2880" height="1620" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Optimizations and efficiencies need to be made to help the OS run smoother (using less memory that is currently being consumed in the <a href="https://www.tomsguide.com/computing/ram-prices-are-exploding-heres-why-and-everything-you-need-to-know-about-surviving-ramageddon">RAM crisis</a>), and my dream would be to see Microsoft tackle the many unnecessary pop-ups promoting different services to subscribe to, alongside the ads.</p><p>But this is definitely a small step in the right direction. These features are all on gradual rollout, so don’t expect to see them all immediately if you’re on the Windows Insider program!</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/windows-operating-systems/windows-10-users-warned-to-upgrade-now-or-risk-a-degraded-security-state-as-microsoft-ends-secure-boot-support">Windows 10 users warned to upgrade now or risk a ‘degraded security state’ as Microsoft ends Secure Boot support</a></li><li><a href="https://www.tomsguide.com/computing/macos/apple-buried-these-5-essential-mac-file-management-features-heres-how-to-find-and-use-them">Apple buried these 5 essential Mac file management features — here's how to use them</a></li><li><a href="https://www.tomsguide.com/computing/operating-systems/googles-leaked-aluminum-os-might-be-the-chromeos-pro-ive-waited-years-for-is-it-finally-time-to-ditch-windows-11-for-good">'Google’s leaked Aluminum OS looks like the ChromeOS I've waited years for': why I might actually ditch Windows 11</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Xbox Live outage — login and game save syncing issues affected millions globally ]]></title>
                                                                                                <dc:content><![CDATA[ <div class="live-content"><p>On Tuesday, February 17, Xbox Live ran into trouble, with complaints skyrocketing after 10am ET. Microsoft itself admitted there's an issue on its <a href="https://support.xbox.com/en-GB/xbox-live-status">status page</a>, under "Games and gaming." This issue has now been fixed!</p><p>Some users reported not being able to login to their games with Xbox. While we haven't been able to replicate this in either the U.S. or U.K., there was definitely an issue with game save syncs — being unable to upload save data to the cloud to be synced across devices.</p></div><div class="live-content"><time datetime="2026-02-17T15:37:45+00:00">February 17, 2026 – 10:37 AM</time><h2 id="ouch-that-s-a-nasty-spike">Ouch, that's a nasty spike</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:928px;"><p class="vanilla-image-block" style="padding-top:52.91%;"><img id="TUckiGzo96Df4Mw8UWzaUB" name="Screenshot 2026-02-17 at 15.40.19" alt="A Downdetector graph showing a spike in Xbox Live issues" src="https://cdn.mos.cms.futurecdn.net/TUckiGzo96Df4Mw8UWzaUB.jpg" mos="" align="middle" fullscreen="" width="928" height="491" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Downdetector)</span></figcaption></figure><p>We've been keeping an eye on this <a href="https://downdetector.com/status/xbox-live/" target="_blank">Downdetector chart</a> for the past hour or so, and so far the numbers have kept climbing. But unlike your level in an RPG or the damage output of your favorite FPS weapon, this is a number we don't want to be large.</p></div><div class="live-content"><time datetime="2026-02-17T15:45:28+00:00">February 17, 2026 – 10:45 AM</time><h2 id="what-s-microsoft-saying">What's Microsoft saying?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2856px;"><p class="vanilla-image-block" style="padding-top:77.80%;"><img id="GJQi6xqxWSWJY4rcBPGHzR" name="Screenshot 2026-02-17 at 3.35.43 PM" alt="Screenshot of Microsoft's Xbox status page, showing problems with syncing game saves" src="https://cdn.mos.cms.futurecdn.net/GJQi6xqxWSWJY4rcBPGHzR.png" mos="" align="middle" fullscreen="" width="2856" height="2222" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Looking at Microsoft's own <a href="https://support.xbox.com/en-US/xbox-live-status" target="_blank">Xbox Status</a> page, we see a yellow warning sign for syncing games. So be careful if you've not backed up your saves recently - you may want to wait to try until after whatever issue we're having has passed.</p></div><div class="live-content"><time datetime="2026-02-17T15:50:07+00:00">February 17, 2026 – 10:50 AM</time><h2 id="xbox-on-x-s-last-transmission">Xbox on X's last transmission</h2><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2023759489913000347"><p lang="en" dir="ltr">wait here. the games will be with you shortly.https://t.co/6bYat5e5Vg pic.twitter.com/kzMw3d9I1q<a href="https://twitter.com/cantworkitout/status/2023759489913000347">February 17, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>There's nothing on any of <a href="https://x.com/Xbox">Xbox</a>'s official X accounts, including <a href="https://x.com/XboxSupport" target="_blank">Xbox Support</a>. The most recent official message was from <a href="https://x.com/XboxGamePass/status/2023759489913000347" target="_blank">Xbox Game Pass</a>, announcing the latest batch of games. It may be a coincidence, but that is around the time outage reports began to climb.</p></div><div class="live-content"><time datetime="2026-02-17T15:57:09+00:00">February 17, 2026 – 10:57 AM</time><h2 id="no-log-in-issues-but-other-problems">No log-in issues, but other problems?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1202px;"><p class="vanilla-image-block" style="padding-top:77.70%;"><img id="BQCp4zUhcfnM6jkEHYi4L7" name="Screenshot 2026-02-17 155059" alt="Screenshot of Cities: Skylines II on Game Pass, showing a problem with save syncing" src="https://cdn.mos.cms.futurecdn.net/BQCp4zUhcfnM6jkEHYi4L7.png" mos="" align="middle" fullscreen="" width="1202" height="934" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Some users seem to be having problems logging into Xbox in the first place, but we're not having that same trouble. The most we're seeing is a save-syncing issue - when trying to save Cities: Skylines II in the screenshot above, the sync hung on 26% for a whole five minutes.</p></div><div class="live-content"><time datetime="2026-02-17T15:59:42+00:00">February 17, 2026 – 10:59 AM</time><h2 id="is-it-over">Is it over?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2240px;"><p class="vanilla-image-block" style="padding-top:35.49%;"><img id="MhbYdmeT3v7KWSgF9CRffU" name="Down detector" alt="Down detector" src="https://cdn.mos.cms.futurecdn.net/MhbYdmeT3v7KWSgF9CRffU.png" mos="" align="middle" fullscreen="" width="2240" height="795" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Down detector)</span></figcaption></figure><p>The Down Detector spike has quickly dropped off. But in our own testing, that game save sync is still hung on 26%. Closed and reopened the app and still issues. We're keeping a close eye on it.</p></div><div class="live-content"><time datetime="2026-02-17T16:01:23+00:00">February 17, 2026 – 11:01 AM</time><h2 id="microsoft-says-the-issues-aren-t-over-yet">Microsoft says the issues aren't over yet</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2856px;"><p class="vanilla-image-block" style="padding-top:77.80%;"><img id="GJQi6xqxWSWJY4rcBPGHzR" name="Screenshot 2026-02-17 at 3.35.43 PM" alt="Screenshot of Microsoft's Xbox status page, showing problems with syncing game saves" src="https://cdn.mos.cms.futurecdn.net/GJQi6xqxWSWJY4rcBPGHzR.png" mos="" align="middle" fullscreen="" width="2856" height="2222" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Another look at the <a href="https://support.xbox.com/en-us/xbox-live-status" target="_blank" rel="nofollow">Xbox Live status page</a> shows the issue hasn't been resolved yet.</p></div><div class="live-content"><time datetime="2026-02-17T16:05:14+00:00">February 17, 2026 – 11:05 AM</time><h2 id="game-save-syncs-still-not-working">Game save syncs still not working</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1202px;"><p class="vanilla-image-block" style="padding-top:77.70%;"><img id="BQCp4zUhcfnM6jkEHYi4L7" name="Screenshot 2026-02-17 155059" alt="Screenshot of Cities: Skylines II on Steam, shwoing a problem with save syncing" src="https://cdn.mos.cms.futurecdn.net/BQCp4zUhcfnM6jkEHYi4L7.png" mos="" align="middle" fullscreen="" width="1202" height="934" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>No word of a joke, I've closed and reopened the Xbox app multiple times, and it's still showing 26%.</p></div><div class="live-content"><time datetime="2026-02-17T16:14:13+00:00">February 17, 2026 – 11:14 AM</time><h2 id="breaking-game-save-syncing-is-working">BREAKING: Game Save syncing is working</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PtVw5awy5sZVwBKxtxZvYF" name="Xbox Live.shutterstock_2445135485.jpg" alt="Xbox Live logo" src="https://cdn.mos.cms.futurecdn.net/PtVw5awy5sZVwBKxtxZvYF.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Both in the U.S. and the U.K., Xbox Live cloud game saves are working. Not only that, but logins are working both on the PC Xbox app and Xbox consoles. Based on this confirmation and our methods of analyzing outages showing the service as running, I'm happy to say the outage is resolved.</p><p>We'll keep a close eye on the situation — just in case the mitigation causes any further issues.</p></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/news/live/xbox-live-outage-february-2026</link>
                                                                            <description>
                            <![CDATA[ Microsoft's Xbox Live gaming service ran into issues today — impacting logins and game save cloud syncing. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">JSjSoPmuqzZdBhvVetnGdV</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/PtVw5awy5sZVwBKxtxZvYF-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 17 Feb 2026 15:41:02 +0000</pubDate>                                                                                                                                <updated>Tue, 17 Feb 2026 16:14:14 +0000</updated>
                                                                                                                                            <category><![CDATA[Xbox]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                <author><![CDATA[ richard.priday@futurenet.com (Richard Priday) ]]></author>                    <dc:creator><![CDATA[ Richard Priday ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/H8H8NuPiz5fYjKkGVnSDjV.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Richard is a writer based in London, covering news, reviews, how-tos and buying guides for mobile devices like smartphones, tablets and laptops, as well as other topics like gaming and audio.&lt;/p&gt;
&lt;p&gt;He has an impractically large collection of devices, gathered over his five years in tech journalism. Using this broad stock of gadgets, he can compare and contrast a new product&#039;s features with similar devices&#039;, and figure out if something&#039;s a new class leader, or if a different gadget can do what it does better.&lt;/p&gt;
&lt;p&gt;While he enjoys writing about the latest iPhones and Samsung Galaxys, he&#039;s also an advocate of buying cheaper, refurbished and second-hand devices. He hopes that he can help gadget buyers to cut through the hype around new products, and upgrade to something that suits their needs and budget every time, whether it&#039;s brand new or pre-owned.&lt;/p&gt;
&lt;p&gt;Richard has an M.A. in Magazine Journalism from the University of Sheffield&#039;s world-renowned Department of Journalism Studies, and has also written for WIRED U.K., The Register and Creative Bloq. Aside from mobile devices, he also has a great appreciation for specialty coffee, and is never seen in the office without his Aeropress close at hand.&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/PtVw5awy5sZVwBKxtxZvYF-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Xbox Live logo]]></media:description>                                                            <media:text><![CDATA[Xbox Live logo]]></media:text>
                                <media:title type="plain"><![CDATA[Xbox Live logo]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/PtVw5awy5sZVwBKxtxZvYF-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div class="live-content"><p>On Tuesday, February 17, Xbox Live ran into trouble, with complaints skyrocketing after 10am ET. Microsoft itself admitted there's an issue on its <a href="https://support.xbox.com/en-GB/xbox-live-status">status page</a>, under "Games and gaming." This issue has now been fixed!</p><p>Some users reported not being able to login to their games with Xbox. While we haven't been able to replicate this in either the U.S. or U.K., there was definitely an issue with game save syncs — being unable to upload save data to the cloud to be synced across devices.</p></div><div class="live-content"><time datetime="2026-02-17T15:37:45+00:00">February 17, 2026 – 10:37 AM</time><h2 id="ouch-that-s-a-nasty-spike">Ouch, that's a nasty spike</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:928px;"><p class="vanilla-image-block" style="padding-top:52.91%;"><img id="TUckiGzo96Df4Mw8UWzaUB" name="Screenshot 2026-02-17 at 15.40.19" alt="A Downdetector graph showing a spike in Xbox Live issues" src="https://cdn.mos.cms.futurecdn.net/TUckiGzo96Df4Mw8UWzaUB.jpg" mos="" align="middle" fullscreen="" width="928" height="491" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Downdetector)</span></figcaption></figure><p>We've been keeping an eye on this <a href="https://downdetector.com/status/xbox-live/" target="_blank">Downdetector chart</a> for the past hour or so, and so far the numbers have kept climbing. But unlike your level in an RPG or the damage output of your favorite FPS weapon, this is a number we don't want to be large.</p></div><div class="live-content"><time datetime="2026-02-17T15:45:28+00:00">February 17, 2026 – 10:45 AM</time><h2 id="what-s-microsoft-saying">What's Microsoft saying?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2856px;"><p class="vanilla-image-block" style="padding-top:77.80%;"><img id="GJQi6xqxWSWJY4rcBPGHzR" name="Screenshot 2026-02-17 at 3.35.43 PM" alt="Screenshot of Microsoft's Xbox status page, showing problems with syncing game saves" src="https://cdn.mos.cms.futurecdn.net/GJQi6xqxWSWJY4rcBPGHzR.png" mos="" align="middle" fullscreen="" width="2856" height="2222" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Looking at Microsoft's own <a href="https://support.xbox.com/en-US/xbox-live-status" target="_blank">Xbox Status</a> page, we see a yellow warning sign for syncing games. So be careful if you've not backed up your saves recently - you may want to wait to try until after whatever issue we're having has passed.</p></div><div class="live-content"><time datetime="2026-02-17T15:50:07+00:00">February 17, 2026 – 10:50 AM</time><h2 id="xbox-on-x-s-last-transmission">Xbox on X's last transmission</h2><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2023759489913000347"><p lang="en" dir="ltr">wait here. the games will be with you shortly.https://t.co/6bYat5e5Vg pic.twitter.com/kzMw3d9I1q<a href="https://twitter.com/cantworkitout/status/2023759489913000347">February 17, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>There's nothing on any of <a href="https://x.com/Xbox">Xbox</a>'s official X accounts, including <a href="https://x.com/XboxSupport" target="_blank">Xbox Support</a>. The most recent official message was from <a href="https://x.com/XboxGamePass/status/2023759489913000347" target="_blank">Xbox Game Pass</a>, announcing the latest batch of games. It may be a coincidence, but that is around the time outage reports began to climb.</p></div><div class="live-content"><time datetime="2026-02-17T15:57:09+00:00">February 17, 2026 – 10:57 AM</time><h2 id="no-log-in-issues-but-other-problems">No log-in issues, but other problems?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1202px;"><p class="vanilla-image-block" style="padding-top:77.70%;"><img id="BQCp4zUhcfnM6jkEHYi4L7" name="Screenshot 2026-02-17 155059" alt="Screenshot of Cities: Skylines II on Game Pass, showing a problem with save syncing" src="https://cdn.mos.cms.futurecdn.net/BQCp4zUhcfnM6jkEHYi4L7.png" mos="" align="middle" fullscreen="" width="1202" height="934" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Some users seem to be having problems logging into Xbox in the first place, but we're not having that same trouble. The most we're seeing is a save-syncing issue - when trying to save Cities: Skylines II in the screenshot above, the sync hung on 26% for a whole five minutes.</p></div><div class="live-content"><time datetime="2026-02-17T15:59:42+00:00">February 17, 2026 – 10:59 AM</time><h2 id="is-it-over">Is it over?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2240px;"><p class="vanilla-image-block" style="padding-top:35.49%;"><img id="MhbYdmeT3v7KWSgF9CRffU" name="Down detector" alt="Down detector" src="https://cdn.mos.cms.futurecdn.net/MhbYdmeT3v7KWSgF9CRffU.png" mos="" align="middle" fullscreen="" width="2240" height="795" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Down detector)</span></figcaption></figure><p>The Down Detector spike has quickly dropped off. But in our own testing, that game save sync is still hung on 26%. Closed and reopened the app and still issues. We're keeping a close eye on it.</p></div><div class="live-content"><time datetime="2026-02-17T16:01:23+00:00">February 17, 2026 – 11:01 AM</time><h2 id="microsoft-says-the-issues-aren-t-over-yet">Microsoft says the issues aren't over yet</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2856px;"><p class="vanilla-image-block" style="padding-top:77.80%;"><img id="GJQi6xqxWSWJY4rcBPGHzR" name="Screenshot 2026-02-17 at 3.35.43 PM" alt="Screenshot of Microsoft's Xbox status page, showing problems with syncing game saves" src="https://cdn.mos.cms.futurecdn.net/GJQi6xqxWSWJY4rcBPGHzR.png" mos="" align="middle" fullscreen="" width="2856" height="2222" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Another look at the <a href="https://support.xbox.com/en-us/xbox-live-status" target="_blank" rel="nofollow">Xbox Live status page</a> shows the issue hasn't been resolved yet.</p></div><div class="live-content"><time datetime="2026-02-17T16:05:14+00:00">February 17, 2026 – 11:05 AM</time><h2 id="game-save-syncs-still-not-working">Game save syncs still not working</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1202px;"><p class="vanilla-image-block" style="padding-top:77.70%;"><img id="BQCp4zUhcfnM6jkEHYi4L7" name="Screenshot 2026-02-17 155059" alt="Screenshot of Cities: Skylines II on Steam, shwoing a problem with save syncing" src="https://cdn.mos.cms.futurecdn.net/BQCp4zUhcfnM6jkEHYi4L7.png" mos="" align="middle" fullscreen="" width="1202" height="934" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>No word of a joke, I've closed and reopened the Xbox app multiple times, and it's still showing 26%.</p></div><div class="live-content"><time datetime="2026-02-17T16:14:13+00:00">February 17, 2026 – 11:14 AM</time><h2 id="breaking-game-save-syncing-is-working">BREAKING: Game Save syncing is working</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PtVw5awy5sZVwBKxtxZvYF" name="Xbox Live.shutterstock_2445135485.jpg" alt="Xbox Live logo" src="https://cdn.mos.cms.futurecdn.net/PtVw5awy5sZVwBKxtxZvYF.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Both in the U.S. and the U.K., Xbox Live cloud game saves are working. Not only that, but logins are working both on the PC Xbox app and Xbox consoles. Based on this confirmation and our methods of analyzing outages showing the service as running, I'm happy to say the outage is resolved.</p><p>We'll keep a close eye on the situation — just in case the mitigation causes any further issues.</p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 'Concentrate on keeping it simple': Bill Gates wanted PCs to be straightforward, and Windows 11’s AI push is a betrayal ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Microsoft has seen better days. The last few months have shown <a href="https://www.tomsguide.com/news/live/windows-10-end-of-support-2025">Windows 10 reach its end of life</a>, much to the disappointment of <em>many</em>, while the tech giant's <a href="https://www.businessinsider.com/stock-market-today-tech-selloff-microsoft-earnings-capex-sp500-nasdaq-2026-1" target="_blank">stock took a 10% dive</a>, the biggest it's had since 2020. </p><p>The common thread for this rough patch? <a href="https://www.tomsguide.com/ai/copilot/microsoft-copilot-what-it-is-and-how-it-works">Microsoft Copilot</a>, or in other words, the push for AI on Windows 11. When we see Copilot icons slapped on every app and interface of the operating system, to the point that you have to <a href="https://x.com/linusgsebastian/status/2015948530578587699" target="_blank"><em>sign in </em>to Paint</a>, there's a good reason users have felt the sting and coined the admittedly hard term "<a href="https://www.tomsguide.com/computing/windows-operating-systems/we-need-to-improve-windows-in-ways-that-are-meaningful-for-people-microsoft-is-urgently-trying-to-fix-windows-11-issues">MicroSlop</a>."</p><p>This is the <a href="https://www.tomsguide.com/computing/laptops/2026-will-be-the-year-of-the-laptop-but-will-they-actually-be-affordable">year of the laptop</a>, and it's no secret that Microsoft's OS should be a huge driving force for this, especially with the advancements <a href="https://www.tomsguide.com/computing/i-tried-gaming-on-an-intel-core-ultra-series-3-chip-and-it-kicks-off-a-new-era-of-pc-gaming">Intel Core Ultra Series 3</a> chips are showing. But with its focus on AI, it appears the company has shifted its priorities. Namely, with its <a href="https://www.tomsguide.com/computing/online-security/microsofts-first-patch-tuesday-of-2026-fixes-over-100-bugs-and-one-active-zero-day-flaw-dont-wait-to-update-your-pc">first patch of 2026,</a> set to fix over 100 bugs, resulting in a <a href="https://www.tomsguide.com/computing/microsoft-needed-a-win-with-windows-latest-update-but-even-its-fix-needed-fixing">plague of bigger issues</a>. </p><p>In light of this, it's clear that this has left a stain on Windows' legacy, so much so that Microsoft aims to rectify this by <a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-is-reportedly-pulling-back-on-stuffing-windows-11-with-ai-and-i-couldnt-be-happier">"pulling back" on stuffing Windows 11 with AI</a>. However, perhaps it should never have reached this point in the first place, if the words of Microsoft co-founder Bill Gates are anything to go by.</p><p>As Jason England of Tom's Guide noted, Gates' vision for Microsoft PCs was simpler, and right now, <a href="https://www.tomsguide.com/reviews/windows-11">Windows 11</a> is the complete opposite. </p><h2 id="keep-it-simple-microsoft">Keep it simple, Microsoft</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="htJtE2TbsB4Tfmo8YuN7Te" name="Microsoft OpenAI.jpg" alt="Microsoft Logo with Open AI logo on phone" src="https://cdn.mos.cms.futurecdn.net/htJtE2TbsB4Tfmo8YuN7Te.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>During an interview in 1986 from <a href="https://programmersatwork.wordpress.com/bill-gates-1986/" target="_blank">Programmers at Work: 1st Generation</a>, Gates talks about his time as the CEO of Microsoft, along with navigating the advancements of computing at the time. With PCs becoming more powerful, programs became trickier to work with. </p><p>When asked what the most difficult part of computer programming was, though, one quote stands out that resonates with what Windows has become today. </p><p>"The hardest part is deciding what the algorithms are, and then simplifying them as much as you can. It’s difficult to get things down to their simplest forms. You have to simulate in your mind how the program’s going to work, and you have to have a complete grasp of how the various pieces of the program work together."</p><div><blockquote><p>The finest pieces of software are those where one individual has a complete sense of exactly how the program works. To have that, you have to really love the program and concentrate on keeping it simple, to an incredible degree</p><p>Bill Gates, Co-Founder of Microsoft</p></blockquote></div><p>Gates continues: "The finest pieces of software are those where one individual has a complete sense of exactly how the program works. To have that, you have to really love the program and concentrate on keeping it simple, to an incredible degree." </p><p>Essentially, for new software to work on an operating system and integrate with what's already working, it needs to be simple. With the countless number of features Microsoft has implemented into its OS since then, from Windows 7 to Windows 11, I can only imagine that's a hard task. But it's telling that Copilot hasn't abided by these words. </p><p>A few years later, in 1992, Gates spoke with <a href="https://25iq.com/quotations/bill-gates" target="_blank">Profit magazine</a>, following up on the state of advancing its OS alongside the evolution of PCs. </p><p>“Five years ago, a lot of improvements in applications were just throwing features in.  Now we have to understand what people want to do, what makes it hard to do those things, and design the interface around those ideas.”</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ey1jve"></div>                            </div>                            <script src="https://kwizly.com/embed/ey1jve.js" async></script><p>In recent years, the boom in AI services like <a href="https://www.tomsguide.com/news/chatgpt">ChatGPT</a>, <a href="https://www.tomsguide.com/ai/google-gemini/gemini-3-is-here-googles-most-powerful-ai-model-yet-is-crushing-benchmarks-improving-search-and-outperforming-chatgpt">Gemini</a> and yes, even <a href="https://www.tomsguide.com/ai/copilot/microsoft-copilot-what-it-is-and-how-it-works">Copilot</a> itself, appeared to be the next stage in computing. It seemed to be the right bet, as we've seen how artificial intelligence has made <a href="https://www.tomsguide.com/computing/laptops/heres-5-things-an-npu-can-do-for-your-laptop-ai-smarts-youll-actually-use-without-realizing-it">improvements in the way we work</a>, interact with the world (using <a href="https://www.tomsguide.com/ai/i-wore-ray-ban-meta-display-smart-glasses-to-watch-the-super-bowl-halftime-show-and-understood-bad-bunny-in-real-time">Ray-Ban Meta Display smart glasses to translate Bad Bunny's Super Bowl halftime show</a>) and certainly in the way we game (<a href="https://www.tomsguide.com/gaming/pc-gaming/nvidia-dlss-4-5-brings-another-ai-leap-forward-for-pc-gaming-4k-path-traced-gameplay-at-240-fps-and-everything-else-you-need-to-know">Nvidia's DLSS 4.5</a>, as the most recent example). </p><p>But then there are AI features like the controversial <a href="https://www.tomsguide.com/computing/windows-operating-systems/microsofts-controversial-recall-is-back-but-only-if-youre-a-windows-insider">Windows Recall</a>, the inclusion of Copilot in apps and settings that aren't needed, and more. This is notable, as it goes against Gates' stating "we have to understand what people want to do." And the people have spoken, too. </p><p>When we asked "How do you feel about Microsoft potentially scaling back AI features in Windows 11?" in a poll, 68% of responders chose that they wanted a master "OFF" switch for all of it, while 31% said it's about time to clean up the bloat. Notably, <em>no one </em>picked "I actually use those features."</p><h2 id="making-amends">Making amends</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="QHW3MVwrGTn4VrsrGmU2dU" name="surface-laptop-lede" alt="Microsoft Surface Laptop 2024" src="https://cdn.mos.cms.futurecdn.net/QHW3MVwrGTn4VrsrGmU2dU.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Gates' words ring more true than ever today. With a bloated Windows 11 stuffed with AI, leading to further bugs, sluggish performance, and an AI assistant around every corner that nearly demands a smart way to work in... Paint, the frustration is tangible. </p><p>But Microsoft appears to be taking heed. President of Windows and devices, Pavan Davuluri, has <a href="https://www.tomsguide.com/computing/windows-operating-systems/we-need-to-improve-windows-in-ways-that-are-meaningful-for-people-microsoft-is-urgently-trying-to-fix-windows-11-issues">addressed Windows 11's issues</a>, stating: "The feedback we’re receiving from our community of passionate customers and Windows Insiders has been clear. We need to improve Windows in ways that are meaningful for people."</p><p>That echoes what Gates said decades ago and is a good sign that Windows as a whole is making a comeback. How will these fixes look? I'm not sure, but we're already catching word that Microsoft plans to ditch OpenAI, as Jezz Corden of <a href="https://www.windowscentral.com/artificial-intelligence/microsoft-confirms-plan-to-ditch-openai-as-the-chatgpt-firm-continues-to-beg-big-tech-for-cash" target="_blank">Windows Central</a> reports, meaning ChatGPT won't continue to take over Microsoft's AI push. </p><p>Microsoft appears to be going back to the drawing board, and if anything, this will follow Gates' remarks of keeping things "simple." So far, Windows 11 may have been a betrayal of these words, but Microsoft is rightfully trying to gain the trust of its users back. </p><p>For now, it's looking like the <a href="https://www.tomsguide.com/ai/chatgpts-sam-altman-says-were-in-an-ai-bubble-heres-what-that-means-and-why-it-matters">AI bubble</a> might burst after all — for Microsoft, at least.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/quitgpt-is-going-viral-heres-why-people-are-cancelling-chatgpt">QuitGPT is going viral — here’s why people are cancelling ChatGPT</a></li><li><a href="https://www.tomsguide.com/computing/hardware/you-have-to-work-around-the-supply-chain-acer-exec-on-plans-to-bypass-the-big-three-to-save-us-from-the-ram-price-crisis">RAM prices keep rising in 2026 — Acer exec says PC makers may bypass major suppliers to keep laptops affordable</a></li><li><a href="https://www.tomsguide.com/computing/laptops/hp-wants-you-to-rent-your-next-laptop-heres-why-thats-a-terrible-idea">HP wants you to rent your next laptop — I did the math and it's actually terrifying</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/concentrate-on-keeping-it-simple-bill-gates-wanted-pcs-to-be-straightforward-and-windows-11s-ai-push-is-a-betrayal</link>
                                                                            <description>
                            <![CDATA[ Microsoft's push for AI has made Windows 11 a mess for many, and it's going against Bill Gates' vision of PCs by "keeping it simple." ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">STc4uzHqYTTZU75Q7GxFng</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/MeoxtgfY72wiRFYxXTrryZ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 13 Feb 2026 13:56:58 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Computing]]></category>
                                                                                                                    <dc:creator><![CDATA[ Darragh Murphy ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/5QiaTSWf9FcVB7STxcdo4M.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Darragh is Tom’s Guide’s Computing Editor and is fascinated by all things bizarre in tech. This usually leads to assorted coverage varying from washing machines designed for earbuds to the wild world of laptops. Whether it&#039;s connecting Scar from The Lion King to two-factor authentication or turning his love for laptops into a fabricated rap battle from 8 Mile, he believes there’s always a quirky spin to be made.&lt;br&gt;&lt;br&gt;Darragh has previously been an Editor for Laptop Mag and a News Editor for Time Out Dubai, where he also headed the gaming and tech section. His work can be seen in Mashable, Android Police, Shortlist Dubai, Proton, theBit.nz, ReviewsFire and more. &lt;br&gt;&lt;br&gt;While laptops are his bread and butter, he’s also reviewed smartphones, monitors, speakers, docking stations and VPNs. He’s covered IFA, MWC Barcelona, the Consumer Electronics Show (&lt;a href=&quot;https://www.tomsguide.com/uk/tag/ces&quot; target=&quot;_blank&quot;&gt;CES&lt;/a&gt;) and more.&lt;br&gt;&lt;br&gt;When he&#039;s not checking out the latest devices and all things computing, he can be found going for dreaded long runs, watching terrible shark movies, and trying to find time to game.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/MeoxtgfY72wiRFYxXTrryZ-1280-80.jpg">
                                                            <media:credit><![CDATA[Mike Cohen/Getty Images for The New York Times]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Bill Gates in 2019]]></media:description>                                                            <media:text><![CDATA[Bill Gates in 2019]]></media:text>
                                <media:title type="plain"><![CDATA[Bill Gates in 2019]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/MeoxtgfY72wiRFYxXTrryZ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Microsoft has seen better days. The last few months have shown <a href="https://www.tomsguide.com/news/live/windows-10-end-of-support-2025">Windows 10 reach its end of life</a>, much to the disappointment of <em>many</em>, while the tech giant's <a href="https://www.businessinsider.com/stock-market-today-tech-selloff-microsoft-earnings-capex-sp500-nasdaq-2026-1" target="_blank">stock took a 10% dive</a>, the biggest it's had since 2020. </p><p>The common thread for this rough patch? <a href="https://www.tomsguide.com/ai/copilot/microsoft-copilot-what-it-is-and-how-it-works">Microsoft Copilot</a>, or in other words, the push for AI on Windows 11. When we see Copilot icons slapped on every app and interface of the operating system, to the point that you have to <a href="https://x.com/linusgsebastian/status/2015948530578587699" target="_blank"><em>sign in </em>to Paint</a>, there's a good reason users have felt the sting and coined the admittedly hard term "<a href="https://www.tomsguide.com/computing/windows-operating-systems/we-need-to-improve-windows-in-ways-that-are-meaningful-for-people-microsoft-is-urgently-trying-to-fix-windows-11-issues">MicroSlop</a>."</p><p>This is the <a href="https://www.tomsguide.com/computing/laptops/2026-will-be-the-year-of-the-laptop-but-will-they-actually-be-affordable">year of the laptop</a>, and it's no secret that Microsoft's OS should be a huge driving force for this, especially with the advancements <a href="https://www.tomsguide.com/computing/i-tried-gaming-on-an-intel-core-ultra-series-3-chip-and-it-kicks-off-a-new-era-of-pc-gaming">Intel Core Ultra Series 3</a> chips are showing. But with its focus on AI, it appears the company has shifted its priorities. Namely, with its <a href="https://www.tomsguide.com/computing/online-security/microsofts-first-patch-tuesday-of-2026-fixes-over-100-bugs-and-one-active-zero-day-flaw-dont-wait-to-update-your-pc">first patch of 2026,</a> set to fix over 100 bugs, resulting in a <a href="https://www.tomsguide.com/computing/microsoft-needed-a-win-with-windows-latest-update-but-even-its-fix-needed-fixing">plague of bigger issues</a>. </p><p>In light of this, it's clear that this has left a stain on Windows' legacy, so much so that Microsoft aims to rectify this by <a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-is-reportedly-pulling-back-on-stuffing-windows-11-with-ai-and-i-couldnt-be-happier">"pulling back" on stuffing Windows 11 with AI</a>. However, perhaps it should never have reached this point in the first place, if the words of Microsoft co-founder Bill Gates are anything to go by.</p><p>As Jason England of Tom's Guide noted, Gates' vision for Microsoft PCs was simpler, and right now, <a href="https://www.tomsguide.com/reviews/windows-11">Windows 11</a> is the complete opposite. </p><h2 id="keep-it-simple-microsoft">Keep it simple, Microsoft</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="htJtE2TbsB4Tfmo8YuN7Te" name="Microsoft OpenAI.jpg" alt="Microsoft Logo with Open AI logo on phone" src="https://cdn.mos.cms.futurecdn.net/htJtE2TbsB4Tfmo8YuN7Te.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>During an interview in 1986 from <a href="https://programmersatwork.wordpress.com/bill-gates-1986/" target="_blank">Programmers at Work: 1st Generation</a>, Gates talks about his time as the CEO of Microsoft, along with navigating the advancements of computing at the time. With PCs becoming more powerful, programs became trickier to work with. </p><p>When asked what the most difficult part of computer programming was, though, one quote stands out that resonates with what Windows has become today. </p><p>"The hardest part is deciding what the algorithms are, and then simplifying them as much as you can. It’s difficult to get things down to their simplest forms. You have to simulate in your mind how the program’s going to work, and you have to have a complete grasp of how the various pieces of the program work together."</p><div><blockquote><p>The finest pieces of software are those where one individual has a complete sense of exactly how the program works. To have that, you have to really love the program and concentrate on keeping it simple, to an incredible degree</p><p>Bill Gates, Co-Founder of Microsoft</p></blockquote></div><p>Gates continues: "The finest pieces of software are those where one individual has a complete sense of exactly how the program works. To have that, you have to really love the program and concentrate on keeping it simple, to an incredible degree." </p><p>Essentially, for new software to work on an operating system and integrate with what's already working, it needs to be simple. With the countless number of features Microsoft has implemented into its OS since then, from Windows 7 to Windows 11, I can only imagine that's a hard task. But it's telling that Copilot hasn't abided by these words. </p><p>A few years later, in 1992, Gates spoke with <a href="https://25iq.com/quotations/bill-gates" target="_blank">Profit magazine</a>, following up on the state of advancing its OS alongside the evolution of PCs. </p><p>“Five years ago, a lot of improvements in applications were just throwing features in.  Now we have to understand what people want to do, what makes it hard to do those things, and design the interface around those ideas.”</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ey1jve"></div>                            </div>                            <script src="https://kwizly.com/embed/ey1jve.js" async></script><p>In recent years, the boom in AI services like <a href="https://www.tomsguide.com/news/chatgpt">ChatGPT</a>, <a href="https://www.tomsguide.com/ai/google-gemini/gemini-3-is-here-googles-most-powerful-ai-model-yet-is-crushing-benchmarks-improving-search-and-outperforming-chatgpt">Gemini</a> and yes, even <a href="https://www.tomsguide.com/ai/copilot/microsoft-copilot-what-it-is-and-how-it-works">Copilot</a> itself, appeared to be the next stage in computing. It seemed to be the right bet, as we've seen how artificial intelligence has made <a href="https://www.tomsguide.com/computing/laptops/heres-5-things-an-npu-can-do-for-your-laptop-ai-smarts-youll-actually-use-without-realizing-it">improvements in the way we work</a>, interact with the world (using <a href="https://www.tomsguide.com/ai/i-wore-ray-ban-meta-display-smart-glasses-to-watch-the-super-bowl-halftime-show-and-understood-bad-bunny-in-real-time">Ray-Ban Meta Display smart glasses to translate Bad Bunny's Super Bowl halftime show</a>) and certainly in the way we game (<a href="https://www.tomsguide.com/gaming/pc-gaming/nvidia-dlss-4-5-brings-another-ai-leap-forward-for-pc-gaming-4k-path-traced-gameplay-at-240-fps-and-everything-else-you-need-to-know">Nvidia's DLSS 4.5</a>, as the most recent example). </p><p>But then there are AI features like the controversial <a href="https://www.tomsguide.com/computing/windows-operating-systems/microsofts-controversial-recall-is-back-but-only-if-youre-a-windows-insider">Windows Recall</a>, the inclusion of Copilot in apps and settings that aren't needed, and more. This is notable, as it goes against Gates' stating "we have to understand what people want to do." And the people have spoken, too. </p><p>When we asked "How do you feel about Microsoft potentially scaling back AI features in Windows 11?" in a poll, 68% of responders chose that they wanted a master "OFF" switch for all of it, while 31% said it's about time to clean up the bloat. Notably, <em>no one </em>picked "I actually use those features."</p><h2 id="making-amends">Making amends</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="QHW3MVwrGTn4VrsrGmU2dU" name="surface-laptop-lede" alt="Microsoft Surface Laptop 2024" src="https://cdn.mos.cms.futurecdn.net/QHW3MVwrGTn4VrsrGmU2dU.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>Gates' words ring more true than ever today. With a bloated Windows 11 stuffed with AI, leading to further bugs, sluggish performance, and an AI assistant around every corner that nearly demands a smart way to work in... Paint, the frustration is tangible. </p><p>But Microsoft appears to be taking heed. President of Windows and devices, Pavan Davuluri, has <a href="https://www.tomsguide.com/computing/windows-operating-systems/we-need-to-improve-windows-in-ways-that-are-meaningful-for-people-microsoft-is-urgently-trying-to-fix-windows-11-issues">addressed Windows 11's issues</a>, stating: "The feedback we’re receiving from our community of passionate customers and Windows Insiders has been clear. We need to improve Windows in ways that are meaningful for people."</p><p>That echoes what Gates said decades ago and is a good sign that Windows as a whole is making a comeback. How will these fixes look? I'm not sure, but we're already catching word that Microsoft plans to ditch OpenAI, as Jezz Corden of <a href="https://www.windowscentral.com/artificial-intelligence/microsoft-confirms-plan-to-ditch-openai-as-the-chatgpt-firm-continues-to-beg-big-tech-for-cash" target="_blank">Windows Central</a> reports, meaning ChatGPT won't continue to take over Microsoft's AI push. </p><p>Microsoft appears to be going back to the drawing board, and if anything, this will follow Gates' remarks of keeping things "simple." So far, Windows 11 may have been a betrayal of these words, but Microsoft is rightfully trying to gain the trust of its users back. </p><p>For now, it's looking like the <a href="https://www.tomsguide.com/ai/chatgpts-sam-altman-says-were-in-an-ai-bubble-heres-what-that-means-and-why-it-matters">AI bubble</a> might burst after all — for Microsoft, at least.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/quitgpt-is-going-viral-heres-why-people-are-cancelling-chatgpt">QuitGPT is going viral — here’s why people are cancelling ChatGPT</a></li><li><a href="https://www.tomsguide.com/computing/hardware/you-have-to-work-around-the-supply-chain-acer-exec-on-plans-to-bypass-the-big-three-to-save-us-from-the-ram-price-crisis">RAM prices keep rising in 2026 — Acer exec says PC makers may bypass major suppliers to keep laptops affordable</a></li><li><a href="https://www.tomsguide.com/computing/laptops/hp-wants-you-to-rent-your-next-laptop-heres-why-thats-a-terrible-idea">HP wants you to rent your next laptop — I did the math and it's actually terrifying</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Windows 10 users warned to upgrade now or risk a ‘degraded security state’ as Microsoft ends Secure Boot support ]]></title>
                                                                                                <dc:content><![CDATA[ <p><a href="https://www.tomsguide.com/computing/windows-operating-systems/windows-10-upgrade-guide">Support for Windows 10</a> ended officially in October 2025, and while over 60% of PC users have made the switch to Windows 11, 35% are still using the older OS. Look, I get that it’s tricky to break an old habit, but for those users, this has become a significant security concern.</p><p>In a <a href="https://blogs.windows.com/windowsexperience/2026/02/10/refreshing-the-root-of-trust-industry-collaboration-on-secure-boot-certificate-updates/" target="_blank">new blog post</a>, Microsoft has announced a “generational refresh” of Secure Boot certificates, which means the current ones are set to expire in late June. </p><p>If you’re on Windows 10 without these certificates, you could miss out on future security updates, and, as Microsoft says, you will risk a “degraded security state.”</p><h2 id="what-is-secure-boot">What is Secure Boot?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YwKRVzwvLwup6hDGh5bVNM" name="RzdqY6hhVUXJjJYEgfCrVe.jpg" alt="A hacker typing quickly on a keyboard" src="https://cdn.mos.cms.futurecdn.net/YwKRVzwvLwup6hDGh5bVNM.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Secure Boot is an authorization process that only allows the PC to run trusted software on startup, which stops malicious hacks during the boot. </p><p>These certificates have been around for 15 years — since 2011 with Windows 8, so it makes sense that they’re renewed to an updated standard.</p><h2 id="how-could-this-affect-your-system">How could this affect your system?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5712px;"><p class="vanilla-image-block" style="padding-top:57.91%;"><img id="rzF47gsNkUp22vynuaHefg" name="shutterstock_336079358 crop.jpg" alt="Windows 10" src="https://cdn.mos.cms.futurecdn.net/rzF47gsNkUp22vynuaHefg.jpg" mos="" align="middle" fullscreen="" width="5712" height="3308" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>If you’re on Windows 11, you’ll just receive the updated certificates with “no additional action required.” On top of that, chances are some of you reading this may already have them, as Microsoft has been working with PC manufacturers and “provisioning updated certificates” on desktops and laptops sold in 2024 and 2025.</p><p>However, if you’re on “Windows 10 and older”, you won’t be protected from new boot-level vulnerabilities, which will put your computer at risk from the second you hit the power button.</p><h2 id="what-do-you-need-to-do">What do you need to do?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="nM2QA9SAJTB9Hq3ATzrtdC" name="windows-11-stock-image.jpg" alt="Windows 11 logo on a laptop screen" src="https://cdn.mos.cms.futurecdn.net/nM2QA9SAJTB9Hq3ATzrtdC.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Well, you’ve got two options here. The first obvious one that Microsoft is really wanting you to do is upgrade to Windows 11.</p><ul><li>You can either pick up a new system, and we’re always busy testing the <a href="https://www.tomsguide.com/computing/laptops/best-laptops">best laptops</a>, <a href="https://www.tomsguide.com/best-picks/best-gaming-laptops">best gaming laptops</a> and <a href="https://www.tomsguide.com/best-picks/best-computers">best desktops</a> to help you make the right choice.</li><li>Or if you’re keen to stick with your older Windows 10 system, there are ways to bypass Microsoft’s restrictions and install Windows 11. <a href="https://www.tomsguide.com/computing/your-unsupported-pc-can-still-run-windows-11-in-2025-heres-how">We’ve got a guide on how to do that</a>.</li></ul><p>If neither of these are not to your liking — maybe you have a severe allergy to Windows 11, and you want to wait for when <a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-is-reportedly-pulling-back-on-stuffing-windows-11-with-ai-and-i-couldnt-be-happier">Microsoft pulls back on stuffing it with AI</a>. Well, there is the Extended Security Updates (ESU) program.</p><p><a href="https://www.tomsguide.com/computing/windows-operating-systems/time-is-running-out-for-millions-of-windows-10-users-but-heres-the-1-trick-for-a-free-one-year-extension">Follow our guide</a> and you can expect to get these new certificates, since this program is set to run for a year starting from its launch in October. </p><p>Though it’s fair to say that by this point, going this route is kind of like kicking the can down the road. We’ll be back in this situation once October 13, 2026 rolls around.</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/windows-operating-systems/we-need-to-improve-windows-in-ways-that-are-meaningful-for-people-microsoft-is-urgently-trying-to-fix-windows-11-issues">'We need to improve Windows in ways that are meaningful for people': Microsoft is urgently trying to fix Windows 11 issues</a></li><li><a href="https://www.tomsguide.com/computing/windows-operating-systems/5-hidden-windows-11-features-you-need-to-know-about">Forget the taskbar — 5 hidden gems that finally convinced me to love Windows 11</a></li><li><a href="https://www.tomsguide.com/computing/windows-operating-systems/sleuth-uncovers-office-97-easter-egg-hidden-for-30-years-the-comments-clippy-provides-are-a-cherry-on-top">Sleuth uncovers Office 97 Easter egg hidden for 30 years: 'the comments Clippy provides are a cherry on top'</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/windows-operating-systems/windows-10-users-warned-to-upgrade-now-or-risk-a-degraded-security-state-as-microsoft-ends-secure-boot-support</link>
                                                                            <description>
                            <![CDATA[ Support for Windows 10 officially ended in October 2025, and Microsoft says devices that don’t upgrade could enter a degraded security state — leaving them vulnerable to threats. Here’s what it means for your PC and how to protect it. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">LFrJkxgRzPFTNhTDr3APpG</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/ystSw9obFXtwAKQjbJwpjP-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 11 Feb 2026 11:38:30 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Windows Operating Systems]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Software]]></category>
                                                    <category><![CDATA[Operating Systems]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6.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/ystSw9obFXtwAKQjbJwpjP-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Windows 10 logo on laptop]]></media:description>                                                            <media:text><![CDATA[Windows 10 logo on laptop]]></media:text>
                                <media:title type="plain"><![CDATA[Windows 10 logo on laptop]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/ystSw9obFXtwAKQjbJwpjP-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p><a href="https://www.tomsguide.com/computing/windows-operating-systems/windows-10-upgrade-guide">Support for Windows 10</a> ended officially in October 2025, and while over 60% of PC users have made the switch to Windows 11, 35% are still using the older OS. Look, I get that it’s tricky to break an old habit, but for those users, this has become a significant security concern.</p><p>In a <a href="https://blogs.windows.com/windowsexperience/2026/02/10/refreshing-the-root-of-trust-industry-collaboration-on-secure-boot-certificate-updates/" target="_blank">new blog post</a>, Microsoft has announced a “generational refresh” of Secure Boot certificates, which means the current ones are set to expire in late June. </p><p>If you’re on Windows 10 without these certificates, you could miss out on future security updates, and, as Microsoft says, you will risk a “degraded security state.”</p><h2 id="what-is-secure-boot">What is Secure Boot?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YwKRVzwvLwup6hDGh5bVNM" name="RzdqY6hhVUXJjJYEgfCrVe.jpg" alt="A hacker typing quickly on a keyboard" src="https://cdn.mos.cms.futurecdn.net/YwKRVzwvLwup6hDGh5bVNM.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Secure Boot is an authorization process that only allows the PC to run trusted software on startup, which stops malicious hacks during the boot. </p><p>These certificates have been around for 15 years — since 2011 with Windows 8, so it makes sense that they’re renewed to an updated standard.</p><h2 id="how-could-this-affect-your-system">How could this affect your system?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5712px;"><p class="vanilla-image-block" style="padding-top:57.91%;"><img id="rzF47gsNkUp22vynuaHefg" name="shutterstock_336079358 crop.jpg" alt="Windows 10" src="https://cdn.mos.cms.futurecdn.net/rzF47gsNkUp22vynuaHefg.jpg" mos="" align="middle" fullscreen="" width="5712" height="3308" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>If you’re on Windows 11, you’ll just receive the updated certificates with “no additional action required.” On top of that, chances are some of you reading this may already have them, as Microsoft has been working with PC manufacturers and “provisioning updated certificates” on desktops and laptops sold in 2024 and 2025.</p><p>However, if you’re on “Windows 10 and older”, you won’t be protected from new boot-level vulnerabilities, which will put your computer at risk from the second you hit the power button.</p><h2 id="what-do-you-need-to-do">What do you need to do?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="nM2QA9SAJTB9Hq3ATzrtdC" name="windows-11-stock-image.jpg" alt="Windows 11 logo on a laptop screen" src="https://cdn.mos.cms.futurecdn.net/nM2QA9SAJTB9Hq3ATzrtdC.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Well, you’ve got two options here. The first obvious one that Microsoft is really wanting you to do is upgrade to Windows 11.</p><ul><li>You can either pick up a new system, and we’re always busy testing the <a href="https://www.tomsguide.com/computing/laptops/best-laptops">best laptops</a>, <a href="https://www.tomsguide.com/best-picks/best-gaming-laptops">best gaming laptops</a> and <a href="https://www.tomsguide.com/best-picks/best-computers">best desktops</a> to help you make the right choice.</li><li>Or if you’re keen to stick with your older Windows 10 system, there are ways to bypass Microsoft’s restrictions and install Windows 11. <a href="https://www.tomsguide.com/computing/your-unsupported-pc-can-still-run-windows-11-in-2025-heres-how">We’ve got a guide on how to do that</a>.</li></ul><p>If neither of these are not to your liking — maybe you have a severe allergy to Windows 11, and you want to wait for when <a href="https://www.tomsguide.com/computing/windows-operating-systems/microsoft-is-reportedly-pulling-back-on-stuffing-windows-11-with-ai-and-i-couldnt-be-happier">Microsoft pulls back on stuffing it with AI</a>. Well, there is the Extended Security Updates (ESU) program.</p><p><a href="https://www.tomsguide.com/computing/windows-operating-systems/time-is-running-out-for-millions-of-windows-10-users-but-heres-the-1-trick-for-a-free-one-year-extension">Follow our guide</a> and you can expect to get these new certificates, since this program is set to run for a year starting from its launch in October. </p><p>Though it’s fair to say that by this point, going this route is kind of like kicking the can down the road. We’ll be back in this situation once October 13, 2026 rolls around.</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/windows-operating-systems/we-need-to-improve-windows-in-ways-that-are-meaningful-for-people-microsoft-is-urgently-trying-to-fix-windows-11-issues">'We need to improve Windows in ways that are meaningful for people': Microsoft is urgently trying to fix Windows 11 issues</a></li><li><a href="https://www.tomsguide.com/computing/windows-operating-systems/5-hidden-windows-11-features-you-need-to-know-about">Forget the taskbar — 5 hidden gems that finally convinced me to love Windows 11</a></li><li><a href="https://www.tomsguide.com/computing/windows-operating-systems/sleuth-uncovers-office-97-easter-egg-hidden-for-30-years-the-comments-clippy-provides-are-a-cherry-on-top">Sleuth uncovers Office 97 Easter egg hidden for 30 years: 'the comments Clippy provides are a cherry on top'</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ PS6 rumored for massive 30GB RAM upgrade as next Xbox will pivot to PC hybrid — what we know so far ]]></title>
                                                                                                <dc:content><![CDATA[ <p>We are still a couple of years away from the next-generation of Xbox and PlayStation consoles, but the rumors are starting to pile up. This week, some new leaks surfaced regarding the <a href="https://www.tomsguide.com/gaming/playstation/ps6-leaks-and-rumors">PlayStation 6</a> and its rumored companion handheld, as well as Microsoft's potential plans for the next Xbox. </p><p>Starting with Sony, regular leaker <a href="https://www.neogaf.com/threads/amd-ceo-reveals-next-gen-xbox-could-launch-in-2027-%E2%80%94-ceo-says-semi-custom-soc-ready-to-support-launch-in-2027.1693009/page-9#post-271240975" target="_blank">KeplerL2 posted</a> (via <a href="https://videocardz.com/newz/playstation-handheld-reportedly-with-24gb-memory-ps6-console-with-30gb" target="_blank">Videocardz</a>) in the NEoGAF forums that the PS6 could feature 32GB of DDR7 memory, double that of the 16GB of GDDR6. Meanwhile, the rumored handheld could feature 24GB of LPDDR5X memory, which would match Windows handheld configurations for a higher-end mobile console.</p><p>Both leaks imply that Sony's next console and handheld will be able to run heavy games with no memory constraints.</p><p>It's no real surprise that the next PlayStation will be more powerful than its predecessor. The worry is that so much memory will make the PS6 extremely expensive, with the ongoing <a href="https://www.tomsguide.com/computing/theres-just-not-enough-supply-to-go-around-micron-believes-ram-shortage-wont-improve-until-2028-at-least-until-the-ai-demand-starts-to-fade-away">RAM crisis </a>not expected to abate until 2028 at the earliest.</p><p>However, Sony isn't expected to launch the PS6 until 2028, maybe late 2027. Perhaps that delay will give the company time to reduce costs or for memory manufacturers to catch up to AI demand.</p><h2 id="the-nexbox">The nexBox</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:958px;"><p class="vanilla-image-block" style="padding-top:56.37%;"><img id="oHQ2Tv2QtkeC7UaVdK79ZT" name="xboxprototype" alt="Original Xbox prototype" src="https://cdn.mos.cms.futurecdn.net/oHQ2Tv2QtkeC7UaVdK79ZT.jpg" mos="" align="middle" fullscreen="" width="958" height="540" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>At the start of February, AMD's CEO Lisa Su surprisingly revealed that the <a href="https://www.tomsguide.com/gaming/xbox/amd-hinted-the-next-gen-xbox-could-launch-in-2027-heres-why-im-not-convinced">next Xbox featuring an AMD SoC</a> could launch in 2027. Allegedly, that was a surprise to even Microsoft, per our friends at<a href="https://www.windowscentral.com/gaming/xbox/exclusive-the-next-gen-xbox-2027-locked-in-most-ambitious#viafoura-comments" target="_blank"> Windows Central</a>. It contradicted previous Microsoft comments and documents that revealed that the next <a href="https://www.tomsguide.com/news/ps6-release-date-tipped-in-activision-blizzard-trial-what-we-know">Xbox was slated for 2028</a>.</p><p>"I'm told Microsoft insiders were a little taken off-guard by Lisa Su's comments on Xbox's Gen-10 timeline," Jez Corden reported.</p><p>From our own rumor reporting and other sources, the big change between the Series X and the next generation is a focus on a hybrid console/PC.  Xbox president Sarah Bond previously hinted that the new console would be "a very premium, very high-end curated experience."</p><p>The big rumor from Windows Central is that Microsoft is working with OEMs, like Asus, to build a "variety of options" that would span a wide range of price points. This hints at a gaming laptop-esque future where you could have a high-end, say Razer-built Xbox, but also a lower-end model.</p><p>The difference here is that Xbox would become more of a branding exercise and a launcher rather than hardware. Corden is reporting that Microsoft wants to make an "Xbox interface" on top of Windows, similar to how it works on the <a href="https://www.tomsguide.com/gaming/handheld-gaming/rog-xbox-ally-x-review">Asus ROG Xbox Ally X</a> handheld PC console, which launched this past October.</p><p>While the PS6 might be a more traditional power-step forward, the Xbox could be, as the ads say, "anything."</p><p>We'll likely find out more about both next-gen consoles soon enough, so stay tuned to Tom's Guide for the latest news, leaks and rumors.</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/playstation/the-sony-playstation-portal-could-get-a-pro-edition-with-a-major-display-upgrade">The Sony PlayStation Portal could get a Pro edition with a major display upgrade</a></li><li><a href="https://www.tomsguide.com/gaming/xbox/amd-hinted-the-next-gen-xbox-could-launch-in-2027-heres-why-im-not-convinced">AMD just hinted the next-gen Xbox could ‘launch in 2027’ — here’s why I’m not convinced</a></li><li><a href="https://www.tomsguide.com/gaming/xbox/xbox-could-launch-an-ad-free-cloud-gaming-tier-soon-heres-what-weve-heard">Xbox could launch an ad-free cloud gaming tier soon — here’s what we’ve heard</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/ps6-rumored-for-massive-30gb-ram-upgrade-as-next-xbox-will-pivot-to-pc-hybrid-what-we-know-so-far</link>
                                                                            <description>
                            <![CDATA[ New rumors hint at what could set future PlayStation and Xbox consoles apart. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">4YMB2bafByccr9urZE7pTj</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/ZCZu7kduc4SQt3yKKtnKzg-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 10 Feb 2026 01:29:31 +0000</pubDate>                                                                                                                                                                                                                                <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/ZCZu7kduc4SQt3yKKtnKzg-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A person using the Hyperkin Competitor controller with an Xbox and PS5 in the background on a desk]]></media:description>                                                            <media:text><![CDATA[A person using the Hyperkin Competitor controller with an Xbox and PS5 in the background on a desk]]></media:text>
                                <media:title type="plain"><![CDATA[A person using the Hyperkin Competitor controller with an Xbox and PS5 in the background on a desk]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/ZCZu7kduc4SQt3yKKtnKzg-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>We are still a couple of years away from the next-generation of Xbox and PlayStation consoles, but the rumors are starting to pile up. This week, some new leaks surfaced regarding the <a href="https://www.tomsguide.com/gaming/playstation/ps6-leaks-and-rumors">PlayStation 6</a> and its rumored companion handheld, as well as Microsoft's potential plans for the next Xbox. </p><p>Starting with Sony, regular leaker <a href="https://www.neogaf.com/threads/amd-ceo-reveals-next-gen-xbox-could-launch-in-2027-%E2%80%94-ceo-says-semi-custom-soc-ready-to-support-launch-in-2027.1693009/page-9#post-271240975" target="_blank">KeplerL2 posted</a> (via <a href="https://videocardz.com/newz/playstation-handheld-reportedly-with-24gb-memory-ps6-console-with-30gb" target="_blank">Videocardz</a>) in the NEoGAF forums that the PS6 could feature 32GB of DDR7 memory, double that of the 16GB of GDDR6. Meanwhile, the rumored handheld could feature 24GB of LPDDR5X memory, which would match Windows handheld configurations for a higher-end mobile console.</p><p>Both leaks imply that Sony's next console and handheld will be able to run heavy games with no memory constraints.</p><p>It's no real surprise that the next PlayStation will be more powerful than its predecessor. The worry is that so much memory will make the PS6 extremely expensive, with the ongoing <a href="https://www.tomsguide.com/computing/theres-just-not-enough-supply-to-go-around-micron-believes-ram-shortage-wont-improve-until-2028-at-least-until-the-ai-demand-starts-to-fade-away">RAM crisis </a>not expected to abate until 2028 at the earliest.</p><p>However, Sony isn't expected to launch the PS6 until 2028, maybe late 2027. Perhaps that delay will give the company time to reduce costs or for memory manufacturers to catch up to AI demand.</p><h2 id="the-nexbox">The nexBox</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:958px;"><p class="vanilla-image-block" style="padding-top:56.37%;"><img id="oHQ2Tv2QtkeC7UaVdK79ZT" name="xboxprototype" alt="Original Xbox prototype" src="https://cdn.mos.cms.futurecdn.net/oHQ2Tv2QtkeC7UaVdK79ZT.jpg" mos="" align="middle" fullscreen="" width="958" height="540" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>At the start of February, AMD's CEO Lisa Su surprisingly revealed that the <a href="https://www.tomsguide.com/gaming/xbox/amd-hinted-the-next-gen-xbox-could-launch-in-2027-heres-why-im-not-convinced">next Xbox featuring an AMD SoC</a> could launch in 2027. Allegedly, that was a surprise to even Microsoft, per our friends at<a href="https://www.windowscentral.com/gaming/xbox/exclusive-the-next-gen-xbox-2027-locked-in-most-ambitious#viafoura-comments" target="_blank"> Windows Central</a>. It contradicted previous Microsoft comments and documents that revealed that the next <a href="https://www.tomsguide.com/news/ps6-release-date-tipped-in-activision-blizzard-trial-what-we-know">Xbox was slated for 2028</a>.</p><p>"I'm told Microsoft insiders were a little taken off-guard by Lisa Su's comments on Xbox's Gen-10 timeline," Jez Corden reported.</p><p>From our own rumor reporting and other sources, the big change between the Series X and the next generation is a focus on a hybrid console/PC.  Xbox president Sarah Bond previously hinted that the new console would be "a very premium, very high-end curated experience."</p><p>The big rumor from Windows Central is that Microsoft is working with OEMs, like Asus, to build a "variety of options" that would span a wide range of price points. This hints at a gaming laptop-esque future where you could have a high-end, say Razer-built Xbox, but also a lower-end model.</p><p>The difference here is that Xbox would become more of a branding exercise and a launcher rather than hardware. Corden is reporting that Microsoft wants to make an "Xbox interface" on top of Windows, similar to how it works on the <a href="https://www.tomsguide.com/gaming/handheld-gaming/rog-xbox-ally-x-review">Asus ROG Xbox Ally X</a> handheld PC console, which launched this past October.</p><p>While the PS6 might be a more traditional power-step forward, the Xbox could be, as the ads say, "anything."</p><p>We'll likely find out more about both next-gen consoles soon enough, so stay tuned to Tom's Guide for the latest news, leaks and rumors.</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/playstation/the-sony-playstation-portal-could-get-a-pro-edition-with-a-major-display-upgrade">The Sony PlayStation Portal could get a Pro edition with a major display upgrade</a></li><li><a href="https://www.tomsguide.com/gaming/xbox/amd-hinted-the-next-gen-xbox-could-launch-in-2027-heres-why-im-not-convinced">AMD just hinted the next-gen Xbox could ‘launch in 2027’ — here’s why I’m not convinced</a></li><li><a href="https://www.tomsguide.com/gaming/xbox/xbox-could-launch-an-ad-free-cloud-gaming-tier-soon-heres-what-weve-heard">Xbox could launch an ad-free cloud gaming tier soon — here’s what we’ve heard</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
            </channel>
</rss>