<?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/android-tablets" rel="self" type="application/rss+xml" />
                            <title><![CDATA[ Latest from Tom's Guide in Android-tablets ]]></title>
                <link>https://www.tomsguide.com/computing/tablets/android-tablets</link>
        <description><![CDATA[ All the latest android-tablets content from the Tom's Guide team ]]></description>
                                    <lastBuildDate>Sun, 25 Oct 2026 06:00:00 +0000</lastBuildDate>
                            <language>en</language>
                                <item>
                                                            <title><![CDATA[ The Alexa Tablet 12 Pro has strong Alexa+ integration — but it’s the hardware that won me over ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Amazon’s Alexa Tablet 12 Pro ($499 to start) is an Android tablet that completely surprised me. As the flagship of the new <a href="https://www.tomsguide.com/computing/android-tablets/fire-tablets-are-dead-amazon-announces-new-alexa-tablet-lineup-running-android">Alexa tablet line</a>, which effectively replaces Amazon Fire tablets, this slate runs on Android and is built to work seamlessly with <a href="https://www.tomsguide.com/ai/alexa-release-date-cost-devices-and-all-the-new-ai-features">Alexa+</a>. While that integration is certainly a selling point, I’m truly impressed by the hardware that elevates this Android tablet above its peers and even puts it on par with the <a href="https://www.tomsguide.com/best-picks/best-ipad">best iPads</a>.</p><p>The sturdy aluminum unibody is great in hand, making it feel like a premium device. It’s also thin and light enough to hold comfortably for extended periods. My favorite feature is the 12-inch 2.8K display. Though it’s not an OLED, everything you see looks bright and colorful. The optional Nanomatte anti-glare option is also a huge game-changer.</p><p>This Alexa tablet runs full-blown Android, bringing Google Play services to an Amazon tablet for the first time. It also serves as an excellent replacement for the <a href="https://www.tomsguide.com/us/best-e-readers,review-2766.html">best Kindles</a>. This helps make the Alexa tablet feel like an extension of the Amazon ecosystem, though that part might not matter much if you don’t already own Alexa devices or a Kindle.</p><p>After using the Amazon Alexa Tablet 12 Pro as my daily driver for watching videos and reading for the better part of a week, I can comfortably say it’s one of the <a href="https://www.tomsguide.com/best-picks/best-android-tablets">best Android tablets</a> and <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a> right now. Sure, it’s not for everyone, but if you’re an Alexa user or want a slate with an anti-glare screen, you won’t go wrong here. Find out more in my full review.</p><h3 class="article-body__section" id="section-amazon-alexa-tablet-12-pro-review-cheat-sheet"><span>Amazon Alexa Tablet 12 Pro review: Cheat sheet</span></h3><ul><li><strong>What is it?</strong> As its name suggests, the Amazon Alexa Tablet 12 Pro is a slate built to work with the Alexa ecosystem. Beyond that, it’s an Android tablet that arguably rivals Apple’s entry-level iPad.</li><li><strong>Who is it for?</strong> This device is for folks who want a tablet that can control their Alexa devices or an Android slate with an anti-glare display.</li><li><strong>What does it cost?</strong> The <a href="https://www.amazon.com/dp/B0DT2G69GW?th=1" target="_blank" rel="nofollow">Amazon Alexa Tablet 12 Pro starts at $499</a> for a model with 8GB of RAM and 128GB of storage. For $150 more, <a href="https://www.amazon.com/dp/B0FMS8C99W?th=1" target="_blank" rel="nofollow">you can add a Nanomatte display</a>. The most <a href="https://www.amazon.com/dp/B0DT25J8W8?th=1" target="_blank" rel="nofollow">expensive stand-alone model with 256GB</a> of storage and a Nanomatte display costs $679. A productivity bundle that includes the Alexa Pro Keyboard and Alexa Pro Pen is also on sale for $799.</li><li><strong>What do we like?</strong> We like the sleek design, lovely display, Alexa+ integration, smooth performance, and long-lasting battery life.</li><li><strong>What don’t we like?</strong> We don’t like the high cost of upgrading storage and moving to the Nanomatte model. The peripherals can also get quite pricey.</li></ul><h3 class="article-body__section" id="section-amazon-alexa-tablet-12-pro-review-specs"><span>Amazon Alexa Tablet 12 Pro review: Specs</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Amazon Alexa Tablet 12 Pro (starting)</strong></p></td><td  ><p><strong>Amazon Alexa Tablet 12 Pro (tested)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$499</p></td><td  ><p>$679</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>12-inch | 2800 x 1840 | 120Hz | 3:2 aspect ratio</p></td><td  ><p>12-inch | 2800 x 1840 | 120Hz | 3:2 aspect ratio</p></td></tr><tr><td class="firstcol " ><p><strong>Chip</strong></p></td><td  ><p>MediaTek Dimensity 8400 </p></td><td  ><p>MediaTek Dimensity 8400 </p></td></tr><tr><td class="firstcol " ><p><strong>Memory</strong></p></td><td  ><p>8GB</p></td><td  ><p>16GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>128GB</p></td><td  ><p>256GB</p></td></tr><tr><td class="firstcol " ><p><strong>Cameras</strong></p></td><td  ><p>8MP front camera | 13MP rear camera (both w 1080p video)</p></td><td  ><p>8MP front camera | 13MP rear camera (both w 1080p video)</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Wi-Fi 6, Bluetooth 5.3</p></td><td  ><p>Wi-Fi 6, Bluetooth 5.3</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>1x USB-C</p></td><td  ><p>1x USB-C</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>10.66 x 7.24 x 0.26 inches </p></td><td  ><p>10.66 x 7.24 x 0.26 inches </p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>1.2 pounds</p></td><td  ><p>1.2 pounds</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-amazon-alexa-tablet-12-pro-review-the-ups"><span>Amazon Alexa Tablet 12 Pro review: The ups</span></h3><p>The Alexa Tablet 12 Pro has a lot to offer, thanks to its superb display, sleek design, long battery life, and smart Alexa integration.</p><h2 id="sleek-design">Sleek design</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jGmcsAoWw4HxeLsCS97tcU" name="Alexa Tablet 12 Pro-7" alt="Amazon Alexa Tablet 12 Pro" src="https://cdn.mos.cms.futurecdn.net/jGmcsAoWw4HxeLsCS97tcU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Amazon didn’t reinvent the wheel of tablet design, as the Alexa Tablet has the basic form of modern-day slates. That said, it’s a beautiful aluminum slab with a slim profile and elegant curves. The all-black chassis also gives the tablet an air of sophistication.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="syYWdMhG4BZ9YNkustUBES" name="Alexa Tablet 12 Pro-6" alt="Amazon Alexa Tablet 12 Pro" src="https://cdn.mos.cms.futurecdn.net/syYWdMhG4BZ9YNkustUBES-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The design is decidedly minimalist. In landscape, the power button sits on the top-left edge, while the volume buttons sit on the top-left corner. The 8MP front camera lies right in the center, along the thin bezel. On the back, you’ll find the 13MP rear camera and the Alexa logo. Like most modern tablets, it has a single USB-C port on the right side, or bottom if you’re holding the tablet in portrait mode.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HyuP2scCa5FGVn2eW4mDcY" name="Alexa Tablet 12 Pro-9" alt="Amazon Alexa Tablet 12 Pro" src="https://cdn.mos.cms.futurecdn.net/HyuP2scCa5FGVn2eW4mDcY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Speakers flank the left and right sides, and they’re pretty good for tablet audio. Dialogue-heavy podcasts and videos sound great, with clear, distinct voices. The speakers also do a good job with movies and TV shows that feature a wide range of audio. And while music can lack bass, it’s still plenty punchy and clear.</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JofdMYaqrjT9D6dvpHkhgZ" name="Alexa Tablet 12 Pro-11" alt="Amazon Alexa Tablet 12 Pro" src="https://cdn.mos.cms.futurecdn.net/JofdMYaqrjT9D6dvpHkhgZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The 12-inch display on the Alexa Tablet 12 Pro is a wonder to behold. Everything appears crystal clear, thanks to the sharp 2800 x 1840 resolution that brings out even the smallest details. While this isn’t an OLED, it still delivers excellent contrast between dark and light elements. Colors are vivid, and the overall brightness never overwhelms.</p><p>I watched a lot of YouTube videos during my testing, and I loved how the matte display diffused the lighting in my living area. Whether it’s bright and bold animated series like <a href="https://www.tomsguide.com/entertainment/prime-video/invincible-season-4-get-ready-for-the-baddest-villain-ever">Invincible</a> or gritty action shows like <a href="https://www.tomsguide.com/news/best-shows-like-reacher">Reacher</a>, everything looks fantastic. I also appreciate how the matte display on this tablet doesn’t soften color nearly as much as I’ve seen on other devices utilizing similar tech.</p><div ><table><caption>Display benchmark results</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Alexa Tablet 12 Pro</strong></p></td><td  ><p><strong>Apple iPad (11th gen)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Nits (brightness)</strong></p></td><td  ><p>547 (SDR) | 555 (HDR)</p></td><td  ><p>506 (SDR) | 496 (HDR) </p></td></tr><tr><td class="firstcol " ><p><strong>sRGB</strong></p></td><td  ><p>109.7%</p></td><td  ><p>108.8% </p></td></tr><tr><td class="firstcol " ><p><strong>DCI-P3</strong></p></td><td  ><p>77.7%</p></td><td  ><p>77.1% </p></td></tr><tr><td class="firstcol " ><p><strong>Delta-E</strong></p></td><td  ><p>0.22</p></td><td  ><p>0.30</p></td></tr></tbody></table></div><p>How did the Alexa Tablet 12 Pro do in our display benchmarks? As you can see above, color reproduction (sRGB and DCI-P3) isn’t oversaturated, and color accuracy (Delta-E) matches other tablets and laptops we’ve tested.</p><p>The numbers line up with my experience, as I found the hues generally looked natural. HDR brightness doesn’t get as high as on other devices, but to my eyes, the brightness was just perfect. Numbers-wise, the Alexa Tablet 12 Pro is comparable to the <a href="https://www.tomsguide.com/computing/ipads/ipad-11-2025-review">Apple iPad 11</a>.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="SRbrcE2xVpabnsQPmGtVUo" name="Alexa Tablet 12 Pro-12" alt="Amazon Alexa Tablet 12 Pro" src="https://cdn.mos.cms.futurecdn.net/SRbrcE2xVpabnsQPmGtVUo-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The display on my review unit has a slightly rough texture that mimics paper, which is great for reading. Speaking of reading, comic books look gorgeous because the matte display slightly mutes colors, creating a more paper-like appearance. If you’re into reading digital comics like I am, this is arguably the best tablet for reading your favorite funnies.</p><h2 id="strong-performance">Strong 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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xNNSrCUvmDJJk22EnMVHhh" name="Alexa Tablet 12 Pro-25" alt="Amazon Alexa Tablet 12 Pro" src="https://cdn.mos.cms.futurecdn.net/xNNSrCUvmDJJk22EnMVHhh-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Alexa Tablet 12 Pro delivers solid performance for an Android tablet, thanks to its mid-range MediaTek Dimensity 8400 processor and 8GB of RAM. While this isn’t a workhorse tablet, it generally performs well for web browsing and video streaming. However, I noticed that performance slowed when I opened up multiple Chrome tabs and other apps.</p><div ><table><caption>Performance benchmarks</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Amazon Alexa Tablet 12 Pro</strong></p></td><td  ><p><strong>Apple iPad (11th gen)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6 (single-core / multi-core)</strong></p></td><td  ><p>1666 / 6677</p></td><td  ><p>2589 / 6176 </p></td></tr><tr><td class="firstcol " ><p><strong>3DMark Wild Life Extreme Unlimited (score/fps)</strong></p></td><td  ><p>3376 / 20.2</p></td><td  ><p>2623 / 15.7</p></td></tr></tbody></table></div><p>On the Geekbench 6 CPU test, Amazon’s new tablet scored similarly to the Apple iPad 11 in both single- and multi-core performance. These results match my experience: throwing too much at Amazon’s slate makes it struggle.</p><p>You can certainly use this tablet for productivity, especially with its optional peripherals, but it won’t replace a traditional laptop. However, if you’re using Amazon’s slate mainly for entertainment and light work in Google Docs, its performance won’t disappoint.</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cRxrXz4eK8NrQSTkCwBCen" name="Alexa Tablet 12 Pro-23" alt="Amazon Alexa Tablet 12 Pro" src="https://cdn.mos.cms.futurecdn.net/cRxrXz4eK8NrQSTkCwBCen-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Alexa Tablet 12 Pro delivers excellent battery life. In our battery life test, which involves continuous web surfing over Wi-Fi with the display set to 150 nits of brightness, the tablet endured for an astonishing 13 hours and 17 minutes! As you can see below, that’s almost two hours longer than the iPad 11.</p><div ><table><caption>Battery life test</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Time (hours:mins)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Amazon Alexa Tablet 12 Pro</strong></p></td><td  ><p>13:17</p></td></tr><tr><td class="firstcol " ><p><strong>Apple iPad (11th gen)</strong></p></td><td  ><p>11:25</p></td></tr></tbody></table></div><p>During a stay-at-home weekend, when I sporadically watched YouTube videos and read comics and novels with the display at 70% brightness, the tablet generally dropped from 80% battery to the low 40s over 16 hours.</p><p>On weeknights when I’m only home in the evening, the battery drops by about 10% over four hours of use. This is more than enough for all-day usage!</p><h2 id="seamless-amazon-ecosystem-integration">Seamless Amazon ecosystem integration</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="TTJ34AboNJvXVtfq6MVpC6" name="Alexa Tablet 12 Pro-5" alt="Amazon Alexa Tablet 12 Pro" src="https://cdn.mos.cms.futurecdn.net/TTJ34AboNJvXVtfq6MVpC6-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Alexa Tablet 12 Pro works great as a standalone slate, but it really shines as a hub for your Amazon devices and apps. As Amazon says, the tablet has the intelligence of Alexa+ and has built-in access to Google Play Store apps. And naturally, the tablet also works well as a Kindle.</p><p>I own an Amazon Echo Dot and have two smart lights that support Alexa. When I was winding down for the night, I could dim the lights right on the tablet instead of pulling out my phone to open the Alexa app. And if I wanted to fire up a song on my Echo Dot, I either typed or vocalized the request to the tablet. All of this was relatively seamless. If you don’t care to chat with Alexa, you can go into settings to swap to Google or Bing’s respective voice assistants.</p><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="gVEZ9NujTfuxj3RyS2yFbf" name="Alexa Tablet 12 Pro-24" alt="Amazon Alexa Tablet 12 Pro" src="https://cdn.mos.cms.futurecdn.net/gVEZ9NujTfuxj3RyS2yFbf-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I’m a fan of Kindles, so I loved using this tablet as another Kindle device. When you open the Kindle app, a fun wave-like animation washes across the screen. This isn’t just for show, as the tablet instantly lowers blue light and disables notifications to replicate the Kindle reading experience. This also helps extend battery life. I also like that it has three visual modes: full color, muted colors like on a <a href="https://www.tomsguide.com/computing/e-readers/kindle-colorsoft-2026-review">Kindle Colorsoft</a>, or full black and white.</p><p>If you own a lot of Alexa-supported devices, this Alexa tablet does a nice job of letting you control them all. It serves that purpose well, but it might not be a feature for everyone, which leads us into the next section…</p><h2 id="sharp-cameras">Sharp cameras</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:75.00%;"><img id="W9MWh8NbSFjQ3xjH9WsPEG" name="Alexa Tablet 12 Pro front camera" alt="Amazon Alexa Tablet 12 Pro" src="https://cdn.mos.cms.futurecdn.net/W9MWh8NbSFjQ3xjH9WsPEG-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1920" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you want to look your best on video calls or snap some photos, the tablet’s front and rear cameras are up to the task. The front 8MP camera captures details of my face, clothing, and background, as you can see above.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:75.00%;"><img id="LSsmecC4i56gk9Mh93TCuR" name="Alexa Tablet 12 Pro back camera" alt="Amazon Alexa Tablet 12 Pro" src="https://cdn.mos.cms.futurecdn.net/LSsmecC4i56gk9Mh93TCuR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1920" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Then there’s the 13MP back camera, which also captures details nicely. While I wouldn’t personally use a tablet to take selfies or capture video, I’m impressed by the strong resolution both cameras deliver.</p><h3 class="article-body__section" id="section-amazon-alexa-tablet-12-pro-review-the-downs"><span>Amazon Alexa Tablet 12 Pro review: The downs</span></h3><p>While the Amazon Alexa Tablet 12 Pro is a great Android tablet, it has its drawbacks.</p><h2 id="for-amazon-users-only">For Amazon users only</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="tnP9nTjmQss2C6Q2jyWFDZ" name="Alexa Tablet 12 Pro-4" alt="Amazon Alexa Tablet 12 Pro" src="https://cdn.mos.cms.futurecdn.net/tnP9nTjmQss2C6Q2jyWFDZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>This is a very Alexa-centric tablet. That's clear the moment you see the home screen, where you’ll find an assortment of Amazon apps like Prime Video, Audible, Kindle, the Silk browser… and even Luna!</p><p>And since it runs on Android, you can also quickly access a slew of Google apps. If that wasn’t enough, UI elements like an Alexa+ widget in the bottom-right corner also remind you that this is an Alexa device.</p><p>All of this can be extremely handy for folks who often utilize Amazon and Google apps. I use many of the latter and several of the former, and it’s nice being able to access those apps quickly. However, if you’re not invested in the Amazon ecosystem, they might as well be bloatware, especially if you just want a no-frills Android tablet.</p><p>Speaking of Android, it’s still not nearly as snappy and consistent as <a href="https://www.tomsguide.com/computing/vr-ar/ipados-27-everything-coming-to-the-apples-beloved-tablets">iPadOS</a>. There is always a slight bit of delay when scrolling through pages on sites and apps. I also had some apps take forever to load or completely crash unexpectedly. Those instances aren’t frequent, but they happen far more often than they do on an iPad.</p><h2 id="expensive-peripherals">Expensive peripherals</h2><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="AzZGtXeyUF9yMbYBef5cd4" name="Alexa Tablet 12 Pro-LIST1" alt="Amazon Alexa Tablet 12 Pro" src="https://cdn.mos.cms.futurecdn.net/AzZGtXeyUF9yMbYBef5cd4-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>To get even more use from the Alexa Tablet 12 Pro, you can purchase the Alexa Pro Keyboard and Alexa Pro Pen.</p><p>The Pro Keyboard isn't just for typing; it also doubles as a protective case for the tablet. This peripheral has a leather-like texture that feels good against your fingers and palms. The membrane keys are better than you’d expect for a tablet keyboard, with nice travel distance and even spacing. I don’t have problems typing on this keyboard, even with my big hands. I also like the dedicated Alexa button beside the arrow keys that instantly brings up the AI assistant.</p><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="Uo5W9NiuW4e63q4n6wQ76D" name="Alexa Tablet 12 Pro-19" alt="Amazon Alexa Tablet 12 Pro" src="https://cdn.mos.cms.futurecdn.net/Uo5W9NiuW4e63q4n6wQ76D-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Pro Pen is a pretty great stylus, having a similar weight and feel to an Apple Pencil Pro. Thanks to the tablet’s matte texture, writing with the stylus (almost) feels like writing on paper. Writing notes in the margins of a Kindle book is almost identical to doing the same action on a Kindle Scribe — which makes sense given how they’re both Amazon devices.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Lo8sZjUTNjoPjKLSsfN86H" name="Alexa Tablet 12 Pro-15" alt="Amazon Alexa Tablet 12 Pro" src="https://cdn.mos.cms.futurecdn.net/Lo8sZjUTNjoPjKLSsfN86H-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>While I think the Pro Keyboard and Pro Pen are excellent peripherals, they’re both pretty expensive — the former costs $149 and the latter $89. There’s currently a $799 bundle that saves you $120, but that’s still a steep price to pay on top of the tablet.</p><h3 class="article-body__section" id="section-amazon-alexa-tablet-12-pro-review-verdict"><span>Amazon Alexa Tablet 12 Pro review: Verdict</span></h3><p>I enjoyed my time with the Amazon Alexa Tablet 12 Pro, as it’s a far better slate than I expected. Sure, Android can be somewhat sluggish, and I've rarely (if ever) needed to interact with Alexa+, but the excellent hardware ultimately won me over. The design is perfect, and the Nanomatte display makes for a wonderful viewing and reading experience. I also love how this tablet doubles as a Kindle.</p><p>Serious Alexa or Google users will find a lot to like about the Alexa Tablet 12 Pro. If you don’t fall into that category, the iPad 11 offers a more responsive, stable operating system and has almost all the apps and services on the Alexa Tablet 12 Pro. But if you liked what I had to say about this slate, then you should consider checking it out. You might end up loving it as much as I have!</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/android-tablets/amazon-alexa-tablet-12-pro-review</link>
                                                                            <description>
                            <![CDATA[ The Alexa Tablet 12 Pro is built for Amazon’s ecosystem, but it’s also a fantastic Android tablet, thanks to its sleek design, sharp display, and long battery life. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">TWoHPgKHtnimPCwMC6cLpn</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/pyS5Kj6DeHhWa9ueJUXHoc-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 25 Oct 2026 06:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                <author><![CDATA[ tony.polanco@futurenet.com (Tony Polanco) ]]></author>                    <dc:creator><![CDATA[ Tony Polanco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/atzRNqFt5wYgEUPBDahWsD-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/pyS5Kj6DeHhWa9ueJUXHoc-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Amazon Alexa Tablet 12 Pro]]></media:description>                                                            <media:text><![CDATA[Amazon Alexa Tablet 12 Pro]]></media:text>
                                <media:title type="plain"><![CDATA[Amazon Alexa Tablet 12 Pro]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/pyS5Kj6DeHhWa9ueJUXHoc-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Amazon’s Alexa Tablet 12 Pro ($499 to start) is an Android tablet that completely surprised me. As the flagship of the new <a href="https://www.tomsguide.com/computing/android-tablets/fire-tablets-are-dead-amazon-announces-new-alexa-tablet-lineup-running-android">Alexa tablet line</a>, which effectively replaces Amazon Fire tablets, this slate runs on Android and is built to work seamlessly with <a href="https://www.tomsguide.com/ai/alexa-release-date-cost-devices-and-all-the-new-ai-features">Alexa+</a>. While that integration is certainly a selling point, I’m truly impressed by the hardware that elevates this Android tablet above its peers and even puts it on par with the <a href="https://www.tomsguide.com/best-picks/best-ipad">best iPads</a>.</p><p>The sturdy aluminum unibody is great in hand, making it feel like a premium device. It’s also thin and light enough to hold comfortably for extended periods. My favorite feature is the 12-inch 2.8K display. Though it’s not an OLED, everything you see looks bright and colorful. The optional Nanomatte anti-glare option is also a huge game-changer.</p><p>This Alexa tablet runs full-blown Android, bringing Google Play services to an Amazon tablet for the first time. It also serves as an excellent replacement for the <a href="https://www.tomsguide.com/us/best-e-readers,review-2766.html">best Kindles</a>. This helps make the Alexa tablet feel like an extension of the Amazon ecosystem, though that part might not matter much if you don’t already own Alexa devices or a Kindle.</p><p>After using the Amazon Alexa Tablet 12 Pro as my daily driver for watching videos and reading for the better part of a week, I can comfortably say it’s one of the <a href="https://www.tomsguide.com/best-picks/best-android-tablets">best Android tablets</a> and <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a> right now. Sure, it’s not for everyone, but if you’re an Alexa user or want a slate with an anti-glare screen, you won’t go wrong here. Find out more in my full review.</p><h3 class="article-body__section" id="section-amazon-alexa-tablet-12-pro-review-cheat-sheet"><span>Amazon Alexa Tablet 12 Pro review: Cheat sheet</span></h3><ul><li><strong>What is it?</strong> As its name suggests, the Amazon Alexa Tablet 12 Pro is a slate built to work with the Alexa ecosystem. Beyond that, it’s an Android tablet that arguably rivals Apple’s entry-level iPad.</li><li><strong>Who is it for?</strong> This device is for folks who want a tablet that can control their Alexa devices or an Android slate with an anti-glare display.</li><li><strong>What does it cost?</strong> The <a href="https://www.amazon.com/dp/B0DT2G69GW?th=1" target="_blank" rel="nofollow">Amazon Alexa Tablet 12 Pro starts at $499</a> for a model with 8GB of RAM and 128GB of storage. For $150 more, <a href="https://www.amazon.com/dp/B0FMS8C99W?th=1" target="_blank" rel="nofollow">you can add a Nanomatte display</a>. The most <a href="https://www.amazon.com/dp/B0DT25J8W8?th=1" target="_blank" rel="nofollow">expensive stand-alone model with 256GB</a> of storage and a Nanomatte display costs $679. A productivity bundle that includes the Alexa Pro Keyboard and Alexa Pro Pen is also on sale for $799.</li><li><strong>What do we like?</strong> We like the sleek design, lovely display, Alexa+ integration, smooth performance, and long-lasting battery life.</li><li><strong>What don’t we like?</strong> We don’t like the high cost of upgrading storage and moving to the Nanomatte model. The peripherals can also get quite pricey.</li></ul><h3 class="article-body__section" id="section-amazon-alexa-tablet-12-pro-review-specs"><span>Amazon Alexa Tablet 12 Pro review: Specs</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Amazon Alexa Tablet 12 Pro (starting)</strong></p></td><td  ><p><strong>Amazon Alexa Tablet 12 Pro (tested)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$499</p></td><td  ><p>$679</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>12-inch | 2800 x 1840 | 120Hz | 3:2 aspect ratio</p></td><td  ><p>12-inch | 2800 x 1840 | 120Hz | 3:2 aspect ratio</p></td></tr><tr><td class="firstcol " ><p><strong>Chip</strong></p></td><td  ><p>MediaTek Dimensity 8400 </p></td><td  ><p>MediaTek Dimensity 8400 </p></td></tr><tr><td class="firstcol " ><p><strong>Memory</strong></p></td><td  ><p>8GB</p></td><td  ><p>16GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>128GB</p></td><td  ><p>256GB</p></td></tr><tr><td class="firstcol " ><p><strong>Cameras</strong></p></td><td  ><p>8MP front camera | 13MP rear camera (both w 1080p video)</p></td><td  ><p>8MP front camera | 13MP rear camera (both w 1080p video)</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Wi-Fi 6, Bluetooth 5.3</p></td><td  ><p>Wi-Fi 6, Bluetooth 5.3</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>1x USB-C</p></td><td  ><p>1x USB-C</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>10.66 x 7.24 x 0.26 inches </p></td><td  ><p>10.66 x 7.24 x 0.26 inches </p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>1.2 pounds</p></td><td  ><p>1.2 pounds</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-amazon-alexa-tablet-12-pro-review-the-ups"><span>Amazon Alexa Tablet 12 Pro review: The ups</span></h3><p>The Alexa Tablet 12 Pro has a lot to offer, thanks to its superb display, sleek design, long battery life, and smart Alexa integration.</p><h2 id="sleek-design">Sleek design</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jGmcsAoWw4HxeLsCS97tcU" name="Alexa Tablet 12 Pro-7" alt="Amazon Alexa Tablet 12 Pro" src="https://cdn.mos.cms.futurecdn.net/jGmcsAoWw4HxeLsCS97tcU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Amazon didn’t reinvent the wheel of tablet design, as the Alexa Tablet has the basic form of modern-day slates. That said, it’s a beautiful aluminum slab with a slim profile and elegant curves. The all-black chassis also gives the tablet an air of sophistication.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="syYWdMhG4BZ9YNkustUBES" name="Alexa Tablet 12 Pro-6" alt="Amazon Alexa Tablet 12 Pro" src="https://cdn.mos.cms.futurecdn.net/syYWdMhG4BZ9YNkustUBES-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The design is decidedly minimalist. In landscape, the power button sits on the top-left edge, while the volume buttons sit on the top-left corner. The 8MP front camera lies right in the center, along the thin bezel. On the back, you’ll find the 13MP rear camera and the Alexa logo. Like most modern tablets, it has a single USB-C port on the right side, or bottom if you’re holding the tablet in portrait mode.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HyuP2scCa5FGVn2eW4mDcY" name="Alexa Tablet 12 Pro-9" alt="Amazon Alexa Tablet 12 Pro" src="https://cdn.mos.cms.futurecdn.net/HyuP2scCa5FGVn2eW4mDcY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Speakers flank the left and right sides, and they’re pretty good for tablet audio. Dialogue-heavy podcasts and videos sound great, with clear, distinct voices. The speakers also do a good job with movies and TV shows that feature a wide range of audio. And while music can lack bass, it’s still plenty punchy and clear.</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JofdMYaqrjT9D6dvpHkhgZ" name="Alexa Tablet 12 Pro-11" alt="Amazon Alexa Tablet 12 Pro" src="https://cdn.mos.cms.futurecdn.net/JofdMYaqrjT9D6dvpHkhgZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The 12-inch display on the Alexa Tablet 12 Pro is a wonder to behold. Everything appears crystal clear, thanks to the sharp 2800 x 1840 resolution that brings out even the smallest details. While this isn’t an OLED, it still delivers excellent contrast between dark and light elements. Colors are vivid, and the overall brightness never overwhelms.</p><p>I watched a lot of YouTube videos during my testing, and I loved how the matte display diffused the lighting in my living area. Whether it’s bright and bold animated series like <a href="https://www.tomsguide.com/entertainment/prime-video/invincible-season-4-get-ready-for-the-baddest-villain-ever">Invincible</a> or gritty action shows like <a href="https://www.tomsguide.com/news/best-shows-like-reacher">Reacher</a>, everything looks fantastic. I also appreciate how the matte display on this tablet doesn’t soften color nearly as much as I’ve seen on other devices utilizing similar tech.</p><div ><table><caption>Display benchmark results</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Alexa Tablet 12 Pro</strong></p></td><td  ><p><strong>Apple iPad (11th gen)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Nits (brightness)</strong></p></td><td  ><p>547 (SDR) | 555 (HDR)</p></td><td  ><p>506 (SDR) | 496 (HDR) </p></td></tr><tr><td class="firstcol " ><p><strong>sRGB</strong></p></td><td  ><p>109.7%</p></td><td  ><p>108.8% </p></td></tr><tr><td class="firstcol " ><p><strong>DCI-P3</strong></p></td><td  ><p>77.7%</p></td><td  ><p>77.1% </p></td></tr><tr><td class="firstcol " ><p><strong>Delta-E</strong></p></td><td  ><p>0.22</p></td><td  ><p>0.30</p></td></tr></tbody></table></div><p>How did the Alexa Tablet 12 Pro do in our display benchmarks? As you can see above, color reproduction (sRGB and DCI-P3) isn’t oversaturated, and color accuracy (Delta-E) matches other tablets and laptops we’ve tested.</p><p>The numbers line up with my experience, as I found the hues generally looked natural. HDR brightness doesn’t get as high as on other devices, but to my eyes, the brightness was just perfect. Numbers-wise, the Alexa Tablet 12 Pro is comparable to the <a href="https://www.tomsguide.com/computing/ipads/ipad-11-2025-review">Apple iPad 11</a>.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="SRbrcE2xVpabnsQPmGtVUo" name="Alexa Tablet 12 Pro-12" alt="Amazon Alexa Tablet 12 Pro" src="https://cdn.mos.cms.futurecdn.net/SRbrcE2xVpabnsQPmGtVUo-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The display on my review unit has a slightly rough texture that mimics paper, which is great for reading. Speaking of reading, comic books look gorgeous because the matte display slightly mutes colors, creating a more paper-like appearance. If you’re into reading digital comics like I am, this is arguably the best tablet for reading your favorite funnies.</p><h2 id="strong-performance">Strong 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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xNNSrCUvmDJJk22EnMVHhh" name="Alexa Tablet 12 Pro-25" alt="Amazon Alexa Tablet 12 Pro" src="https://cdn.mos.cms.futurecdn.net/xNNSrCUvmDJJk22EnMVHhh-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Alexa Tablet 12 Pro delivers solid performance for an Android tablet, thanks to its mid-range MediaTek Dimensity 8400 processor and 8GB of RAM. While this isn’t a workhorse tablet, it generally performs well for web browsing and video streaming. However, I noticed that performance slowed when I opened up multiple Chrome tabs and other apps.</p><div ><table><caption>Performance benchmarks</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Amazon Alexa Tablet 12 Pro</strong></p></td><td  ><p><strong>Apple iPad (11th gen)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6 (single-core / multi-core)</strong></p></td><td  ><p>1666 / 6677</p></td><td  ><p>2589 / 6176 </p></td></tr><tr><td class="firstcol " ><p><strong>3DMark Wild Life Extreme Unlimited (score/fps)</strong></p></td><td  ><p>3376 / 20.2</p></td><td  ><p>2623 / 15.7</p></td></tr></tbody></table></div><p>On the Geekbench 6 CPU test, Amazon’s new tablet scored similarly to the Apple iPad 11 in both single- and multi-core performance. These results match my experience: throwing too much at Amazon’s slate makes it struggle.</p><p>You can certainly use this tablet for productivity, especially with its optional peripherals, but it won’t replace a traditional laptop. However, if you’re using Amazon’s slate mainly for entertainment and light work in Google Docs, its performance won’t disappoint.</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cRxrXz4eK8NrQSTkCwBCen" name="Alexa Tablet 12 Pro-23" alt="Amazon Alexa Tablet 12 Pro" src="https://cdn.mos.cms.futurecdn.net/cRxrXz4eK8NrQSTkCwBCen-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Alexa Tablet 12 Pro delivers excellent battery life. In our battery life test, which involves continuous web surfing over Wi-Fi with the display set to 150 nits of brightness, the tablet endured for an astonishing 13 hours and 17 minutes! As you can see below, that’s almost two hours longer than the iPad 11.</p><div ><table><caption>Battery life test</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Time (hours:mins)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Amazon Alexa Tablet 12 Pro</strong></p></td><td  ><p>13:17</p></td></tr><tr><td class="firstcol " ><p><strong>Apple iPad (11th gen)</strong></p></td><td  ><p>11:25</p></td></tr></tbody></table></div><p>During a stay-at-home weekend, when I sporadically watched YouTube videos and read comics and novels with the display at 70% brightness, the tablet generally dropped from 80% battery to the low 40s over 16 hours.</p><p>On weeknights when I’m only home in the evening, the battery drops by about 10% over four hours of use. This is more than enough for all-day usage!</p><h2 id="seamless-amazon-ecosystem-integration">Seamless Amazon ecosystem integration</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="TTJ34AboNJvXVtfq6MVpC6" name="Alexa Tablet 12 Pro-5" alt="Amazon Alexa Tablet 12 Pro" src="https://cdn.mos.cms.futurecdn.net/TTJ34AboNJvXVtfq6MVpC6-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Alexa Tablet 12 Pro works great as a standalone slate, but it really shines as a hub for your Amazon devices and apps. As Amazon says, the tablet has the intelligence of Alexa+ and has built-in access to Google Play Store apps. And naturally, the tablet also works well as a Kindle.</p><p>I own an Amazon Echo Dot and have two smart lights that support Alexa. When I was winding down for the night, I could dim the lights right on the tablet instead of pulling out my phone to open the Alexa app. And if I wanted to fire up a song on my Echo Dot, I either typed or vocalized the request to the tablet. All of this was relatively seamless. If you don’t care to chat with Alexa, you can go into settings to swap to Google or Bing’s respective voice assistants.</p><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="gVEZ9NujTfuxj3RyS2yFbf" name="Alexa Tablet 12 Pro-24" alt="Amazon Alexa Tablet 12 Pro" src="https://cdn.mos.cms.futurecdn.net/gVEZ9NujTfuxj3RyS2yFbf-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I’m a fan of Kindles, so I loved using this tablet as another Kindle device. When you open the Kindle app, a fun wave-like animation washes across the screen. This isn’t just for show, as the tablet instantly lowers blue light and disables notifications to replicate the Kindle reading experience. This also helps extend battery life. I also like that it has three visual modes: full color, muted colors like on a <a href="https://www.tomsguide.com/computing/e-readers/kindle-colorsoft-2026-review">Kindle Colorsoft</a>, or full black and white.</p><p>If you own a lot of Alexa-supported devices, this Alexa tablet does a nice job of letting you control them all. It serves that purpose well, but it might not be a feature for everyone, which leads us into the next section…</p><h2 id="sharp-cameras">Sharp cameras</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:75.00%;"><img id="W9MWh8NbSFjQ3xjH9WsPEG" name="Alexa Tablet 12 Pro front camera" alt="Amazon Alexa Tablet 12 Pro" src="https://cdn.mos.cms.futurecdn.net/W9MWh8NbSFjQ3xjH9WsPEG-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1920" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you want to look your best on video calls or snap some photos, the tablet’s front and rear cameras are up to the task. The front 8MP camera captures details of my face, clothing, and background, as you can see above.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:75.00%;"><img id="LSsmecC4i56gk9Mh93TCuR" name="Alexa Tablet 12 Pro back camera" alt="Amazon Alexa Tablet 12 Pro" src="https://cdn.mos.cms.futurecdn.net/LSsmecC4i56gk9Mh93TCuR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1920" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Then there’s the 13MP back camera, which also captures details nicely. While I wouldn’t personally use a tablet to take selfies or capture video, I’m impressed by the strong resolution both cameras deliver.</p><h3 class="article-body__section" id="section-amazon-alexa-tablet-12-pro-review-the-downs"><span>Amazon Alexa Tablet 12 Pro review: The downs</span></h3><p>While the Amazon Alexa Tablet 12 Pro is a great Android tablet, it has its drawbacks.</p><h2 id="for-amazon-users-only">For Amazon users only</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="tnP9nTjmQss2C6Q2jyWFDZ" name="Alexa Tablet 12 Pro-4" alt="Amazon Alexa Tablet 12 Pro" src="https://cdn.mos.cms.futurecdn.net/tnP9nTjmQss2C6Q2jyWFDZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>This is a very Alexa-centric tablet. That's clear the moment you see the home screen, where you’ll find an assortment of Amazon apps like Prime Video, Audible, Kindle, the Silk browser… and even Luna!</p><p>And since it runs on Android, you can also quickly access a slew of Google apps. If that wasn’t enough, UI elements like an Alexa+ widget in the bottom-right corner also remind you that this is an Alexa device.</p><p>All of this can be extremely handy for folks who often utilize Amazon and Google apps. I use many of the latter and several of the former, and it’s nice being able to access those apps quickly. However, if you’re not invested in the Amazon ecosystem, they might as well be bloatware, especially if you just want a no-frills Android tablet.</p><p>Speaking of Android, it’s still not nearly as snappy and consistent as <a href="https://www.tomsguide.com/computing/vr-ar/ipados-27-everything-coming-to-the-apples-beloved-tablets">iPadOS</a>. There is always a slight bit of delay when scrolling through pages on sites and apps. I also had some apps take forever to load or completely crash unexpectedly. Those instances aren’t frequent, but they happen far more often than they do on an iPad.</p><h2 id="expensive-peripherals">Expensive peripherals</h2><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="AzZGtXeyUF9yMbYBef5cd4" name="Alexa Tablet 12 Pro-LIST1" alt="Amazon Alexa Tablet 12 Pro" src="https://cdn.mos.cms.futurecdn.net/AzZGtXeyUF9yMbYBef5cd4-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>To get even more use from the Alexa Tablet 12 Pro, you can purchase the Alexa Pro Keyboard and Alexa Pro Pen.</p><p>The Pro Keyboard isn't just for typing; it also doubles as a protective case for the tablet. This peripheral has a leather-like texture that feels good against your fingers and palms. The membrane keys are better than you’d expect for a tablet keyboard, with nice travel distance and even spacing. I don’t have problems typing on this keyboard, even with my big hands. I also like the dedicated Alexa button beside the arrow keys that instantly brings up the AI assistant.</p><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="Uo5W9NiuW4e63q4n6wQ76D" name="Alexa Tablet 12 Pro-19" alt="Amazon Alexa Tablet 12 Pro" src="https://cdn.mos.cms.futurecdn.net/Uo5W9NiuW4e63q4n6wQ76D-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Pro Pen is a pretty great stylus, having a similar weight and feel to an Apple Pencil Pro. Thanks to the tablet’s matte texture, writing with the stylus (almost) feels like writing on paper. Writing notes in the margins of a Kindle book is almost identical to doing the same action on a Kindle Scribe — which makes sense given how they’re both Amazon devices.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Lo8sZjUTNjoPjKLSsfN86H" name="Alexa Tablet 12 Pro-15" alt="Amazon Alexa Tablet 12 Pro" src="https://cdn.mos.cms.futurecdn.net/Lo8sZjUTNjoPjKLSsfN86H-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>While I think the Pro Keyboard and Pro Pen are excellent peripherals, they’re both pretty expensive — the former costs $149 and the latter $89. There’s currently a $799 bundle that saves you $120, but that’s still a steep price to pay on top of the tablet.</p><h3 class="article-body__section" id="section-amazon-alexa-tablet-12-pro-review-verdict"><span>Amazon Alexa Tablet 12 Pro review: Verdict</span></h3><p>I enjoyed my time with the Amazon Alexa Tablet 12 Pro, as it’s a far better slate than I expected. Sure, Android can be somewhat sluggish, and I've rarely (if ever) needed to interact with Alexa+, but the excellent hardware ultimately won me over. The design is perfect, and the Nanomatte display makes for a wonderful viewing and reading experience. I also love how this tablet doubles as a Kindle.</p><p>Serious Alexa or Google users will find a lot to like about the Alexa Tablet 12 Pro. If you don’t fall into that category, the iPad 11 offers a more responsive, stable operating system and has almost all the apps and services on the Alexa Tablet 12 Pro. But if you liked what I had to say about this slate, then you should consider checking it out. You might end up loving it as much as I have!</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Fire Tablets are dead — Amazon announces new Alexa tablet lineup running Android ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Just as its leaving Android on its Fire TV sticks, Amazon is adopting Google's operating system for its newest generation of tablets, dousing its Fire OS — and moniker — after more than a decade. </p><p>At the same time, Amazon's new tablets now prominently feature <a href="https://www.tomsguide.com/ai/ive-been-using-alexa-for-3-months-here-are-my-5-favorite-features-and-one-im-not-a-fan-of">Alexa+</a> as a persistent widget that lives in the lower righthand corner of the devices, to be summoned at a moment's notice. </p><p>In addition to receiving spoken or written queries, Alexa+ is also able to look at whatever is on the screen of the tablet, and act on your prompts. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mHcSch2shzBNChV3ACbNBf" name="Amazon tablet Alexa" alt="Alexa+ widget on Amazon Alexa tablet" src="https://cdn.mos.cms.futurecdn.net/mHcSch2shzBNChV3ACbNBf-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>For example, you might have a picture of a plant you've photographed on the screen; Alexa+ can look at the photo and tell you what it is.</p><p>The other really clever feature on the new Alexa tablets is a "Kindle Mode" — open the Kindle app, and the tablet will silence notifications and change the display to a more Kindle-like experience, muting the colors and making it seem closer to an actual e-reader. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:344px;"><p class="vanilla-image-block" style="padding-top:56.40%;"><img id="aeNBvxndSihz5NEK5Rk9A8" name="Amazon Alexa tablet" alt="Kindle mode on Amazon Alexa tablet" src="https://cdn.mos.cms.futurecdn.net/aeNBvxndSihz5NEK5Rk9A8-1920-80.gif" mos="" align="middle" fullscreen="" width="344" height="194" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Here's a rundown of the new tablets; there are five in all — three Amazon Alexa Tablets, and two Amazon Kids Tablets, aimed at younger audiences.</p><h3 class="article-body__section" id="section-amazon-alexa-tablets"><span> Amazon Alexa Tablets</span></h3><h2 id="amazon-alexa-tablet-12-pro">Amazon Alexa Tablet 12 Pro</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/QoSMaSPrQFLYFsJUF24uJT-1920-80.jpg" alt="Amazon Alexa tablet 12 Pro with nanomatte display on left" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/BR8cXm7eRaxCjbrNijsxfE-1920-80.jpg" alt="Amazon Alexa tablet in portrait mode" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/s8VqCz7S4WxRRNRfo59JAK-1920-80.jpg" alt="Amazon Alexa tablet thickness" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/VMA3Zm8DUCXBjHnydq6SWN-1920-80.jpg" alt="Amazon Alexa tablet" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>The headlining model is the Alexa Tablet 12 Pro and its optional nanomatte display. Amazon said it worked with Corning to create a photolithography process that helps preserve color and contrast while cutting down on glare.</p><p>Looking at the nanomatte and glossy displays side by side, the latter did exhibit deeper blacks, though the nanomatte display was pretty close — and as you can tell by the photo, dramatically reduces the glare. </p><p>When using both my finger and the optional stylus, the nanomatte display also felt very comfortable and smooth.</p><p>The Tablet 12 Pro, like the other modes, is made out of aluminum, and has a much more premium feel than older Fire tablets. It's 6.5mm at its thinnest, and has a 12-inch, 280 PPI display (2800x1840) with a 120Hz refresh rate and a rated brightness of 500 nits. It has a 3:2 aspect ratio, which Amazon says is better suited for productivity work. </p><p>Inside is a 4nm 8-core chip with up to 16GB of RAM, along with Dolby Atmos speakers,  and Wi-Fi 6E. Amazon says the Tablet 12 Pro will last up to 16 hours of video playback, which goes up to 20 hours when in Kindle mode. </p><p>One of the long edges of the tablet has a small indentation to magnetically attach  the Amazon Alexa Tablet Pro Pen ($89.99, sold separately); on the other edge is a pin connector for the Amazon Alexa Tablet Pro Keyboard ($149.99).</p><p>The Amazon Alexa Tablet 12 Pro will start at $499.99 with 8GB of RAM and 128GB of storage; the nanomatte model starts at $549.99.</p><h2 id="amazon-alexa-tablet-11">Amazon Alexa Tablet 11</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qGPJ8bAvR2XgRUebHnVfXd" name="Amazon Alexa tablet purple" alt="Amazon Alexa tablet purple" src="https://cdn.mos.cms.futurecdn.net/qGPJ8bAvR2XgRUebHnVfXd-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Geared more for entertainment, the Amazon Alexa Tablet 11 has a 2.5K display (276 ppi, 2560x1600, 90Hz refresh rate) in a 16:10 aspect ratio, which the company says will be better if you want to kick back and watch a movie. </p><p>Like the 12-inch model, it has an aluminum unibody, but has an 8-core processor with 8GB of RAM, dual Dolby Atmos speakers, and will last up to 15 hours playing video.  </p><p>Amazon Alexa Tablet 11 starts at $329.99 in Graphite, Amethyst, and Matcha, with 8GB RAM and 64GB storage; unlike the Tablet 12 Pro, there's no option for a nanomatte display.</p><h2 id="amazon-alexa-tablet-8">Amazon Alexa Tablet 8</h2><p>Last is the Amazon Alexa Tablet 8, which has an 8.7-inch 1340x800 display, and weighs 11.6 ounces. It has an 8-core processor, Wi-Fi 6 and will last up to 14 hours of video playback. It starts at $229.99 with 4GB RAM and 64GB storage, and comes in three colors: Graphite, Rosette, and Teal.</p><h3 class="article-body__section" id="section-amazon-kids-tablets"><span>Amazon Kids Tablets</span></h3><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/Dia22498riA4tx6tmqmrsn-1920-80.jpg" alt="Amazon Kids Tablets" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/8au4XaQ85pi9ZXX6ek9Fxn-1920-80.jpg" alt="Amazon Kids Tablets" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/fvnz6fV9qAmAH5y6moUfvn-1920-80.jpg" alt="Amazon Kids Tablets" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>Amazon is also relaunching its Kids Tablets in two sizes: 8.7 inches and 11 inches. Like earlier models, these too will come with protective bumper cases, which will be offered with designs from popular franchises like Paw Patrol and Barbie. The 8-inch tablet will last up to 14 hours on a charge when playing video, and the 11-inch will last up to 15 hours.</p><p>Like previous kids' tablets, these models will have the usual array of parental controls, from content restrictions to time limits to whitelisted web pages. Like the grown-up tablets, there's an Alexa+ button in the corner, but it's a more siloed, kid-friendly version. </p><p>The Amazon Kids Tablet 8 starts at $229.99 and Amazon Kids Tablet 11 starts at $329.99.</p><h3 class="article-body__section" id="section-outlook"><span>Outlook</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YB8kVJeRzYJ4GKBZeMjxJ7" name="Amazon Alexa tablets" alt="Amazon Alexa tablets" src="https://cdn.mos.cms.futurecdn.net/YB8kVJeRzYJ4GKBZeMjxJ7-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>All of the new Amazon tablets will be go on sale in the U.S., Mexico, and Canada on October 14, 2026, and will be available in the UK, Germany, France, Italy, and Spain on October 19. </p><p>Having held all of the new tablets, I can attest to their much-improved design, and the 12-inch model certainly felt responsive when I was swiping and using the stylus; we'll have to get one in our lab to see how it compares to the <a href="https://www.tomsguide.com/best-picks/best-android-tablets">best Android tablets</a>, but its matte display will surely be a differentiator.</p><p>Even though these tablets have Alexa+ as their go-to AI, because these are Android-based, you can also use Gemini as the default voice assistant, which makes for an interesting dichotomy.</p><p>These new tablets are also more expensive than previous versions; the Fire HD 8 tablet, for instance, only cost $129, while the kids' model was $179. This is partly a reflection on the current state of electronics as well as the fact that the new tablets use more durable materials, but the higher prices could give some parents pause.</p><p>Stay tuned for our full assessments of these devices; we hope to get them reviewed soon. </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/tablets/i-finally-found-a-tablet-with-a-paper-like-display-thats-perfect-for-productivity-without-the-distractions"><strong>I finally found a tablet with a paper-like display that’s perfect for productivity without the distractions</strong></a></li><li><a href="https://www.tomsguide.com/computing/android-tablets/i-thought-smaller-was-better-until-i-tried-a-massive-14-inch-tablet-that-feels-like-a-clipboard"><strong>I thought smaller was better until I tried a massive 14-inch tablet that feels like a clipboard</strong></a></li><li><a href="https://www.tomsguide.com/computing/tablets/lenovo-tab-plus-gen-2-review"><strong>I used this Android tablet for three weeks — and its giant speaker has spoiled me</strong></a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/android-tablets/fire-tablets-are-dead-amazon-announces-new-alexa-tablet-lineup-running-android</link>
                                                                            <description>
                            <![CDATA[ Amazon has redone its entire tablet lineup with a new design, switching to Android and integrating Alexa+. Here's our hands-on look at all of them, their price, and when you can order them. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">pKRoCuYj56BDxDyoLKM8ZA</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/2dEqozdDcqfPnm9LFhSL7S-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 08 Oct 2026 13:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                <author><![CDATA[ mike.prospero@futurenet.com (Mike Prospero) ]]></author>                    <dc:creator><![CDATA[ Mike Prospero ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xeJFBrJwXQzCqXLZXBFBKQ-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Michael A. Prospero is the U.S. Editor-in-Chief for Tom’s Guide.  In his spare time, he also tests out the latest drones, electric scooters, and smart home gadgets, such as video doorbells. Before his tenure at Tom&#039;s Guide, he was the Reviews Editor for Laptop Magazine, a reporter at Fast Company, the Times of Trenton, and, many eons back, an intern at George magazine. He received his undergraduate degree from Boston College, where he worked on the campus newspaper The Heights, and then attended the Columbia University school of Journalism. When he’s not testing out the latest running watch, electric scooter, or skiing or training for a marathon, he’s probably using the latest sous vide machine, smoker, or pizza oven, to the delight — or chagrin — of his family.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/2dEqozdDcqfPnm9LFhSL7S-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Amazon Alexa Tablet Pro 12]]></media:description>                                                            <media:text><![CDATA[Amazon Alexa Tablet Pro 12]]></media:text>
                                <media:title type="plain"><![CDATA[Amazon Alexa Tablet Pro 12]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/2dEqozdDcqfPnm9LFhSL7S-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Just as its leaving Android on its Fire TV sticks, Amazon is adopting Google's operating system for its newest generation of tablets, dousing its Fire OS — and moniker — after more than a decade. </p><p>At the same time, Amazon's new tablets now prominently feature <a href="https://www.tomsguide.com/ai/ive-been-using-alexa-for-3-months-here-are-my-5-favorite-features-and-one-im-not-a-fan-of">Alexa+</a> as a persistent widget that lives in the lower righthand corner of the devices, to be summoned at a moment's notice. </p><p>In addition to receiving spoken or written queries, Alexa+ is also able to look at whatever is on the screen of the tablet, and act on your prompts. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mHcSch2shzBNChV3ACbNBf" name="Amazon tablet Alexa" alt="Alexa+ widget on Amazon Alexa tablet" src="https://cdn.mos.cms.futurecdn.net/mHcSch2shzBNChV3ACbNBf-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>For example, you might have a picture of a plant you've photographed on the screen; Alexa+ can look at the photo and tell you what it is.</p><p>The other really clever feature on the new Alexa tablets is a "Kindle Mode" — open the Kindle app, and the tablet will silence notifications and change the display to a more Kindle-like experience, muting the colors and making it seem closer to an actual e-reader. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:344px;"><p class="vanilla-image-block" style="padding-top:56.40%;"><img id="aeNBvxndSihz5NEK5Rk9A8" name="Amazon Alexa tablet" alt="Kindle mode on Amazon Alexa tablet" src="https://cdn.mos.cms.futurecdn.net/aeNBvxndSihz5NEK5Rk9A8-1920-80.gif" mos="" align="middle" fullscreen="" width="344" height="194" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Here's a rundown of the new tablets; there are five in all — three Amazon Alexa Tablets, and two Amazon Kids Tablets, aimed at younger audiences.</p><h3 class="article-body__section" id="section-amazon-alexa-tablets"><span> Amazon Alexa Tablets</span></h3><h2 id="amazon-alexa-tablet-12-pro">Amazon Alexa Tablet 12 Pro</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/QoSMaSPrQFLYFsJUF24uJT-1920-80.jpg" alt="Amazon Alexa tablet 12 Pro with nanomatte display on left" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/BR8cXm7eRaxCjbrNijsxfE-1920-80.jpg" alt="Amazon Alexa tablet in portrait mode" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/s8VqCz7S4WxRRNRfo59JAK-1920-80.jpg" alt="Amazon Alexa tablet thickness" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/VMA3Zm8DUCXBjHnydq6SWN-1920-80.jpg" alt="Amazon Alexa tablet" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>The headlining model is the Alexa Tablet 12 Pro and its optional nanomatte display. Amazon said it worked with Corning to create a photolithography process that helps preserve color and contrast while cutting down on glare.</p><p>Looking at the nanomatte and glossy displays side by side, the latter did exhibit deeper blacks, though the nanomatte display was pretty close — and as you can tell by the photo, dramatically reduces the glare. </p><p>When using both my finger and the optional stylus, the nanomatte display also felt very comfortable and smooth.</p><p>The Tablet 12 Pro, like the other modes, is made out of aluminum, and has a much more premium feel than older Fire tablets. It's 6.5mm at its thinnest, and has a 12-inch, 280 PPI display (2800x1840) with a 120Hz refresh rate and a rated brightness of 500 nits. It has a 3:2 aspect ratio, which Amazon says is better suited for productivity work. </p><p>Inside is a 4nm 8-core chip with up to 16GB of RAM, along with Dolby Atmos speakers,  and Wi-Fi 6E. Amazon says the Tablet 12 Pro will last up to 16 hours of video playback, which goes up to 20 hours when in Kindle mode. </p><p>One of the long edges of the tablet has a small indentation to magnetically attach  the Amazon Alexa Tablet Pro Pen ($89.99, sold separately); on the other edge is a pin connector for the Amazon Alexa Tablet Pro Keyboard ($149.99).</p><p>The Amazon Alexa Tablet 12 Pro will start at $499.99 with 8GB of RAM and 128GB of storage; the nanomatte model starts at $549.99.</p><h2 id="amazon-alexa-tablet-11">Amazon Alexa Tablet 11</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qGPJ8bAvR2XgRUebHnVfXd" name="Amazon Alexa tablet purple" alt="Amazon Alexa tablet purple" src="https://cdn.mos.cms.futurecdn.net/qGPJ8bAvR2XgRUebHnVfXd-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Geared more for entertainment, the Amazon Alexa Tablet 11 has a 2.5K display (276 ppi, 2560x1600, 90Hz refresh rate) in a 16:10 aspect ratio, which the company says will be better if you want to kick back and watch a movie. </p><p>Like the 12-inch model, it has an aluminum unibody, but has an 8-core processor with 8GB of RAM, dual Dolby Atmos speakers, and will last up to 15 hours playing video.  </p><p>Amazon Alexa Tablet 11 starts at $329.99 in Graphite, Amethyst, and Matcha, with 8GB RAM and 64GB storage; unlike the Tablet 12 Pro, there's no option for a nanomatte display.</p><h2 id="amazon-alexa-tablet-8">Amazon Alexa Tablet 8</h2><p>Last is the Amazon Alexa Tablet 8, which has an 8.7-inch 1340x800 display, and weighs 11.6 ounces. It has an 8-core processor, Wi-Fi 6 and will last up to 14 hours of video playback. It starts at $229.99 with 4GB RAM and 64GB storage, and comes in three colors: Graphite, Rosette, and Teal.</p><h3 class="article-body__section" id="section-amazon-kids-tablets"><span>Amazon Kids Tablets</span></h3><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/Dia22498riA4tx6tmqmrsn-1920-80.jpg" alt="Amazon Kids Tablets" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/8au4XaQ85pi9ZXX6ek9Fxn-1920-80.jpg" alt="Amazon Kids Tablets" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/fvnz6fV9qAmAH5y6moUfvn-1920-80.jpg" alt="Amazon Kids Tablets" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>Amazon is also relaunching its Kids Tablets in two sizes: 8.7 inches and 11 inches. Like earlier models, these too will come with protective bumper cases, which will be offered with designs from popular franchises like Paw Patrol and Barbie. The 8-inch tablet will last up to 14 hours on a charge when playing video, and the 11-inch will last up to 15 hours.</p><p>Like previous kids' tablets, these models will have the usual array of parental controls, from content restrictions to time limits to whitelisted web pages. Like the grown-up tablets, there's an Alexa+ button in the corner, but it's a more siloed, kid-friendly version. </p><p>The Amazon Kids Tablet 8 starts at $229.99 and Amazon Kids Tablet 11 starts at $329.99.</p><h3 class="article-body__section" id="section-outlook"><span>Outlook</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YB8kVJeRzYJ4GKBZeMjxJ7" name="Amazon Alexa tablets" alt="Amazon Alexa tablets" src="https://cdn.mos.cms.futurecdn.net/YB8kVJeRzYJ4GKBZeMjxJ7-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>All of the new Amazon tablets will be go on sale in the U.S., Mexico, and Canada on October 14, 2026, and will be available in the UK, Germany, France, Italy, and Spain on October 19. </p><p>Having held all of the new tablets, I can attest to their much-improved design, and the 12-inch model certainly felt responsive when I was swiping and using the stylus; we'll have to get one in our lab to see how it compares to the <a href="https://www.tomsguide.com/best-picks/best-android-tablets">best Android tablets</a>, but its matte display will surely be a differentiator.</p><p>Even though these tablets have Alexa+ as their go-to AI, because these are Android-based, you can also use Gemini as the default voice assistant, which makes for an interesting dichotomy.</p><p>These new tablets are also more expensive than previous versions; the Fire HD 8 tablet, for instance, only cost $129, while the kids' model was $179. This is partly a reflection on the current state of electronics as well as the fact that the new tablets use more durable materials, but the higher prices could give some parents pause.</p><p>Stay tuned for our full assessments of these devices; we hope to get them reviewed soon. </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/tablets/i-finally-found-a-tablet-with-a-paper-like-display-thats-perfect-for-productivity-without-the-distractions"><strong>I finally found a tablet with a paper-like display that’s perfect for productivity without the distractions</strong></a></li><li><a href="https://www.tomsguide.com/computing/android-tablets/i-thought-smaller-was-better-until-i-tried-a-massive-14-inch-tablet-that-feels-like-a-clipboard"><strong>I thought smaller was better until I tried a massive 14-inch tablet that feels like a clipboard</strong></a></li><li><a href="https://www.tomsguide.com/computing/tablets/lenovo-tab-plus-gen-2-review"><strong>I used this Android tablet for three weeks — and its giant speaker has spoiled me</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I finally found a tablet with a paper-like display that’s perfect for productivity without the distractions ]]></title>
                                                                                                <dc:content><![CDATA[ <p>When my phone’s screen isn’t large enough for the task at hand, I often reach for a tablet instead. However, unless you charge yours religiously every night, picking one up usually means finding a dead battery and a digital paperweight.</p><p>Over the years, I’ve tested many of the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a> — from a <a href="https://www.tomsguide.com/computing/tablets/i-thought-the-ipad-mini-was-the-perfect-small-tablet-until-i-tried-the-lenovo-legion-tab-3-heres-why">compact, gaming-focused slate</a> to a <a href="https://www.tomsguide.com/computing/android-tablets/i-thought-smaller-was-better-until-i-tried-a-massive-14-inch-tablet-that-feels-like-a-clipboard">massive 14-inch one</a> that felt more like a clipboard than something you could easily slide into a bag. Yet of all the devices I’ve used, only one ever solved the constant battery-drain dilemma.</p><p>With its magnetic charging dock, I really felt like Google's <a href="https://www.tomsguide.com/opinion/i-swapped-the-smart-display-under-my-monitor-with-the-pixel-tablet-for-a-week-heres-what-happened">Pixel Tablet</a> set a new standard that other companies would follow. Boy, was I wrong. Not only did Google recently discontinue the Pixel Tablet, but I've yet to see another manufacturer attempt a similar always-charged dock setup.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="high" data-lazy-src="https://www.youtube-nocookie.com/embed/qwVYmV1o7oI" allowfullscreen></iframe></div></div><p>If you can’t keep a device permanently docked, the next best solution is a low-power, simplified approach that simply refuses to die. After testing out TCL's full-featured NXTPAPER tablets, I recently got my hands on the new TCL Note A1. Unlike those general-purpose slates, this one is built entirely around reading, writing, and taking notes with its included T-Pen Pro stylus.</p><p>After using the Note A1 for the past three weeks, it’s become the only tablet I reach for at my desk — and the one I slip into my backpack whenever I leave the house. If you’ve had your eyes on a productivity-focused slate from reMarkable, Boox, or even Amazon’s Kindle Scribe, here’s why the TCL Note A1 deserves a spot on your shortlist.</p><div class="product"><a data-dimension112="eaec54b2-bee2-11f1-af98-2917d8add4c5" data-action="Deal Block" data-label="Note A1" data-dimension48="Note A1" data-dimension25="$499" href="https://www.amazon.com/TCL-Note-A1-NXTPAPER-Display/dp/B0H5K8NBZS?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:71.80%;"><img id="WkbivRavguyL6xfnw9wxNE" name="Note A1" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/WkbivRavguyL6xfnw9wxNE-1920-80.jpg" mos="" align="middle" fullscreen="" width="1500" height="1077" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/TCL-Note-A1-NXTPAPER-Display/dp/B0H5K8NBZS?th=1" target="_blank" rel="nofollow" data-dimension112="eaec54b2-bee2-11f1-af98-2917d8add4c5" data-action="Deal Block" data-label="Note A1" data-dimension48="Note A1" data-dimension25="$499">Note A1: was $599 now $499</a></strong><br>This ultra-slim 5.5mm Android slate features an 11.5-inch 120Hz NXTPAPER display, an 8,000 mAh battery, and an included T-Pen Pro stylus. Designed for distraction-free reading, writing, and digital note-taking, it combines the eye-comfort feel of paper with full Android productivity. <a class="view-deal button" href="https://www.amazon.com/TCL-Note-A1-NXTPAPER-Display/dp/B0H5K8NBZS?th=1" target="_blank" rel="nofollow" data-dimension112="eaec54b2-bee2-11f1-af98-2917d8add4c5" data-action="Deal Block" data-label="Note A1" data-dimension48="Note A1" data-dimension25="$499">View Deal</a></p></div><h2 id="a-display-first-approach">A display-first approach</h2><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="yZk5phidxSGXMoerAs2UX8" name="TCL Note A1-1295" alt="A person setting up fingerprint unlock on the TCL Note A1 tablet" src="https://cdn.mos.cms.futurecdn.net/yZk5phidxSGXMoerAs2UX8-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Note A1 that TCL sent over for me to check out arrived in a single box split in two. While the larger half held the tablet itself along with a stylus, some extra pen tips, and a charging cable, the smaller half held a magnetic flip cover.</p><p>Right from the start, I knew I was dealing with a very different type of tablet thanks to the quote printed on the inside of its box: “Knowledge grows by piling up facts, wisdom shines through simplicity.” I couldn’t sum up the design philosophy behind the Note A1 better myself.</p><p>At 10.24 x 7.74 x 0.22 inches, this 11.5-inch tablet gives you plenty of screen space to work with in an incredibly slim package. Meanwhile, at 500 grams or just over a pound, the Note A1 is designed to be easy to carry and take with you anywhere — because you never know when inspiration will strike.</p><p>Instead of going with thin bezels all the way around, the one on the left side of the device is a bit larger at roughly three-quarters of an inch wide, just like on the original <a href="https://www.tomsguide.com/tablets/e-readers/kindle-scribe-2024-review">Kindle Scribe</a>. The larger size makes the device easier to hold in your left hand while you write, but that extra space is also used to house a home button with a built-in fingerprint scanner. </p><p>This is a bit different from the rest of TCL’s NXTPAPER tablets that lack a fingerprint scanner, but I found it to be a welcome addition — just like the one integrated into the power button on my <a href="https://www.tomsguide.com/phones/i-spent-a-month-with-this-usd330-smartphone-with-a-paper-like-display-and-it-completely-changed-my-mind-on-budget-phones">NXTPAPER 70 Pro phone</a>.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.29%;"><img id="knXVnkRmboLQ9HbmrBz2YB" name="TCL Note A1-1294" alt="A close-up shot of the USB-C port on the side of the TCL Note A1 tablet" src="https://cdn.mos.cms.futurecdn.net/knXVnkRmboLQ9HbmrBz2YB-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1441" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>When you look around the sides of the Note A1, you won’t find much. There’s a power button on the top left, and then on the bottom right, there’s a USB-C port for charging. Given it wasn’t designed as a media consumption device like a lot of other tablets, there isn’t a physical volume rocker.</p><p>If you’re wondering why the USB-C port isn’t centered, I suspect this probably has to do with TCL’s optional keyboard case. When attached, you can plug a charging cable in cleanly on the bottom right without having it hanging awkwardly from the middle of the device. It’s a small but well-thought-out touch.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.29%;"><img id="wnYi3s4nCZ5V6GbzQfPaaE" name="TCL Note A1-1293" alt="The back of the TCL Note A1 tablet showing off its magnets, pogo pins and rear camera" src="https://cdn.mos.cms.futurecdn.net/wnYi3s4nCZ5V6GbzQfPaaE-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1441" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Around back, the Note A1 has small, circular magnets wrapped in soft-touch plastic on three of its corners along with a 13 MP rear camera and a trio of pogo pins for connecting the keyboard case. The tablet’s case is made from aerospace-grade aluminum, and in addition to letting you quickly snap on a cover, these round magnets prevent the back of the device from getting scratched.</p><p>TCL definitely went with a less-is-more approach with some parts of the Note A1, but the company didn’t skimp on its specs either. Powered by an older but very efficient MediaTek Helio G100 processor, the tablet ships with 8GB of RAM and 256GB of storage. </p><p>Despite being less than a quarter inch thick, the Note A1 still packs an 8,000 mAh battery with 33W fast charging. The display is the star of the show, though, and instead of an E-Ink screen, it’s equipped with an 11.5-inch NXTPAPER Pure display with a 3:2 aspect ratio and my personal favorite, matte anti-glare glass.</p><p>After adding my fingerprint and going through the rest of the setup process, it was time to see what the Note A1 was capable of.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-O6yaVW"></div>                            </div>                            <script src="https://kwizly.com/embed/O6yaVW.js" async></script><h2 id="not-your-typical-tablet">Not your typical tablet</h2><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="QEsqGyDR4vmDoP5GsvJXPH" name="TCL Note A1-1292" alt="A person reading a book on the TCL Note A1 tablet" src="https://cdn.mos.cms.futurecdn.net/QEsqGyDR4vmDoP5GsvJXPH-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Instead of completely reinventing the wheel, TCL took many of the best aspects of its NXTPAPER tablets and incorporated them into the Note A1. </p><p>While you can’t switch between modes and instantly go from full color to black and white like with other NXTPAPER devices, you still get that matte, paper-like quality from the tablet, which makes reading ebooks and documents a very satisfying experience that’s also easy on the eyes.</p><p>The Note A1 isn’t entirely black and white, either. There are hints of color throughout its UI, and you can look at photos or watch YouTube videos like you would on any other tablet. Speaking of the display, it's flicker-free and buttery smooth thanks to its 120Hz refresh rate. You won’t see any of the typical lag you do on an E-Ink screen here.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ENVpWtmTX6oQNeCBotAXFM" name="TCL Note A1-main-menu-settings" alt="A pair of screenshots showing off the TCL Note A1 tablet's home screen and settings menu" src="https://cdn.mos.cms.futurecdn.net/ENVpWtmTX6oQNeCBotAXFM-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Besides its lack of volume buttons, the one thing that made me instantly realize the Note A1 isn’t just your typical tablet occurred the instant I turned it on for the first time. Instead of going to your standard Android home screen, the device’s main page is actually for notes. You can view all of your existing notes and documents or create new ones with a tap on the plus icon.</p><p>The Note A1 is powered by Android, and once you dive into the settings menu, this is immediately apparent. However, the Android version wasn’t listed there, and tapping on the build number didn’t unlock developer options like it does on other Android devices.</p><p>It did take me a bit to get used to, but now that I’ve become accustomed to the Note A1’s Android skin, I actually wouldn’t mind seeing it on one of TCL’s next Android phones. At a time when people are installing custom launchers to fight doom-scrolling, the company did an excellent job of equipping this tablet with a distraction-free UI.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="v9dtCqY2TtU9LwTWqbV2UQ" name="TCL Note A1-ai-apps" alt="A pair of screenshots showing off the TCL Note A1 tablet's AI features and app drawer" src="https://cdn.mos.cms.futurecdn.net/v9dtCqY2TtU9LwTWqbV2UQ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Just like with its other recent tablets and phones, you also get access to all of TCL’s AI tools for transcription, translation, and more, but you can turn them off if you want. One AI feature I particularly liked is Inspiration Circle. When you long-press the button on the T-Pen Pro stylus, you can then circle a note or file to add it to a dedicated Inspiration Space.</p><p>In practice, this works a lot like the Essential Key and Essential Space on newer Nothing phones. It’s worth noting that if you do decide to use TCL’s AI features, many of them are handled locally on the Note A1, while more demanding ones are carried out over the cloud through a partnership with Microsoft Azure.</p><p>Although the Note A1 comes with Microsoft’s apps like Edge and Outlook pre-installed, you can download Google apps or pretty much any other app you like from the Play Store, unlike on reMarkable’s E-Ink tablets. </p><p>Just note that your mileage will vary from app to app. For instance, while I could download, log in, and use Reddit, I kept getting an error message that I was using an incorrect version of X when I tried to launch it. You can also sideload Android apps, but I wouldn’t recommend that unless you know what you’re doing and what you’ve downloaded for security reasons.</p><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="hPYzW9d2bwaDffrU6kAgyS" name="TCL Note A1-1289" alt="A person reading a digital comic on the TCL Note A1" src="https://cdn.mos.cms.futurecdn.net/hPYzW9d2bwaDffrU6kAgyS-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I tried reading a few graphic novels uploaded as PDF files right from the Note A1’s home screen, and while it worked, I just couldn’t get it to save my place. Then, after downloading and installing CDisplayEx, I was able to read Resident Alien and other digital comics with ease. In fact, they looked great on the Note A1’s 11.5-inch, 3:2 screen.</p><p>I’m sure there’s even more I can do with TCL’s latest tablet. However, after three weeks of taking notes, reading ebooks and graphic novels, checking my Gmail and Slack messages, and reading the news, I’m very impressed with the Note A1 and its simpler, more streamlined Android skin.</p><h2 id="a-tablet-worth-keeping-handy">A tablet worth keeping handy</h2><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="ogJVPygZ7dMKxzYnzQVvuV" name="TCL Note A1-1291" alt="A person holding up the TCL Note A1 tablet in the air" src="https://cdn.mos.cms.futurecdn.net/ogJVPygZ7dMKxzYnzQVvuV-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As I normally do when testing out a new tablet, I kept it right at the ready on my desk. Surprisingly, though, while I’d be constantly recharging other tablets, the Note A1’s battery life continued to wow me during the time I spent using it as my daily driver.</p><p>Over the course of three weeks, it never ran out of battery and flat-out died. In fact, after leaving it untouched for a few days, the lowest I saw its battery get was 30%. </p><p>Even now, as I’m writing this late on Friday, after charging it on Tuesday before heading out to take pics, it’s still at 70% battery life. In addition to its extra-large 8,000 mAh battery, I think a big part of its lengthy battery life comes down to how the Note A1 enters Standby Mode when not in use for extended periods.</p><p>Now, would I recommend this tablet for watching YouTube videos and playing games? Absolutely not, as one of the <a href="https://www.tomsguide.com/best-picks/best-cheap-tablets">best cheap tablets</a> would be better for the former, while a more powerful device like the <a href="https://www.tomsguide.com/computing/tablets/redmagic-astra-2-review">RedMagic Astra 2</a> would be a better fit for the latter. You can certainly watch videos on the Note A1, but your fingers need to be quick on the draw to pull down its Quick Settings menu since you don’t have physical volume controls after all.</p><p>Instead, I think this tablet is a great fit for those who want something simpler that’s easy on the eyes while also being incredibly thin and light — without the premium price you’d pay for an <a href="https://www.tomsguide.com/computing/ipads/apple-ipad-air-m4-review-small-tweaks-to-the-gold-standard">iPad Air</a>. The Note A1 is exactly what its name implies: a handy device that comes with a stylus in the box for taking notes, brainstorming, and jotting down ideas.</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/tablets/i-tried-the-tcl-nxtpaper-11-plus-and-this-budget-tablet-is-easily-my-ipad-killer-heres-why">I tried the TCL NXTPAPER 11 Plus and this budget tablet is easily my iPad killer</a></li><li><a href="https://www.tomsguide.com/opinion/i-use-these-3-tricks-with-all-my-tablets-so-they-dont-just-feel-like-a-bigger-phone">I use these 3 tricks with all my tablets so they don’t just feel like a bigger phone</a></li><li><a href="https://www.tomsguide.com/gaming/i-built-the-ultimate-remote-play-setup-with-wi-fi-7-to-say-goodbye-to-stuttery-gameplay-for-good-heres-how">I got tired of having a bad remote play experience so I used Wi-Fi 7 and this powerful gaming tablet to fix it for good</a></li></ul><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=tablets&brands=TCL&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="8">8 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const finalHref = cardLink.href || cardLink.getAttribute('href') || '';                let actualRevenueId = cardLink.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = this.getRowsLimit();          } else {             this.displayLimit += this.getRowsLimit();          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: this.decodeHTML(item.name || item.title || item.model_name || item.product_name || 'Unknown Product'),            brand: this.decodeHTML(item.brand || ''),            productName: this.decodeHTML(item.model_name || item.product_name || item.name || ''),            merchant: this.decodeHTML(item.merchant_name || item.merchant || item.retailer || 'Retailer'),            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const finalHref = btn.href || btn.getAttribute('href') || '';                let actualRevenueId = btn.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += this.getRowsLimit();                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');               document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=tablets&brands=TCL&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="8">8 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const finalHref = cardLink.href || cardLink.getAttribute('href') || '';                let actualRevenueId = cardLink.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = this.getRowsLimit();          } else {             this.displayLimit += this.getRowsLimit();          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: this.decodeHTML(item.name || item.title || item.model_name || item.product_name || 'Unknown Product'),            brand: this.decodeHTML(item.brand || ''),            productName: this.decodeHTML(item.model_name || item.product_name || item.name || ''),            merchant: this.decodeHTML(item.merchant_name || item.merchant || item.retailer || 'Retailer'),            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const finalHref = btn.href || btn.getAttribute('href') || '';                let actualRevenueId = btn.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += this.getRowsLimit();                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');               document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/tablets/i-finally-found-a-tablet-with-a-paper-like-display-thats-perfect-for-productivity-without-the-distractions</link>
                                                                            <description>
                            <![CDATA[ The TCL Note A1 brings the company’s NXTPAPER display tech to a new, more productivity-focused form factor that’s incredibly thin with impressive battery life. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">tPpsTtBp9KSpGotG52sGAg</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/HRM227jsYEYSAagVPfrNh4-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 04 Oct 2026 11:00:00 +0000</pubDate>                                                                                                                                <updated>Sun, 04 Oct 2026 11:17:01 +0000</updated>
                                                                                                                                            <category><![CDATA[Tablets]]></category>
                                                    <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[E-Readers]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                                                                <author><![CDATA[ anthony.spadafora@futurenet.com (Anthony Spadafora) ]]></author>                    <dc:creator><![CDATA[ Anthony Spadafora ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/z73LEoj7FkUjNG85GcWHtH-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Anthony Spadafora is the managing editor for security and home office furniture at Tom’s Guide where he covers everything from data breaches and malware to password managers and the best way to cover your whole home or business with a strong Wi-Fi signal.&lt;/p&gt;&lt;p&gt;Before joining the team, he spent three years covering cybersecurity and B2B tech for ITProPortal while living in South Korea. After moving back to the US. Anthony joined the TechRadar Pro team where he covered these topics along with VPNs, web hosting, online collaboration software and video conferencing for four years. Anthony also has his ears to the ground and is on the lookout for the next major cyberattack or data breach.&lt;/p&gt;&lt;p&gt;Based in Houston, Texas, Anthony also handles VPN testing for both Tom’s Guide and TechRadar. As someone who has worked from home exclusively since 2018, he has reviewed dozens of standing desks as well as office chairs and has taken a closer look at other essential remote working accessories. As part of these reviews, Anthony frequently builds intricate desk setups which is why he’s such a big advocate for cable management and keeping things organized. When he’s not writing, he can be found tinkering with PCs and game consoles, managing cables and making upgrades to his smart home.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/HRM227jsYEYSAagVPfrNh4-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A person using a stylus to select a content template on the TCL Note A1 tablet]]></media:description>                                                            <media:text><![CDATA[A person using a stylus to select a content template on the TCL Note A1 tablet]]></media:text>
                                <media:title type="plain"><![CDATA[A person using a stylus to select a content template on the TCL Note A1 tablet]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/HRM227jsYEYSAagVPfrNh4-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>When my phone’s screen isn’t large enough for the task at hand, I often reach for a tablet instead. However, unless you charge yours religiously every night, picking one up usually means finding a dead battery and a digital paperweight.</p><p>Over the years, I’ve tested many of the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a> — from a <a href="https://www.tomsguide.com/computing/tablets/i-thought-the-ipad-mini-was-the-perfect-small-tablet-until-i-tried-the-lenovo-legion-tab-3-heres-why">compact, gaming-focused slate</a> to a <a href="https://www.tomsguide.com/computing/android-tablets/i-thought-smaller-was-better-until-i-tried-a-massive-14-inch-tablet-that-feels-like-a-clipboard">massive 14-inch one</a> that felt more like a clipboard than something you could easily slide into a bag. Yet of all the devices I’ve used, only one ever solved the constant battery-drain dilemma.</p><p>With its magnetic charging dock, I really felt like Google's <a href="https://www.tomsguide.com/opinion/i-swapped-the-smart-display-under-my-monitor-with-the-pixel-tablet-for-a-week-heres-what-happened">Pixel Tablet</a> set a new standard that other companies would follow. Boy, was I wrong. Not only did Google recently discontinue the Pixel Tablet, but I've yet to see another manufacturer attempt a similar always-charged dock setup.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="high" data-lazy-src="https://www.youtube-nocookie.com/embed/qwVYmV1o7oI" allowfullscreen></iframe></div></div><p>If you can’t keep a device permanently docked, the next best solution is a low-power, simplified approach that simply refuses to die. After testing out TCL's full-featured NXTPAPER tablets, I recently got my hands on the new TCL Note A1. Unlike those general-purpose slates, this one is built entirely around reading, writing, and taking notes with its included T-Pen Pro stylus.</p><p>After using the Note A1 for the past three weeks, it’s become the only tablet I reach for at my desk — and the one I slip into my backpack whenever I leave the house. If you’ve had your eyes on a productivity-focused slate from reMarkable, Boox, or even Amazon’s Kindle Scribe, here’s why the TCL Note A1 deserves a spot on your shortlist.</p><div class="product"><a data-dimension112="eaec54b2-bee2-11f1-af98-2917d8add4c5" data-action="Deal Block" data-label="Note A1" data-dimension48="Note A1" data-dimension25="$499" href="https://www.amazon.com/TCL-Note-A1-NXTPAPER-Display/dp/B0H5K8NBZS?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:71.80%;"><img id="WkbivRavguyL6xfnw9wxNE" name="Note A1" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/WkbivRavguyL6xfnw9wxNE-1920-80.jpg" mos="" align="middle" fullscreen="" width="1500" height="1077" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/TCL-Note-A1-NXTPAPER-Display/dp/B0H5K8NBZS?th=1" target="_blank" rel="nofollow" data-dimension112="eaec54b2-bee2-11f1-af98-2917d8add4c5" data-action="Deal Block" data-label="Note A1" data-dimension48="Note A1" data-dimension25="$499">Note A1: was $599 now $499</a></strong><br>This ultra-slim 5.5mm Android slate features an 11.5-inch 120Hz NXTPAPER display, an 8,000 mAh battery, and an included T-Pen Pro stylus. Designed for distraction-free reading, writing, and digital note-taking, it combines the eye-comfort feel of paper with full Android productivity. <a class="view-deal button" href="https://www.amazon.com/TCL-Note-A1-NXTPAPER-Display/dp/B0H5K8NBZS?th=1" target="_blank" rel="nofollow" data-dimension112="eaec54b2-bee2-11f1-af98-2917d8add4c5" data-action="Deal Block" data-label="Note A1" data-dimension48="Note A1" data-dimension25="$499">View Deal</a></p></div><h2 id="a-display-first-approach">A display-first approach</h2><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="yZk5phidxSGXMoerAs2UX8" name="TCL Note A1-1295" alt="A person setting up fingerprint unlock on the TCL Note A1 tablet" src="https://cdn.mos.cms.futurecdn.net/yZk5phidxSGXMoerAs2UX8-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Note A1 that TCL sent over for me to check out arrived in a single box split in two. While the larger half held the tablet itself along with a stylus, some extra pen tips, and a charging cable, the smaller half held a magnetic flip cover.</p><p>Right from the start, I knew I was dealing with a very different type of tablet thanks to the quote printed on the inside of its box: “Knowledge grows by piling up facts, wisdom shines through simplicity.” I couldn’t sum up the design philosophy behind the Note A1 better myself.</p><p>At 10.24 x 7.74 x 0.22 inches, this 11.5-inch tablet gives you plenty of screen space to work with in an incredibly slim package. Meanwhile, at 500 grams or just over a pound, the Note A1 is designed to be easy to carry and take with you anywhere — because you never know when inspiration will strike.</p><p>Instead of going with thin bezels all the way around, the one on the left side of the device is a bit larger at roughly three-quarters of an inch wide, just like on the original <a href="https://www.tomsguide.com/tablets/e-readers/kindle-scribe-2024-review">Kindle Scribe</a>. The larger size makes the device easier to hold in your left hand while you write, but that extra space is also used to house a home button with a built-in fingerprint scanner. </p><p>This is a bit different from the rest of TCL’s NXTPAPER tablets that lack a fingerprint scanner, but I found it to be a welcome addition — just like the one integrated into the power button on my <a href="https://www.tomsguide.com/phones/i-spent-a-month-with-this-usd330-smartphone-with-a-paper-like-display-and-it-completely-changed-my-mind-on-budget-phones">NXTPAPER 70 Pro phone</a>.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.29%;"><img id="knXVnkRmboLQ9HbmrBz2YB" name="TCL Note A1-1294" alt="A close-up shot of the USB-C port on the side of the TCL Note A1 tablet" src="https://cdn.mos.cms.futurecdn.net/knXVnkRmboLQ9HbmrBz2YB-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1441" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>When you look around the sides of the Note A1, you won’t find much. There’s a power button on the top left, and then on the bottom right, there’s a USB-C port for charging. Given it wasn’t designed as a media consumption device like a lot of other tablets, there isn’t a physical volume rocker.</p><p>If you’re wondering why the USB-C port isn’t centered, I suspect this probably has to do with TCL’s optional keyboard case. When attached, you can plug a charging cable in cleanly on the bottom right without having it hanging awkwardly from the middle of the device. It’s a small but well-thought-out touch.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.29%;"><img id="wnYi3s4nCZ5V6GbzQfPaaE" name="TCL Note A1-1293" alt="The back of the TCL Note A1 tablet showing off its magnets, pogo pins and rear camera" src="https://cdn.mos.cms.futurecdn.net/wnYi3s4nCZ5V6GbzQfPaaE-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1441" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Around back, the Note A1 has small, circular magnets wrapped in soft-touch plastic on three of its corners along with a 13 MP rear camera and a trio of pogo pins for connecting the keyboard case. The tablet’s case is made from aerospace-grade aluminum, and in addition to letting you quickly snap on a cover, these round magnets prevent the back of the device from getting scratched.</p><p>TCL definitely went with a less-is-more approach with some parts of the Note A1, but the company didn’t skimp on its specs either. Powered by an older but very efficient MediaTek Helio G100 processor, the tablet ships with 8GB of RAM and 256GB of storage. </p><p>Despite being less than a quarter inch thick, the Note A1 still packs an 8,000 mAh battery with 33W fast charging. The display is the star of the show, though, and instead of an E-Ink screen, it’s equipped with an 11.5-inch NXTPAPER Pure display with a 3:2 aspect ratio and my personal favorite, matte anti-glare glass.</p><p>After adding my fingerprint and going through the rest of the setup process, it was time to see what the Note A1 was capable of.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-O6yaVW"></div>                            </div>                            <script src="https://kwizly.com/embed/O6yaVW.js" async></script><h2 id="not-your-typical-tablet">Not your typical tablet</h2><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="QEsqGyDR4vmDoP5GsvJXPH" name="TCL Note A1-1292" alt="A person reading a book on the TCL Note A1 tablet" src="https://cdn.mos.cms.futurecdn.net/QEsqGyDR4vmDoP5GsvJXPH-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Instead of completely reinventing the wheel, TCL took many of the best aspects of its NXTPAPER tablets and incorporated them into the Note A1. </p><p>While you can’t switch between modes and instantly go from full color to black and white like with other NXTPAPER devices, you still get that matte, paper-like quality from the tablet, which makes reading ebooks and documents a very satisfying experience that’s also easy on the eyes.</p><p>The Note A1 isn’t entirely black and white, either. There are hints of color throughout its UI, and you can look at photos or watch YouTube videos like you would on any other tablet. Speaking of the display, it's flicker-free and buttery smooth thanks to its 120Hz refresh rate. You won’t see any of the typical lag you do on an E-Ink screen here.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ENVpWtmTX6oQNeCBotAXFM" name="TCL Note A1-main-menu-settings" alt="A pair of screenshots showing off the TCL Note A1 tablet's home screen and settings menu" src="https://cdn.mos.cms.futurecdn.net/ENVpWtmTX6oQNeCBotAXFM-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Besides its lack of volume buttons, the one thing that made me instantly realize the Note A1 isn’t just your typical tablet occurred the instant I turned it on for the first time. Instead of going to your standard Android home screen, the device’s main page is actually for notes. You can view all of your existing notes and documents or create new ones with a tap on the plus icon.</p><p>The Note A1 is powered by Android, and once you dive into the settings menu, this is immediately apparent. However, the Android version wasn’t listed there, and tapping on the build number didn’t unlock developer options like it does on other Android devices.</p><p>It did take me a bit to get used to, but now that I’ve become accustomed to the Note A1’s Android skin, I actually wouldn’t mind seeing it on one of TCL’s next Android phones. At a time when people are installing custom launchers to fight doom-scrolling, the company did an excellent job of equipping this tablet with a distraction-free UI.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="v9dtCqY2TtU9LwTWqbV2UQ" name="TCL Note A1-ai-apps" alt="A pair of screenshots showing off the TCL Note A1 tablet's AI features and app drawer" src="https://cdn.mos.cms.futurecdn.net/v9dtCqY2TtU9LwTWqbV2UQ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Just like with its other recent tablets and phones, you also get access to all of TCL’s AI tools for transcription, translation, and more, but you can turn them off if you want. One AI feature I particularly liked is Inspiration Circle. When you long-press the button on the T-Pen Pro stylus, you can then circle a note or file to add it to a dedicated Inspiration Space.</p><p>In practice, this works a lot like the Essential Key and Essential Space on newer Nothing phones. It’s worth noting that if you do decide to use TCL’s AI features, many of them are handled locally on the Note A1, while more demanding ones are carried out over the cloud through a partnership with Microsoft Azure.</p><p>Although the Note A1 comes with Microsoft’s apps like Edge and Outlook pre-installed, you can download Google apps or pretty much any other app you like from the Play Store, unlike on reMarkable’s E-Ink tablets. </p><p>Just note that your mileage will vary from app to app. For instance, while I could download, log in, and use Reddit, I kept getting an error message that I was using an incorrect version of X when I tried to launch it. You can also sideload Android apps, but I wouldn’t recommend that unless you know what you’re doing and what you’ve downloaded for security reasons.</p><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="hPYzW9d2bwaDffrU6kAgyS" name="TCL Note A1-1289" alt="A person reading a digital comic on the TCL Note A1" src="https://cdn.mos.cms.futurecdn.net/hPYzW9d2bwaDffrU6kAgyS-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I tried reading a few graphic novels uploaded as PDF files right from the Note A1’s home screen, and while it worked, I just couldn’t get it to save my place. Then, after downloading and installing CDisplayEx, I was able to read Resident Alien and other digital comics with ease. In fact, they looked great on the Note A1’s 11.5-inch, 3:2 screen.</p><p>I’m sure there’s even more I can do with TCL’s latest tablet. However, after three weeks of taking notes, reading ebooks and graphic novels, checking my Gmail and Slack messages, and reading the news, I’m very impressed with the Note A1 and its simpler, more streamlined Android skin.</p><h2 id="a-tablet-worth-keeping-handy">A tablet worth keeping handy</h2><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="ogJVPygZ7dMKxzYnzQVvuV" name="TCL Note A1-1291" alt="A person holding up the TCL Note A1 tablet in the air" src="https://cdn.mos.cms.futurecdn.net/ogJVPygZ7dMKxzYnzQVvuV-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As I normally do when testing out a new tablet, I kept it right at the ready on my desk. Surprisingly, though, while I’d be constantly recharging other tablets, the Note A1’s battery life continued to wow me during the time I spent using it as my daily driver.</p><p>Over the course of three weeks, it never ran out of battery and flat-out died. In fact, after leaving it untouched for a few days, the lowest I saw its battery get was 30%. </p><p>Even now, as I’m writing this late on Friday, after charging it on Tuesday before heading out to take pics, it’s still at 70% battery life. In addition to its extra-large 8,000 mAh battery, I think a big part of its lengthy battery life comes down to how the Note A1 enters Standby Mode when not in use for extended periods.</p><p>Now, would I recommend this tablet for watching YouTube videos and playing games? Absolutely not, as one of the <a href="https://www.tomsguide.com/best-picks/best-cheap-tablets">best cheap tablets</a> would be better for the former, while a more powerful device like the <a href="https://www.tomsguide.com/computing/tablets/redmagic-astra-2-review">RedMagic Astra 2</a> would be a better fit for the latter. You can certainly watch videos on the Note A1, but your fingers need to be quick on the draw to pull down its Quick Settings menu since you don’t have physical volume controls after all.</p><p>Instead, I think this tablet is a great fit for those who want something simpler that’s easy on the eyes while also being incredibly thin and light — without the premium price you’d pay for an <a href="https://www.tomsguide.com/computing/ipads/apple-ipad-air-m4-review-small-tweaks-to-the-gold-standard">iPad Air</a>. The Note A1 is exactly what its name implies: a handy device that comes with a stylus in the box for taking notes, brainstorming, and jotting down ideas.</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/tablets/i-tried-the-tcl-nxtpaper-11-plus-and-this-budget-tablet-is-easily-my-ipad-killer-heres-why">I tried the TCL NXTPAPER 11 Plus and this budget tablet is easily my iPad killer</a></li><li><a href="https://www.tomsguide.com/opinion/i-use-these-3-tricks-with-all-my-tablets-so-they-dont-just-feel-like-a-bigger-phone">I use these 3 tricks with all my tablets so they don’t just feel like a bigger phone</a></li><li><a href="https://www.tomsguide.com/gaming/i-built-the-ultimate-remote-play-setup-with-wi-fi-7-to-say-goodbye-to-stuttery-gameplay-for-good-heres-how">I got tired of having a bad remote play experience so I used Wi-Fi 7 and this powerful gaming tablet to fix it for good</a></li></ul><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=tablets&brands=TCL&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="8">8 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const finalHref = cardLink.href || cardLink.getAttribute('href') || '';                let actualRevenueId = cardLink.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = this.getRowsLimit();          } else {             this.displayLimit += this.getRowsLimit();          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: this.decodeHTML(item.name || item.title || item.model_name || item.product_name || 'Unknown Product'),            brand: this.decodeHTML(item.brand || ''),            productName: this.decodeHTML(item.model_name || item.product_name || item.name || ''),            merchant: this.decodeHTML(item.merchant_name || item.merchant || item.retailer || 'Retailer'),            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const finalHref = btn.href || btn.getAttribute('href') || '';                let actualRevenueId = btn.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += this.getRowsLimit();                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');               document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=tablets&brands=TCL&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="8">8 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const finalHref = cardLink.href || cardLink.getAttribute('href') || '';                let actualRevenueId = cardLink.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = this.getRowsLimit();          } else {             this.displayLimit += this.getRowsLimit();          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: this.decodeHTML(item.name || item.title || item.model_name || item.product_name || 'Unknown Product'),            brand: this.decodeHTML(item.brand || ''),            productName: this.decodeHTML(item.model_name || item.product_name || item.name || ''),            merchant: this.decodeHTML(item.merchant_name || item.merchant || item.retailer || 'Retailer'),            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const finalHref = btn.href || btn.getAttribute('href') || '';                let actualRevenueId = btn.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += this.getRowsLimit();                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');               document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tested the Samsung Galaxy Tab S12 Ultra for a week — and it’s the best Android tablet yet ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Samsung Galaxy Tab S12 Ultra ($1,399) is here for those who want a super-sized Android tablet. This year’s model is admittedly a nominal upgrade from the <a href="https://www.tomsguide.com/computing/android-tablets/samsung-galaxy-tab-s11-ultra-review">Galaxy Tab S11 Ultra</a> I reviewed last year, but on its own, it’s a great premium slate for folks in the Android and Samsung ecosystems.</p><p>As before, this tablet features an enormous 14.6-inch display that’s as perfect for watching your favorite streaming shows as it is for juggling multiple apps. The thin, lightweight, and sturdy design makes it an unobtrusive travel partner, while the MediaTek Dimensity 9500 chip inside provides the slate with enough power to run your apps and games. You also get nearly 12 hours of battery life to get you through most of the day.</p><p>While the Galaxy Tab S12 Ultra has many of the things I liked about the previous model, it also shares some of that tablet’s shortcomings. The tablet can still be too cumbersome to hold comfortably for long periods, and <a href="https://www.tomsguide.com/computing/android-tablets/i-ditched-my-laptop-for-the-samsung-galaxy-tab-s11-ultra-heres-what-happened">DeX Mode</a> still isn’t the Windows 11 equivalent you’d expect. To truly use the Tab S12 Ultra for work, you’ll need the $399 Galaxy Tab S11 Ultra Pro Keyboard—which is in addition to the slate’s already higher $200 price hike.</p><p>Despite its shortcomings, there’s no denying the Samsung Galaxy Tab S12 Ultra delivers on screen size and an ultraportable design. Right now, it’s one of the <a href="https://www.tomsguide.com/best-picks/best-android-tablets">best Android tablets</a> around — even if it isn’t the laptop replacement you might expect. Find out more in my full review!</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s12-ultra-review-cheat-sheet"><span>Samsung Galaxy Tab S12 Ultra review: Cheat sheet</span></h3><ul><li><strong>What is it?</strong> The Samsung Galaxy Tab S12 Ultra is the latest version of the company’s flagship, oversized tablet.</li><li><strong>Who is it for?</strong> For anyone who wants a large OLED tablet that can also serve as a laptop replacement.</li><li><strong>What does it cost?</strong> The Samsung Galaxy Tab S12 Ultra starts at $1,399 / AU$2,299.</li><li><strong>What do we like?</strong> We like the sharp and vivid OLED panel, elegant lightweight design, strong Android tablet performance, and long-lasting battery life.</li><li><strong>What don’t we like?</strong> We don’t like the $200 price bump from last year’s model, and that DeX Mode requires an external monitor for full functionality.</li></ul><h3 class="article-body__section" id="section-samsung-galaxy-tab-s12-ultra-review-specs"><span>Samsung Galaxy Tab S12 Ultra review: Specs</span></h3><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Samsung Galaxy Tab S12 Ultra</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$1,399 / AU$2,299</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>14.6-inch AMOLED (2960 x 1848) </p></td></tr><tr><td class="firstcol " ><p><strong>Chip</strong></p></td><td  ><p>MediaTek Dimensity 9500</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>12GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>256GB</p></td></tr><tr><td class="firstcol " ><p><strong>Cameras</strong></p></td><td  ><p>12MP FF + Ultrawide (front), 13MP AF + 8MP UW (rear)</p></td></tr><tr><td class="firstcol " ><p><strong>Wireless</strong></p></td><td  ><p>Wi-Fi 7, Bluetooth 5.4 </p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>12.8 x 8.2 x 0.2 inches / 326.3mm x 208.5mm x 5.1mm </p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>1.6 pounds / 695 grams</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-samsung-galaxy-tab-s12-ultra-review-the-ups"><span>Samsung Galaxy Tab S12 Ultra review: The ups</span></h3><p>The Samsung Galaxy Tab S12 Ultra has one of the best OLED displays among tablets, along with strong performance, long battery life, and a sleek, thin design.</p><h2 id="thin-and-light-design">Thin and light 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="CuMifhmgQxTrcFyve4WUSd" name="Samsung Galaxy Tab S12 Ultra-7" alt="Samsung Galaxy Tab S12 Ultra" src="https://cdn.mos.cms.futurecdn.net/CuMifhmgQxTrcFyve4WUSd-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There’s not much to say design-wise, as the Tab S12 Ultra is virtually identical to its predecessors. As before, this Android tablet measures 12.8 x 8.2 x 0.2 inches (326.3mm x 208.5mm x 5.1mm) and weighs 1.6 pounds (695 grams). Though holding this enormous tablet isn’t always comfortable, the thin, lightweight design makes it easy to travel with.</p><p>When you hold the Tab S12 Ultra horizontally, the power and volume buttons are on the top left-hand side. On the right-hand side, you’ll find a microSD card slot and a single USB-C port for charging. Before you ask, no, there is no headphone jack.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qPmAdJbXjXwKc6bezLcqEQ" name="Samsung Galaxy Tab S12 Ultra-8" alt="Samsung Galaxy Tab S12 Ultra" src="https://cdn.mos.cms.futurecdn.net/qPmAdJbXjXwKc6bezLcqEQ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Design-wise, Samsung isn’t looking to reinvent the wheel. Some folks might have wanted a fresh look, but I’m fine with this tried-and-true design. The Tab S12 Ultra is as thin and light as ever, and that’s what matters here.</p><h2 id="vibrant-oled">Vibrant OLED</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="veiVMHga9Zd599FSGxErrh" name="Samsung Galaxy Tab S12 Ultra-6" alt="Samsung Galaxy Tab S12 Ultra" src="https://cdn.mos.cms.futurecdn.net/veiVMHga9Zd599FSGxErrh-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Another carryover from previous models is the large 14.6-inch OLED panel, which remains as impressive as ever. The OLED delivers excellent contrast between dark and light elements, while the sharp 2960 x 1848 resolution helps you see every detail in whatever you’re watching. </p><p>That was my experience watching a nature video on YouTube, where the animals and locales looked lifelike thanks to the OLED panel’s strong detail and contrast. Trust me, your eyes won’t be disappointed when viewing videos on this tablet.</p><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Samsung Galaxy Tab S12 Ultra</strong></p></th><th  ><p><strong>iPad Pro M5</strong></p></th><th  ><p><strong>OnePlus Pad 3</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Nits (brightness)</strong></p></td><td  ><p>862 (SDR) | 916 (HDR)</p></td><td  ><p>561 (SDR) | 965 (HDR) </p></td><td  ><p>530 (SDR) </p></td></tr><tr><td class="firstcol " ><p><strong>sRGB</strong></p></td><td  ><p>149.8%</p></td><td  ><p>116% </p></td><td  ><p>111.4%</p></td></tr><tr><td class="firstcol " ><p><strong>DCI-P3</strong></p></td><td  ><p>105.5%</p></td><td  ><p>82.1% </p></td><td  ><p>78.9%</p></td></tr><tr><td class="firstcol " ><p><strong>Delta-E</strong></p></td><td  ><p>0.22</p></td><td  ><p>0.27 </p></td><td  ><p>0.23</p></td></tr></tbody></table></div><p>How did the Tab S12 Ultra fare in our lab tests? Color reproduction (sRGB and DCI-P3) is generally oversaturated, as both go past the 100% target, which makes for more vivid colors. Color accuracy (Delta-E) is also great. And as before, this tablet also gets plenty bright when displaying HDR content, nearly hitting 1,000 nits across the entire screen.</p><p>The Tab S12 Ultra does well against competitors like the <a href="https://www.tomsguide.com/computing/ipads/ipad-pro-m5-review">iPad Pro M5</a> and <a href="https://www.tomsguide.com/computing/android-tablets/oneplus-pad-3">OnePlus Pad 3</a>. Samsung’s slate delivers brighter SDR than both, though the iPad Pro gets a tad brighter with HDR content. Color-wise, the iPad Pro and OnePlus Pad 3 aren’t as vivid, though their values deliver more naturalistic hues than the Tab S12.</p><h2 id="strong-performance-2">Strong 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="YHb7i2SCuxbWHULRtcWkL4" name="Samsung Galaxy Tab S12 Ultra-5" alt="Samsung Galaxy Tab S12 Ultra" src="https://cdn.mos.cms.futurecdn.net/YHb7i2SCuxbWHULRtcWkL4-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The new Galaxy Tab S12 Ultra upgrades the prior model’s MediaTek Dimensity 9400+ processor to the MediaTek Dimensity 9500 chip, while RAM remains the same at 12GB regardless of how much storage you choose. Although there isn’t a massive performance boost from gen to gen, you’re still getting a slate that offers solid performance.</p><p>Though I wouldn’t replace my laptop with this tablet, I could still get work done on it without too much trouble. It can handle my typical workflow, which includes multiple open Chrome tabs and the occasional YouTube video. Android also feels snappy, and I rarely (if ever) have apps take too long to load. Navigating the tablet’s settings is also seamless.</p><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Samsung Galaxy Tab S12 Ultra</strong></p></th><th  ><p><strong>iPad Pro M5</strong></p></th><th  ><p><strong>OnePlus Pad 3</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Chipset</strong></p></td><td  ><p>MediaTek Dimensity 9500</p></td><td  ><p>Apple M5</p></td><td  ><p>Snapdragon 8 Elite </p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6 score (single-core / multi-core) </strong></p></td><td  ><p>3229 / 9763</p></td><td  ><p>4,155 / 16,517 </p></td><td  ><p>2,980 / 8,993 </p></td></tr><tr><td class="firstcol " ><p><strong>3DMark Wild Life Extreme Unlimited (score / fps)</strong></p></td><td  ><p>6608 / 39.7 fps</p></td><td  ><p>9,934 / 59 fps </p></td><td  ><p>6,410 / 38.38</p></td></tr></tbody></table></div><p>As you can see in the table above, the new Tab S12 Ultra has slightly better single- and multi-core performance than last year’s model. That’s commendable, but it’s still not comparable to the powerful iPad Pro M5, which remains the fastest tablet out there.</p><p>Again, the Tab S12 Ultra isn’t a slouch when it comes to performance, but Apple’s premium slate still outclasses it. However, if you’re just using this tablet to play Android games, run some work-related apps, or watch YouTube, that performance gap won’t matter much.</p><h2 id="solid-battery-life">Solid 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="SdpeLpkJHhrEUv8Hrs9wS8" name="Samsung Galaxy Tab S12 Ultra-4" alt="Samsung Galaxy Tab S12 Ultra" src="https://cdn.mos.cms.futurecdn.net/SdpeLpkJHhrEUv8Hrs9wS8-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>To be upfront, the Galaxy Tab S12 Ultra doesn’t last as long as last year’s model. So why is battery life still in “The ups” section? Because even though this tablet’s endurance is lower, it’ll still last you for the better part of a workday and then some.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Time (hours:mins)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Samsung Galaxy Tab S12 Ultra</strong></p></td><td  ><p>11:31</p></td></tr><tr><td class="firstcol " ><p><strong>iPad Pro M5</strong></p></td><td  ><p>13:16</p></td></tr><tr><td class="firstcol " ><p><strong>OnePlus Pad 3</strong></p></td><td  ><p>16:21</p></td></tr></tbody></table></div><p>In our battery life test, which involves continuous web surfing over Wi-Fi with the display set to 150 nits of brightness, the Galaxy Tab S12 Ultra lasted 11 hours and 31 minutes. In contrast, its predecessor lasted over 30 minutes longer.</p><p>Though you don’t want battery life to decline in a newer model, it’s not a steep drop-off. That said, the iPad Pro M5 and especially the OnePlus Pad 3 outpace the Tab S12 Ultra by a wide margin. Leaving the included charger at home won’t be an emergency, but it’s better to take it with you just in case.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s12-ultra-review-the-downs"><span>Samsung Galaxy Tab S12 Ultra review: The downs</span></h3><p>The Samsung Galaxy Tab S12 Ultra  is an impressive and massive Android tablet but it's not without its downsides which include DeX Mode limitations and a higher price than last year's model.</p><h2 id="dex-mode-still-isn-t-great">DeX Mode still isn’t great</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wpfa6TAsVmJYEjHGgTSnmC" name="Samsung Galaxy Tab S12 Ultra-2" alt="Samsung Galaxy Tab S12 Ultra" src="https://cdn.mos.cms.futurecdn.net/wpfa6TAsVmJYEjHGgTSnmC-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>DeX Mode, which provides Samsung devices with desktop-like functionality, remains largely unchanged from the previous version. While it certainly makes the UI feel more like Windows, it still has some of the shortcomings from before.</p><p>To make the most of DeX Mode, you’ll need to connect the Tab S12 Ultra to an external monitor. Doing this brings up a Windows-like taskbar on the connected monitor, while the tablet gets a less functional taskbar. Sure, this mostly works as advertised, but I still liked it better when DeX Mode functioned on its own without the need for peripherals.</p><h2 id="200-price-bump">$200 price bump</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cFSEXah665SbEbew6SKKZH" name="Samsung Galaxy Tab S12 Ultra-9" alt="Samsung Galaxy Tab S12 Ultra" src="https://cdn.mos.cms.futurecdn.net/cFSEXah665SbEbew6SKKZH-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>To be clear, the Tab S Ultra series has always been Samsung’s most expensive tablet line. Even so, the $200 price increase over last year’s model could make some reconsider their decision to buy this slate.</p><p>Why the price hike for nominal upgrades? As I’m sure you’ve already guessed, it’s likely due to the ongoing RAM crisis, which has driven up component costs. Not only does this probably account for the price hike, but it also explains why Samsung didn’t pack more RAM into this tablet than into last year’s model—doing so would’ve driven the price up even further.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s12-ultra-review-verdict"><span>Samsung Galaxy Tab S12 Ultra review: Verdict</span></h3><p>Even if the Galaxy Tab S12 Ultra can’t truly replace your laptop and is now $200 more than last year’s model for nominal upgrades, it’s still an overall great Android tablet at what it does. Even if its performance isn’t equal to iPad Pro’s, the beautiful OLED panel certainly rivals that of Apple’s premium slate.</p><p>If you’re an Apple fan, then you’re better off with an iPad Pro or even an iPad Air. And if all you’re looking for is an Android tablet to stream content on, then the much more affordable $399 <a href="https://www.tomsguide.com/computing/tablets/lenovo-tab-plus-gen-2-review">Lenovo Tab Plus Gen 2</a> is a better bet. But if you’re a Samsung user and want an Android tablet with the largest canvas out there, you can't go wrong with the Galaxy Tab S12 Ultra.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/android-tablets/samsung-galaxy-tab-s12-ultra-review</link>
                                                                            <description>
                            <![CDATA[ The Samsung Galaxy Tab S12 Ultra impresses thanks to its 14.6-inch OLED panel and thin design. Though pricier, it's still ideal for folks seeking a huge tablet. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">JR8u8eJHuwBXy59pRj5XbR</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/exzGLfBdWjZwtpAShhuKBJ-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 30 Sep 2026 12:00:00 +0000</pubDate>                                                                                                                                <updated>Thu, 22 Oct 2026 05:25:02 +0000</updated>
                                                                                                                                            <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                <author><![CDATA[ tony.polanco@futurenet.com (Tony Polanco) ]]></author>                    <dc:creator><![CDATA[ Tony Polanco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/atzRNqFt5wYgEUPBDahWsD-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/exzGLfBdWjZwtpAShhuKBJ-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Tab S12 Ultra]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Tab S12 Ultra]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Tab S12 Ultra]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/exzGLfBdWjZwtpAShhuKBJ-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Samsung Galaxy Tab S12 Ultra ($1,399) is here for those who want a super-sized Android tablet. This year’s model is admittedly a nominal upgrade from the <a href="https://www.tomsguide.com/computing/android-tablets/samsung-galaxy-tab-s11-ultra-review">Galaxy Tab S11 Ultra</a> I reviewed last year, but on its own, it’s a great premium slate for folks in the Android and Samsung ecosystems.</p><p>As before, this tablet features an enormous 14.6-inch display that’s as perfect for watching your favorite streaming shows as it is for juggling multiple apps. The thin, lightweight, and sturdy design makes it an unobtrusive travel partner, while the MediaTek Dimensity 9500 chip inside provides the slate with enough power to run your apps and games. You also get nearly 12 hours of battery life to get you through most of the day.</p><p>While the Galaxy Tab S12 Ultra has many of the things I liked about the previous model, it also shares some of that tablet’s shortcomings. The tablet can still be too cumbersome to hold comfortably for long periods, and <a href="https://www.tomsguide.com/computing/android-tablets/i-ditched-my-laptop-for-the-samsung-galaxy-tab-s11-ultra-heres-what-happened">DeX Mode</a> still isn’t the Windows 11 equivalent you’d expect. To truly use the Tab S12 Ultra for work, you’ll need the $399 Galaxy Tab S11 Ultra Pro Keyboard—which is in addition to the slate’s already higher $200 price hike.</p><p>Despite its shortcomings, there’s no denying the Samsung Galaxy Tab S12 Ultra delivers on screen size and an ultraportable design. Right now, it’s one of the <a href="https://www.tomsguide.com/best-picks/best-android-tablets">best Android tablets</a> around — even if it isn’t the laptop replacement you might expect. Find out more in my full review!</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s12-ultra-review-cheat-sheet"><span>Samsung Galaxy Tab S12 Ultra review: Cheat sheet</span></h3><ul><li><strong>What is it?</strong> The Samsung Galaxy Tab S12 Ultra is the latest version of the company’s flagship, oversized tablet.</li><li><strong>Who is it for?</strong> For anyone who wants a large OLED tablet that can also serve as a laptop replacement.</li><li><strong>What does it cost?</strong> The Samsung Galaxy Tab S12 Ultra starts at $1,399 / AU$2,299.</li><li><strong>What do we like?</strong> We like the sharp and vivid OLED panel, elegant lightweight design, strong Android tablet performance, and long-lasting battery life.</li><li><strong>What don’t we like?</strong> We don’t like the $200 price bump from last year’s model, and that DeX Mode requires an external monitor for full functionality.</li></ul><h3 class="article-body__section" id="section-samsung-galaxy-tab-s12-ultra-review-specs"><span>Samsung Galaxy Tab S12 Ultra review: Specs</span></h3><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Samsung Galaxy Tab S12 Ultra</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$1,399 / AU$2,299</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>14.6-inch AMOLED (2960 x 1848) </p></td></tr><tr><td class="firstcol " ><p><strong>Chip</strong></p></td><td  ><p>MediaTek Dimensity 9500</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>12GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>256GB</p></td></tr><tr><td class="firstcol " ><p><strong>Cameras</strong></p></td><td  ><p>12MP FF + Ultrawide (front), 13MP AF + 8MP UW (rear)</p></td></tr><tr><td class="firstcol " ><p><strong>Wireless</strong></p></td><td  ><p>Wi-Fi 7, Bluetooth 5.4 </p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>12.8 x 8.2 x 0.2 inches / 326.3mm x 208.5mm x 5.1mm </p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>1.6 pounds / 695 grams</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-samsung-galaxy-tab-s12-ultra-review-the-ups"><span>Samsung Galaxy Tab S12 Ultra review: The ups</span></h3><p>The Samsung Galaxy Tab S12 Ultra has one of the best OLED displays among tablets, along with strong performance, long battery life, and a sleek, thin design.</p><h2 id="thin-and-light-design">Thin and light 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="CuMifhmgQxTrcFyve4WUSd" name="Samsung Galaxy Tab S12 Ultra-7" alt="Samsung Galaxy Tab S12 Ultra" src="https://cdn.mos.cms.futurecdn.net/CuMifhmgQxTrcFyve4WUSd-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There’s not much to say design-wise, as the Tab S12 Ultra is virtually identical to its predecessors. As before, this Android tablet measures 12.8 x 8.2 x 0.2 inches (326.3mm x 208.5mm x 5.1mm) and weighs 1.6 pounds (695 grams). Though holding this enormous tablet isn’t always comfortable, the thin, lightweight design makes it easy to travel with.</p><p>When you hold the Tab S12 Ultra horizontally, the power and volume buttons are on the top left-hand side. On the right-hand side, you’ll find a microSD card slot and a single USB-C port for charging. Before you ask, no, there is no headphone jack.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qPmAdJbXjXwKc6bezLcqEQ" name="Samsung Galaxy Tab S12 Ultra-8" alt="Samsung Galaxy Tab S12 Ultra" src="https://cdn.mos.cms.futurecdn.net/qPmAdJbXjXwKc6bezLcqEQ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Design-wise, Samsung isn’t looking to reinvent the wheel. Some folks might have wanted a fresh look, but I’m fine with this tried-and-true design. The Tab S12 Ultra is as thin and light as ever, and that’s what matters here.</p><h2 id="vibrant-oled">Vibrant OLED</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="veiVMHga9Zd599FSGxErrh" name="Samsung Galaxy Tab S12 Ultra-6" alt="Samsung Galaxy Tab S12 Ultra" src="https://cdn.mos.cms.futurecdn.net/veiVMHga9Zd599FSGxErrh-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Another carryover from previous models is the large 14.6-inch OLED panel, which remains as impressive as ever. The OLED delivers excellent contrast between dark and light elements, while the sharp 2960 x 1848 resolution helps you see every detail in whatever you’re watching. </p><p>That was my experience watching a nature video on YouTube, where the animals and locales looked lifelike thanks to the OLED panel’s strong detail and contrast. Trust me, your eyes won’t be disappointed when viewing videos on this tablet.</p><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Samsung Galaxy Tab S12 Ultra</strong></p></th><th  ><p><strong>iPad Pro M5</strong></p></th><th  ><p><strong>OnePlus Pad 3</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Nits (brightness)</strong></p></td><td  ><p>862 (SDR) | 916 (HDR)</p></td><td  ><p>561 (SDR) | 965 (HDR) </p></td><td  ><p>530 (SDR) </p></td></tr><tr><td class="firstcol " ><p><strong>sRGB</strong></p></td><td  ><p>149.8%</p></td><td  ><p>116% </p></td><td  ><p>111.4%</p></td></tr><tr><td class="firstcol " ><p><strong>DCI-P3</strong></p></td><td  ><p>105.5%</p></td><td  ><p>82.1% </p></td><td  ><p>78.9%</p></td></tr><tr><td class="firstcol " ><p><strong>Delta-E</strong></p></td><td  ><p>0.22</p></td><td  ><p>0.27 </p></td><td  ><p>0.23</p></td></tr></tbody></table></div><p>How did the Tab S12 Ultra fare in our lab tests? Color reproduction (sRGB and DCI-P3) is generally oversaturated, as both go past the 100% target, which makes for more vivid colors. Color accuracy (Delta-E) is also great. And as before, this tablet also gets plenty bright when displaying HDR content, nearly hitting 1,000 nits across the entire screen.</p><p>The Tab S12 Ultra does well against competitors like the <a href="https://www.tomsguide.com/computing/ipads/ipad-pro-m5-review">iPad Pro M5</a> and <a href="https://www.tomsguide.com/computing/android-tablets/oneplus-pad-3">OnePlus Pad 3</a>. Samsung’s slate delivers brighter SDR than both, though the iPad Pro gets a tad brighter with HDR content. Color-wise, the iPad Pro and OnePlus Pad 3 aren’t as vivid, though their values deliver more naturalistic hues than the Tab S12.</p><h2 id="strong-performance-2">Strong 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="YHb7i2SCuxbWHULRtcWkL4" name="Samsung Galaxy Tab S12 Ultra-5" alt="Samsung Galaxy Tab S12 Ultra" src="https://cdn.mos.cms.futurecdn.net/YHb7i2SCuxbWHULRtcWkL4-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The new Galaxy Tab S12 Ultra upgrades the prior model’s MediaTek Dimensity 9400+ processor to the MediaTek Dimensity 9500 chip, while RAM remains the same at 12GB regardless of how much storage you choose. Although there isn’t a massive performance boost from gen to gen, you’re still getting a slate that offers solid performance.</p><p>Though I wouldn’t replace my laptop with this tablet, I could still get work done on it without too much trouble. It can handle my typical workflow, which includes multiple open Chrome tabs and the occasional YouTube video. Android also feels snappy, and I rarely (if ever) have apps take too long to load. Navigating the tablet’s settings is also seamless.</p><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Samsung Galaxy Tab S12 Ultra</strong></p></th><th  ><p><strong>iPad Pro M5</strong></p></th><th  ><p><strong>OnePlus Pad 3</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Chipset</strong></p></td><td  ><p>MediaTek Dimensity 9500</p></td><td  ><p>Apple M5</p></td><td  ><p>Snapdragon 8 Elite </p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6 score (single-core / multi-core) </strong></p></td><td  ><p>3229 / 9763</p></td><td  ><p>4,155 / 16,517 </p></td><td  ><p>2,980 / 8,993 </p></td></tr><tr><td class="firstcol " ><p><strong>3DMark Wild Life Extreme Unlimited (score / fps)</strong></p></td><td  ><p>6608 / 39.7 fps</p></td><td  ><p>9,934 / 59 fps </p></td><td  ><p>6,410 / 38.38</p></td></tr></tbody></table></div><p>As you can see in the table above, the new Tab S12 Ultra has slightly better single- and multi-core performance than last year’s model. That’s commendable, but it’s still not comparable to the powerful iPad Pro M5, which remains the fastest tablet out there.</p><p>Again, the Tab S12 Ultra isn’t a slouch when it comes to performance, but Apple’s premium slate still outclasses it. However, if you’re just using this tablet to play Android games, run some work-related apps, or watch YouTube, that performance gap won’t matter much.</p><h2 id="solid-battery-life">Solid 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="SdpeLpkJHhrEUv8Hrs9wS8" name="Samsung Galaxy Tab S12 Ultra-4" alt="Samsung Galaxy Tab S12 Ultra" src="https://cdn.mos.cms.futurecdn.net/SdpeLpkJHhrEUv8Hrs9wS8-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>To be upfront, the Galaxy Tab S12 Ultra doesn’t last as long as last year’s model. So why is battery life still in “The ups” section? Because even though this tablet’s endurance is lower, it’ll still last you for the better part of a workday and then some.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Time (hours:mins)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Samsung Galaxy Tab S12 Ultra</strong></p></td><td  ><p>11:31</p></td></tr><tr><td class="firstcol " ><p><strong>iPad Pro M5</strong></p></td><td  ><p>13:16</p></td></tr><tr><td class="firstcol " ><p><strong>OnePlus Pad 3</strong></p></td><td  ><p>16:21</p></td></tr></tbody></table></div><p>In our battery life test, which involves continuous web surfing over Wi-Fi with the display set to 150 nits of brightness, the Galaxy Tab S12 Ultra lasted 11 hours and 31 minutes. In contrast, its predecessor lasted over 30 minutes longer.</p><p>Though you don’t want battery life to decline in a newer model, it’s not a steep drop-off. That said, the iPad Pro M5 and especially the OnePlus Pad 3 outpace the Tab S12 Ultra by a wide margin. Leaving the included charger at home won’t be an emergency, but it’s better to take it with you just in case.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s12-ultra-review-the-downs"><span>Samsung Galaxy Tab S12 Ultra review: The downs</span></h3><p>The Samsung Galaxy Tab S12 Ultra  is an impressive and massive Android tablet but it's not without its downsides which include DeX Mode limitations and a higher price than last year's model.</p><h2 id="dex-mode-still-isn-t-great">DeX Mode still isn’t great</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wpfa6TAsVmJYEjHGgTSnmC" name="Samsung Galaxy Tab S12 Ultra-2" alt="Samsung Galaxy Tab S12 Ultra" src="https://cdn.mos.cms.futurecdn.net/wpfa6TAsVmJYEjHGgTSnmC-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>DeX Mode, which provides Samsung devices with desktop-like functionality, remains largely unchanged from the previous version. While it certainly makes the UI feel more like Windows, it still has some of the shortcomings from before.</p><p>To make the most of DeX Mode, you’ll need to connect the Tab S12 Ultra to an external monitor. Doing this brings up a Windows-like taskbar on the connected monitor, while the tablet gets a less functional taskbar. Sure, this mostly works as advertised, but I still liked it better when DeX Mode functioned on its own without the need for peripherals.</p><h2 id="200-price-bump">$200 price bump</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cFSEXah665SbEbew6SKKZH" name="Samsung Galaxy Tab S12 Ultra-9" alt="Samsung Galaxy Tab S12 Ultra" src="https://cdn.mos.cms.futurecdn.net/cFSEXah665SbEbew6SKKZH-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>To be clear, the Tab S Ultra series has always been Samsung’s most expensive tablet line. Even so, the $200 price increase over last year’s model could make some reconsider their decision to buy this slate.</p><p>Why the price hike for nominal upgrades? As I’m sure you’ve already guessed, it’s likely due to the ongoing RAM crisis, which has driven up component costs. Not only does this probably account for the price hike, but it also explains why Samsung didn’t pack more RAM into this tablet than into last year’s model—doing so would’ve driven the price up even further.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s12-ultra-review-verdict"><span>Samsung Galaxy Tab S12 Ultra review: Verdict</span></h3><p>Even if the Galaxy Tab S12 Ultra can’t truly replace your laptop and is now $200 more than last year’s model for nominal upgrades, it’s still an overall great Android tablet at what it does. Even if its performance isn’t equal to iPad Pro’s, the beautiful OLED panel certainly rivals that of Apple’s premium slate.</p><p>If you’re an Apple fan, then you’re better off with an iPad Pro or even an iPad Air. And if all you’re looking for is an Android tablet to stream content on, then the much more affordable $399 <a href="https://www.tomsguide.com/computing/tablets/lenovo-tab-plus-gen-2-review">Lenovo Tab Plus Gen 2</a> is a better bet. But if you’re a Samsung user and want an Android tablet with the largest canvas out there, you can't go wrong with the Galaxy Tab S12 Ultra.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tested an Android tablet that rivals the iPad mini — and its OLED display won me over ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The RedMagic Astra 2 could easily be mistaken for an iPad mini thanks to its compact 9-inch design and rounded corners. However, under the hood, it’s powered by one of Snapdragon’s fastest mobile processors and paired with more RAM than in many other laptops. All of that makes for an excellent and very portable gaming tablet.</p><p>With dual USB-C ports, you can charge the Astra 2 with a mobile game controller attached or even connect the tablet to a monitor or TV for a big-screen gaming experience. Speaking of gaming, there’s a physical switch on the side that activates RedMagic’s dedicated Game Space launcher. Oh, and if that wasn’t enough, you can also run full PC games from Steam right on the tablet using the company’s optional Game Hub app.</p><p>Then there’s the screen. With a 185Hz OLED panel, the Astra 2 isn’t just fast, but it delivers stunning visuals with deep blacks and excellent picture quality overall.</p><p>I’ve been using the Astra 2 as my daily driver for the past two months — both at home and while traveling — and this compact but almost overpowered gaming tablet hasn’t let me down yet, even if it can be a little rough around the edges at times. My RedMagic Astra 2 review will help you decide if this is the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablet</a> for your needs or if it’s worth sacrificing raw performance for a more budget-friendly alternative.</p><h3 class="article-body__section" id="section-redmagic-astra-2-cheat-sheet"><span>RedMagic Astra 2: Cheat Sheet</span></h3><ul><li><strong>What is it? </strong>A compact Android tablet with high-end specs for gaming.</li><li><strong>Who is it for? </strong>For people who want the best mobile gaming experience on a tablet, as well as for Android users who want a small tablet like the iPad mini.</li><li><strong>What does it cost? </strong>The RedMagic Astra 2 <a href="https://global.redmagic.gg/products/redmagic-astra-2-gaming-tablet?variant=55811529474121" target="_blank" rel="nofollow">starts at $699</a>, or you can get an upgraded version with more memory and storage <a href="https://global.redmagic.gg/products/redmagic-astra-2-gaming-tablet?variant=55811529506889" target="_blank" rel="nofollow">for $799</a>.</li><li><strong>What do we like? </strong>Its compact size and premium design, the integrated fingerprint scanner in the power button, the gorgeous 185Hz OLED screen, and that it has dual USB-C ports and the performance of its Snapdragon 8 Elite Gen 5 processor.</li><li><strong>What don’t we like? </strong>The tablet’s premium price, that it doesn’t come with any extra accessories, how RedMagic OS feels clunky and that the main, full-featured USB-C port isn’t centered.</li></ul><h3 class="article-body__section" id="section-redmagic-astra-2-specs"><span>RedMagic Astra 2: Specs</span></h3><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$699 (12GB+256GB), $799 (16GB+512GB) (as tested)</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>9.06-inch OLED (2,400 x 1504), 185Hz</p></td></tr><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>Qualcomm Snapdragon 8 Elite Gen 5</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>12GB-16GB LPDDR5X</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>256GB-512GB</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>8,300 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Cameras</strong></p></td><td  ><p>9MP (front), 13MP (rear)</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Wi-Fi 7, Bluetooth 6.0</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>1 x USB 3.2 Gen 2 with DisplayPort, 1 x USB-C 2.0</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Silver, Black</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>8.15 x 5.28 x 0.27 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>0.8 pounds (363 grams)</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-redmagic-astra-2-the-ups"><span>RedMagic Astra 2: The Ups</span></h3><p>From its premium build and powerful components to its stunning OLED display, the Astra 2 isn’t just another budget Android tablet. Instead, it feels even better than Apple’s iPad mini in hand while delivering a console-like experience if you want it.</p><h2 id="the-anti-ipad-mini">The anti-iPad mini</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="B2A3PRvZuDM87Aw7bsAmWL" name="Red Magic Astra 2--2" alt="A person holding the RedMagic Astra 2 gamign tablet in portrait mode outside" src="https://cdn.mos.cms.futurecdn.net/B2A3PRvZuDM87Aw7bsAmWL-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>At 8.15 x 5.28 x 0.27 inches, the Astra 2 is slightly larger than the <a href="https://www.tomsguide.com/tablets/i-spent-two-weeks-with-the-ipad-mini-7-and-it-reignited-my-love-for-smaller-tablets">iPad mini</a> to account for its 9.06-inch display versus the latter’s 8.3-inch panel. With an anodized aluminum frame, rounded corners, and a glossy screen, this Android tablet instantly feels premium.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="tCEBYeeWyDe9KTTTVHLRbQ" name="Red Magic Astra 2--10" alt="The RedMagic Astra 2's power button with integrated fingerprint scanner" src="https://cdn.mos.cms.futurecdn.net/tCEBYeeWyDe9KTTTVHLRbQ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>On the left side — assuming you’re holding the tablet in landscape mode — there’s a power button with an integrated fingerprint scanner next to a set of speaker grilles. When holding the Astra 2 this way, I really like how my index finger rests right on the top edge, which makes securely logging in via my fingerprint a breeze.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="j7yFDywFGzGdJAx4JvHuTT" name="Red Magic Astra 2--12" alt="The RedMagic Astra 2's main, full-featured USB-C port" src="https://cdn.mos.cms.futurecdn.net/j7yFDywFGzGdJAx4JvHuTT-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Then on the right side, there’s a full-featured USB-C port next to the other set of speaker grilles. One thing that sets the Astra 2 apart from other tablets is the red toggle switch across from its volume rocker. Called the Competitive Key, switching it on lets you jump from your Android home screen right into RedMagic’s GameSpace launcher, but more on that later. There’s also a second USB-C port for charging the device or connecting accessories centered along the bottom edge.</p><div ><table><caption>Battery life results </caption><thead><tr><th class="firstcol empty" ></th><th  ><p>Time (hours:mins)</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>RedMagic Astra 2</strong></p></td><td  ><p>11:28 (60Hz) | 11:10 (185Hz) </p></td></tr><tr><td class="firstcol " ><p><strong>iPad mini 7</strong></p></td><td  ><p>10:34 (60Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Lenovo Tab Gen 2</strong></p></td><td  ><p>16:00 (60Hz) | 13:39 (120Hz) </p></td></tr></tbody></table></div><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8vkAXBNo9k2oKJCpDdnsGY" name="Red Magic Astra 2--11" alt="The RedMagic Astra 2's vapor chamber with RGB lighting and its rear camera" src="https://cdn.mos.cms.futurecdn.net/8vkAXBNo9k2oKJCpDdnsGY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>It’s only when you flip the Astra 2 over that you realize this isn’t an iPad mini or even your standard, compact Android tablet. At the top of the device, there’s a 3D vapor chamber for cooling, complete with customizable RGB lighting and a glass strip on top so you can see everything. Then on the right edge, there’s a 13MP camera.</p><p>While this design choice might not be for everyone, I really like it. You get just a touch of gamer flair while knowing that, yes, this tablet is powered by Qualcomm’s Snapdragon 8 Elite Gen 5 chip. If this chipset sounds familiar, that’s because it powers many of the <a href="https://www.tomsguide.com/best-picks/best-phones">best phones</a>, including the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review">Samsung Galaxy S26 Ultra</a>, the <a href="https://www.tomsguide.com/phones/oneplus-phones/oneplus-15-review">OnePlus 15</a>, and even the <a href="https://www.tomsguide.com/phones/samsung-phones/ive-been-living-with-the-galaxy-z-fold-8-for-3-weeks-and-i-was-wrong">Samsung Galaxy Z Fold 8</a>.</p><h2 id="deep-blacks-and-faster-frames">Deep blacks and faster frames</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="z8UrFnFR3NoqKfi2W6eEXb" name="Red Magic Astra 2--9" alt="A person holding the RedMagic Astra 2 gaming tablet in portrait mode at a dark restaurant" src="https://cdn.mos.cms.futurecdn.net/z8UrFnFR3NoqKfi2W6eEXb-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Despite all that power under the hood, the Astra 2’s display immediately steals the show when the tablet is powered on. With symmetrical 4.9mm bezels on all sides, you see more of the screen than on the <a href="https://www.tomsguide.com/tablets/ipads/ipad-mini-7-review">iPad mini 7</a>, which has thicker 8.5–9mm bezels and a 3:2 aspect ratio. At a resolution of 2400 x 1504, you also get a bit more screen real estate to work with, though Apple just barely wins on pixel density at 326 vs 316 pixels per inch.</p><p>The Astra 2 also features a 16:10 aspect ratio, which results in less letterboxing when watching TV shows and movies. Although I don’t normally watch movies on a tablet, I made an exception while testing the Astra 2 thanks to its stunning OLED display.</p><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p>RedMagic Astra 2</p></th><th  ><p>iPad mini 7</p></th><th  ><p>Lenovo Tab Plus Gen 2</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Nits (brightness)</strong></p></td><td  ><p>659 (SDR) | 1030 (HDR)</p></td><td  ><p>470 (SDR) | 475 (HDR)</p></td><td  ><p>597 (SDR) | 776 (HDR) </p></td></tr><tr><td class="firstcol " ><p><strong>sRGB</strong></p></td><td  ><p>198.8%</p></td><td  ><p>107.7%</p></td><td  ><p>157.5%</p></td></tr><tr><td class="firstcol " ><p><strong>DCI-P3</strong></p></td><td  ><p>141.5%</p></td><td  ><p>76.3%</p></td><td  ><p>111.5%</p></td></tr><tr><td class="firstcol " ><p><strong>Delta-E</strong></p></td><td  ><p>0.31</p></td><td  ><p>0.21</p></td><td  ><p>0.25</p></td></tr></tbody></table></div><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VHtyzDnzLcHtCBbhnZqWvf" name="Red Magic Astra 2--8" alt="A person watching Shang Chi and the Legend of the Ten Rings on the RedMagic Astra 2 gaming tablet" src="https://cdn.mos.cms.futurecdn.net/VHtyzDnzLcHtCBbhnZqWvf-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>While watching Marvel’s Shang-Chi and the Legend of the Ten Rings to get ready for Avengers: Doomsday, the darker, nighttime fight scenes in Macau stood out for their rich, deep blacks, while the lush greenery of Ta Lo in the latter half of the film really popped.</p><p>Thanks to the Astra 2’s full-featured USB-C port, I also connected a pair of the <a href="https://www.tomsguide.com/computing/vr-ar/best-smart-glasses">best smart glasses</a>, the <a href="https://www.tomsguide.com/computing/smart-glasses/viture-pro-2-xr-glasses-review">Viture Pro 2</a>, and watched several films on the tablet during a flight home from Berlin. As with Samsung’s DeX, RedMagic lets you use the tablet’s display as a trackpad while wearing display glasses, though it lacks some of the polish of Samsung’s implementation, with written directions hardcoded across the screen.</p><p>You can’t crank up movies and TV shows past 60Hz, but with games it’s a different story. There are quite a few of the <a href="https://www.tomsguide.com/round-up/best-android-games">best Android games</a> that let you play at a higher 120Hz or 144Hz, or on the Astra 2, which has an 185Hz refresh rate. Given I’m more of a PC gamer, though, RedMagic’s Astra 2 has another really cool trick up its sleeve.</p><h2 id="a-tablet-sized-console">A tablet-sized console</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uuHGGDFpnjRVf5yFp8bEDk" name="Red Magic Astra 2--6" alt="The RedMagic Astra 2 gaming tablet connected to a monitor over USB-C" src="https://cdn.mos.cms.futurecdn.net/uuHGGDFpnjRVf5yFp8bEDk-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Astra 2 is nothing if not a highly versatile gaming tablet. Sure, you can play all the most demanding Android games, from Zenless Zone Zero and Wuthering Waves to Genshin Impact and Fortnite, with ease and all the settings turned up. However, that’s far from your only way to play.</p><p>Just like how you can dock the Nintendo Switch 2, if you have one of the <a href="https://www.tomsguide.com/best-picks/best-monitors">best monitors</a> with USB-C in, you can get a one-cable, big-screen gaming experience with the Astra 2. Likewise, with a device like the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-tried-genkis-covert-dock-3-with-the-nintendo-switch-2-and-it-beats-the-official-dock-for-one-key-reason">Genki Covert Dock 3</a>, you can connect the tablet to a TV.</p><div ><table><caption>Performance benchmarks</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p>RedMagic Astra 2</p></td><td  ><p>iPad mini 7</p></td><td  ><p>Lenovo Tab Gen 2</p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6 score (single-core / multi-core)</strong></p></td><td  ><p>3771 / 11979</p></td><td  ><p>2888 / 7113</p></td><td  ><p>1125 / 3417 </p></td></tr><tr><td class="firstcol " ><p><strong>3DMark Wild Life Extreme Unlimited (score/fps)</strong></p></td><td  ><p>7993 / 47.87</p></td><td  ><p>2863 / 17.1</p></td><td  ><p>1063 / 6.37</p></td></tr></tbody></table></div><p>With the Astra 2 connected to my Innova CB32U1 monitor, I toggled the Astra 2’s Competitive Key and got a full-fledged game launcher on my display, and I could also use the tablet simultaneously. All of the games you have installed appear in RedMagic’s Game Space, and you can also stream games from your PC or consoles using their respective remote play apps.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="aK7JJU4VwExS9eAXgyCGf3" name="Red Magic Astra 2--4" alt="A person holding the RedMagic Astra 2 showing off all of the compatible PC games via emulation in RedMagic's GameHub app" src="https://cdn.mos.cms.futurecdn.net/aK7JJU4VwExS9eAXgyCGf3-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Although it didn’t come pre-installed on my review unit, I was able to get the full AAA experience locally after downloading RedMagic’s GameHub app. That’s right, with GameHub installed and your Steam or Epic Games account linked, you can play many of the <a href="https://www.tomsguide.com/best-picks/best-PC-games">best PC games</a> via emulation directly on your Android tablet.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DfcMbyjPuSvLuKEBro62R8" name="Red Magic Astra 2--5" alt="A person holding a controller in front of the RedMagic Astra 2 gaming tablet running the PC version of Portal 2 using emulation" src="https://cdn.mos.cms.futurecdn.net/DfcMbyjPuSvLuKEBro62R8-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I loaded up a few and played my go-to game, the skateboarding sim Session, along with Valve’s Portal 2 at 50–60 fps without having to turn down their settings too much. The experience wasn’t perfect, and getting to the main menu in Metro Exodus took much longer than I expected. Still, being able to play the PC games you already own on your Android tablet is much better than being limited to mobile games, especially when big ports like Resident Evil 4 or Death Stranding are only available on Apple’s iPadOS.</p><h3 class="article-body__section" id="section-redmagic-astra-2-the-downs"><span>RedMagic Astra 2: The Downs</span></h3><p>The Astra 2 is an impressive Android tablet that easily rivals Apple’s iPad mini, but it’s not without its downsides. From a very premium price for a smaller tablet to a USB-C port that isn’t quite in the right place, there are certainly some kinks RedMagic needs to iron out before a potential follow-up. </p><h2 id="full-featured-but-off-center">Full-featured but off-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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="iExr2zxN6EQVx698CfVU7C" name="Red Magic Astra 2--13" alt="The centered, secondary USB-C port on the RedMagic Astra 2 gaming tablet" src="https://cdn.mos.cms.futurecdn.net/iExr2zxN6EQVx698CfVU7C-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Two is always better than one, and that’s especially true for USB-C ports on a device like the Astra 2. That way, you can play and charge at the same time or even use a wired keyboard and mouse while emulating PC games in the GameHub app. However, there’s just one problem: these dual USB-C ports aren’t identical.</p><p>While the USB-C port on the right side of the Astra 2 is a 3.2 Gen 2 port with DisplayPort out, the one on the underside of the tablet is a slower, less capable USB 2.0 port. Normally, this wouldn’t be a problem, and on my <a href="https://www.tomsguide.com/computing/tablets/i-thought-the-ipad-mini-was-the-perfect-small-tablet-until-i-tried-the-lenovo-legion-tab-3-heres-why">Lenovo Legion Tab Gen 3</a> with an identical dual-port setup, it isn’t. However, the Astra 2’s more powerful USB-C port is located in a very awkward place.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JSH9rKKEuZdbZvcmQumT2G" name="Red Magic Astra 2--7" alt="The RedMagic Astra 2 gaming tablet with the Razer Kishi Ultra telescoping controller attached on either side" src="https://cdn.mos.cms.futurecdn.net/JSH9rKKEuZdbZvcmQumT2G-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Now that many of the <a href="https://www.tomsguide.com/best-picks/best-mobile-game-controllers">best mobile game controllers</a> support smaller tablets like the Astra 2 or iPad mini, my first instinct was to attach one on either side of RedMagic’s tablet. </p><p>Unfortunately, instead of being centered, the more powerful USB-C port is located above the speaker grille on the right side. With my <a href="https://www.tomsguide.com/gaming/i-built-the-ultimate-remote-play-setup-with-wi-fi-7-to-say-goodbye-to-stuttery-gameplay-for-good-heres-how">Razer Kishi Ultra</a> connected, a good portion of the Astra 2 hangs below the controller, similar to the screen lip on the <a href="https://www.tomsguide.com/gaming/handheld-gaming/msi-claw-8-ex-ai-plus-review">MSI Claw 8 EX AI+</a>. However, while that handheld gaming PC’s screen extends slightly, almost half of the Astra 2’s display was positioned below my telescopic controller.</p><p>You see similar setups when people try to put a telescopic game controller on one of the <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldable phones</a>. I just never expected to have to deal with something like this on a tablet specifically made for gaming — and mobile gaming at that.</p><h2 id="a-steep-investment-without-the-extras">A steep investment without the extras</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Ng6tAYcSK8XVA7CSu7SSYL" name="Red Magic Astra 2--3" alt="A person reading the Tom's Guide homepage on the RedMagic Astra 2 gaming tablet" src="https://cdn.mos.cms.futurecdn.net/Ng6tAYcSK8XVA7CSu7SSYL-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>At $699 for the base model or $799 for the version with 16GB of RAM and 512GB of storage, the Astra 2 is certainly a premium Android tablet. If mobile gaming is your thing and you want to play on a larger screen, or if you want a very future-proof tablet, the Astra 2 could be worth it.</p><p>After paying $549 for the Legion Tab Gen 3 back in 2025, before <a href="https://www.tomsguide.com/computing/ram-price-crisis-2026-everything-you-need-to-know">RAMageddon</a> hit, it makes sense that RedMagic had to raise the price of the Astra 2. With components getting more expensive, launching it at $499 for the base model, as the company did with the Astra 1, no longer makes sense.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jkEFTroXhZSacLbJaPfLSP" name="Red Magic Astra 2--14" alt="The RedMagic Astra 2 gaming tablet unboxed on a table" src="https://cdn.mos.cms.futurecdn.net/jkEFTroXhZSacLbJaPfLSP-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>What surprised me, though, was how little was in the box. Of course, I got the tablet itself and a charging cable, but I was disappointed I didn’t find any other extras beyond a few stickers. For comparison, the Legion Tab Gen 3 included a folio case with a removable magnetic front cover and a glass screen protector.</p><p>Apparently, Lenovo has also become a bit more stringent with included freebies in the Tab Gen 5, likely to keep costs down. Still, I would have loved to see a case with a built-in stand included with the Astra 2, especially since you can’t comfortably use a mobile game controller with it because of that off-center USB-C port.</p><h3 class="article-body__section" id="section-redmagic-astra-2-verdict"><span>RedMagic Astra 2: Verdict</span></h3><p>The RedMagic Astra 2 is certainly an outlier among Android tablets. For starters, it has a compact, portable 9-inch design with true flagship power under the hood. Its 185Hz OLED display makes whatever content you’re watching or playing stand out in the best way. You also get dual USB-C ports and a fingerprint scanner integrated directly into its power button for secure, seamless logins.</p><p>While the off-center, full-featured USB-C port is a bit of a bummer, along with the Astra 2’s higher price, the device still feels exceptionally premium in hand. Still, I would have loved to have a case in the box and for RedMagic to work out a few of the kinks in its proprietary Android launcher.</p><p>If you want the versatility of a tablet that’s also highly portable and a gaming experience that’s almost on par with one of the <a href="https://www.tomsguide.com/round-up/best-handheld-gaming-consoles">best PC handhelds</a>, the Astra 2 can’t be beat. It’s one of the <a href="https://www.tomsguide.com/best-picks/best-android-tablets">best Android tablets</a> I’ve tried yet, and while using it, I didn’t miss my iPad mini at all.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/tablets/redmagic-astra-2-review</link>
                                                                            <description>
                            <![CDATA[ The RedMagic Astra 2 is a sleek and powerful Android gaming tablet in a very portable form factor that feels like the anti-iPad mini. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">bGYYVw7vTZ3HJv8eTMntwb</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/DsA3pAzM7tpZAtLgxzQGXF-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 26 Sep 2026 10:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Tablets]]></category>
                                                    <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                                                                <author><![CDATA[ anthony.spadafora@futurenet.com (Anthony Spadafora) ]]></author>                    <dc:creator><![CDATA[ Anthony Spadafora ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/z73LEoj7FkUjNG85GcWHtH-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Anthony Spadafora is the managing editor for security and home office furniture at Tom’s Guide where he covers everything from data breaches and malware to password managers and the best way to cover your whole home or business with a strong Wi-Fi signal.&lt;/p&gt;&lt;p&gt;Before joining the team, he spent three years covering cybersecurity and B2B tech for ITProPortal while living in South Korea. After moving back to the US. Anthony joined the TechRadar Pro team where he covered these topics along with VPNs, web hosting, online collaboration software and video conferencing for four years. Anthony also has his ears to the ground and is on the lookout for the next major cyberattack or data breach.&lt;/p&gt;&lt;p&gt;Based in Houston, Texas, Anthony also handles VPN testing for both Tom’s Guide and TechRadar. As someone who has worked from home exclusively since 2018, he has reviewed dozens of standing desks as well as office chairs and has taken a closer look at other essential remote working accessories. As part of these reviews, Anthony frequently builds intricate desk setups which is why he’s such a big advocate for cable management and keeping things organized. When he’s not writing, he can be found tinkering with PCs and game consoles, managing cables and making upgrades to his smart home.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/DsA3pAzM7tpZAtLgxzQGXF-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The RedMagic Astra 2 gaming tablet in landscape mode up against a wall]]></media:description>                                                            <media:text><![CDATA[The RedMagic Astra 2 gaming tablet in landscape mode up against a wall]]></media:text>
                                <media:title type="plain"><![CDATA[The RedMagic Astra 2 gaming tablet in landscape mode up against a wall]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/DsA3pAzM7tpZAtLgxzQGXF-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The RedMagic Astra 2 could easily be mistaken for an iPad mini thanks to its compact 9-inch design and rounded corners. However, under the hood, it’s powered by one of Snapdragon’s fastest mobile processors and paired with more RAM than in many other laptops. All of that makes for an excellent and very portable gaming tablet.</p><p>With dual USB-C ports, you can charge the Astra 2 with a mobile game controller attached or even connect the tablet to a monitor or TV for a big-screen gaming experience. Speaking of gaming, there’s a physical switch on the side that activates RedMagic’s dedicated Game Space launcher. Oh, and if that wasn’t enough, you can also run full PC games from Steam right on the tablet using the company’s optional Game Hub app.</p><p>Then there’s the screen. With a 185Hz OLED panel, the Astra 2 isn’t just fast, but it delivers stunning visuals with deep blacks and excellent picture quality overall.</p><p>I’ve been using the Astra 2 as my daily driver for the past two months — both at home and while traveling — and this compact but almost overpowered gaming tablet hasn’t let me down yet, even if it can be a little rough around the edges at times. My RedMagic Astra 2 review will help you decide if this is the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablet</a> for your needs or if it’s worth sacrificing raw performance for a more budget-friendly alternative.</p><h3 class="article-body__section" id="section-redmagic-astra-2-cheat-sheet"><span>RedMagic Astra 2: Cheat Sheet</span></h3><ul><li><strong>What is it? </strong>A compact Android tablet with high-end specs for gaming.</li><li><strong>Who is it for? </strong>For people who want the best mobile gaming experience on a tablet, as well as for Android users who want a small tablet like the iPad mini.</li><li><strong>What does it cost? </strong>The RedMagic Astra 2 <a href="https://global.redmagic.gg/products/redmagic-astra-2-gaming-tablet?variant=55811529474121" target="_blank" rel="nofollow">starts at $699</a>, or you can get an upgraded version with more memory and storage <a href="https://global.redmagic.gg/products/redmagic-astra-2-gaming-tablet?variant=55811529506889" target="_blank" rel="nofollow">for $799</a>.</li><li><strong>What do we like? </strong>Its compact size and premium design, the integrated fingerprint scanner in the power button, the gorgeous 185Hz OLED screen, and that it has dual USB-C ports and the performance of its Snapdragon 8 Elite Gen 5 processor.</li><li><strong>What don’t we like? </strong>The tablet’s premium price, that it doesn’t come with any extra accessories, how RedMagic OS feels clunky and that the main, full-featured USB-C port isn’t centered.</li></ul><h3 class="article-body__section" id="section-redmagic-astra-2-specs"><span>RedMagic Astra 2: Specs</span></h3><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$699 (12GB+256GB), $799 (16GB+512GB) (as tested)</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>9.06-inch OLED (2,400 x 1504), 185Hz</p></td></tr><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>Qualcomm Snapdragon 8 Elite Gen 5</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>12GB-16GB LPDDR5X</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>256GB-512GB</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>8,300 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Cameras</strong></p></td><td  ><p>9MP (front), 13MP (rear)</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Wi-Fi 7, Bluetooth 6.0</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>1 x USB 3.2 Gen 2 with DisplayPort, 1 x USB-C 2.0</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Silver, Black</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>8.15 x 5.28 x 0.27 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>0.8 pounds (363 grams)</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-redmagic-astra-2-the-ups"><span>RedMagic Astra 2: The Ups</span></h3><p>From its premium build and powerful components to its stunning OLED display, the Astra 2 isn’t just another budget Android tablet. Instead, it feels even better than Apple’s iPad mini in hand while delivering a console-like experience if you want it.</p><h2 id="the-anti-ipad-mini">The anti-iPad mini</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="B2A3PRvZuDM87Aw7bsAmWL" name="Red Magic Astra 2--2" alt="A person holding the RedMagic Astra 2 gamign tablet in portrait mode outside" src="https://cdn.mos.cms.futurecdn.net/B2A3PRvZuDM87Aw7bsAmWL-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>At 8.15 x 5.28 x 0.27 inches, the Astra 2 is slightly larger than the <a href="https://www.tomsguide.com/tablets/i-spent-two-weeks-with-the-ipad-mini-7-and-it-reignited-my-love-for-smaller-tablets">iPad mini</a> to account for its 9.06-inch display versus the latter’s 8.3-inch panel. With an anodized aluminum frame, rounded corners, and a glossy screen, this Android tablet instantly feels premium.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="tCEBYeeWyDe9KTTTVHLRbQ" name="Red Magic Astra 2--10" alt="The RedMagic Astra 2's power button with integrated fingerprint scanner" src="https://cdn.mos.cms.futurecdn.net/tCEBYeeWyDe9KTTTVHLRbQ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>On the left side — assuming you’re holding the tablet in landscape mode — there’s a power button with an integrated fingerprint scanner next to a set of speaker grilles. When holding the Astra 2 this way, I really like how my index finger rests right on the top edge, which makes securely logging in via my fingerprint a breeze.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="j7yFDywFGzGdJAx4JvHuTT" name="Red Magic Astra 2--12" alt="The RedMagic Astra 2's main, full-featured USB-C port" src="https://cdn.mos.cms.futurecdn.net/j7yFDywFGzGdJAx4JvHuTT-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Then on the right side, there’s a full-featured USB-C port next to the other set of speaker grilles. One thing that sets the Astra 2 apart from other tablets is the red toggle switch across from its volume rocker. Called the Competitive Key, switching it on lets you jump from your Android home screen right into RedMagic’s GameSpace launcher, but more on that later. There’s also a second USB-C port for charging the device or connecting accessories centered along the bottom edge.</p><div ><table><caption>Battery life results </caption><thead><tr><th class="firstcol empty" ></th><th  ><p>Time (hours:mins)</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>RedMagic Astra 2</strong></p></td><td  ><p>11:28 (60Hz) | 11:10 (185Hz) </p></td></tr><tr><td class="firstcol " ><p><strong>iPad mini 7</strong></p></td><td  ><p>10:34 (60Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Lenovo Tab Gen 2</strong></p></td><td  ><p>16:00 (60Hz) | 13:39 (120Hz) </p></td></tr></tbody></table></div><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8vkAXBNo9k2oKJCpDdnsGY" name="Red Magic Astra 2--11" alt="The RedMagic Astra 2's vapor chamber with RGB lighting and its rear camera" src="https://cdn.mos.cms.futurecdn.net/8vkAXBNo9k2oKJCpDdnsGY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>It’s only when you flip the Astra 2 over that you realize this isn’t an iPad mini or even your standard, compact Android tablet. At the top of the device, there’s a 3D vapor chamber for cooling, complete with customizable RGB lighting and a glass strip on top so you can see everything. Then on the right edge, there’s a 13MP camera.</p><p>While this design choice might not be for everyone, I really like it. You get just a touch of gamer flair while knowing that, yes, this tablet is powered by Qualcomm’s Snapdragon 8 Elite Gen 5 chip. If this chipset sounds familiar, that’s because it powers many of the <a href="https://www.tomsguide.com/best-picks/best-phones">best phones</a>, including the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review">Samsung Galaxy S26 Ultra</a>, the <a href="https://www.tomsguide.com/phones/oneplus-phones/oneplus-15-review">OnePlus 15</a>, and even the <a href="https://www.tomsguide.com/phones/samsung-phones/ive-been-living-with-the-galaxy-z-fold-8-for-3-weeks-and-i-was-wrong">Samsung Galaxy Z Fold 8</a>.</p><h2 id="deep-blacks-and-faster-frames">Deep blacks and faster frames</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="z8UrFnFR3NoqKfi2W6eEXb" name="Red Magic Astra 2--9" alt="A person holding the RedMagic Astra 2 gaming tablet in portrait mode at a dark restaurant" src="https://cdn.mos.cms.futurecdn.net/z8UrFnFR3NoqKfi2W6eEXb-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Despite all that power under the hood, the Astra 2’s display immediately steals the show when the tablet is powered on. With symmetrical 4.9mm bezels on all sides, you see more of the screen than on the <a href="https://www.tomsguide.com/tablets/ipads/ipad-mini-7-review">iPad mini 7</a>, which has thicker 8.5–9mm bezels and a 3:2 aspect ratio. At a resolution of 2400 x 1504, you also get a bit more screen real estate to work with, though Apple just barely wins on pixel density at 326 vs 316 pixels per inch.</p><p>The Astra 2 also features a 16:10 aspect ratio, which results in less letterboxing when watching TV shows and movies. Although I don’t normally watch movies on a tablet, I made an exception while testing the Astra 2 thanks to its stunning OLED display.</p><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p>RedMagic Astra 2</p></th><th  ><p>iPad mini 7</p></th><th  ><p>Lenovo Tab Plus Gen 2</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Nits (brightness)</strong></p></td><td  ><p>659 (SDR) | 1030 (HDR)</p></td><td  ><p>470 (SDR) | 475 (HDR)</p></td><td  ><p>597 (SDR) | 776 (HDR) </p></td></tr><tr><td class="firstcol " ><p><strong>sRGB</strong></p></td><td  ><p>198.8%</p></td><td  ><p>107.7%</p></td><td  ><p>157.5%</p></td></tr><tr><td class="firstcol " ><p><strong>DCI-P3</strong></p></td><td  ><p>141.5%</p></td><td  ><p>76.3%</p></td><td  ><p>111.5%</p></td></tr><tr><td class="firstcol " ><p><strong>Delta-E</strong></p></td><td  ><p>0.31</p></td><td  ><p>0.21</p></td><td  ><p>0.25</p></td></tr></tbody></table></div><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VHtyzDnzLcHtCBbhnZqWvf" name="Red Magic Astra 2--8" alt="A person watching Shang Chi and the Legend of the Ten Rings on the RedMagic Astra 2 gaming tablet" src="https://cdn.mos.cms.futurecdn.net/VHtyzDnzLcHtCBbhnZqWvf-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>While watching Marvel’s Shang-Chi and the Legend of the Ten Rings to get ready for Avengers: Doomsday, the darker, nighttime fight scenes in Macau stood out for their rich, deep blacks, while the lush greenery of Ta Lo in the latter half of the film really popped.</p><p>Thanks to the Astra 2’s full-featured USB-C port, I also connected a pair of the <a href="https://www.tomsguide.com/computing/vr-ar/best-smart-glasses">best smart glasses</a>, the <a href="https://www.tomsguide.com/computing/smart-glasses/viture-pro-2-xr-glasses-review">Viture Pro 2</a>, and watched several films on the tablet during a flight home from Berlin. As with Samsung’s DeX, RedMagic lets you use the tablet’s display as a trackpad while wearing display glasses, though it lacks some of the polish of Samsung’s implementation, with written directions hardcoded across the screen.</p><p>You can’t crank up movies and TV shows past 60Hz, but with games it’s a different story. There are quite a few of the <a href="https://www.tomsguide.com/round-up/best-android-games">best Android games</a> that let you play at a higher 120Hz or 144Hz, or on the Astra 2, which has an 185Hz refresh rate. Given I’m more of a PC gamer, though, RedMagic’s Astra 2 has another really cool trick up its sleeve.</p><h2 id="a-tablet-sized-console">A tablet-sized console</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uuHGGDFpnjRVf5yFp8bEDk" name="Red Magic Astra 2--6" alt="The RedMagic Astra 2 gaming tablet connected to a monitor over USB-C" src="https://cdn.mos.cms.futurecdn.net/uuHGGDFpnjRVf5yFp8bEDk-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Astra 2 is nothing if not a highly versatile gaming tablet. Sure, you can play all the most demanding Android games, from Zenless Zone Zero and Wuthering Waves to Genshin Impact and Fortnite, with ease and all the settings turned up. However, that’s far from your only way to play.</p><p>Just like how you can dock the Nintendo Switch 2, if you have one of the <a href="https://www.tomsguide.com/best-picks/best-monitors">best monitors</a> with USB-C in, you can get a one-cable, big-screen gaming experience with the Astra 2. Likewise, with a device like the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-tried-genkis-covert-dock-3-with-the-nintendo-switch-2-and-it-beats-the-official-dock-for-one-key-reason">Genki Covert Dock 3</a>, you can connect the tablet to a TV.</p><div ><table><caption>Performance benchmarks</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p>RedMagic Astra 2</p></td><td  ><p>iPad mini 7</p></td><td  ><p>Lenovo Tab Gen 2</p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6 score (single-core / multi-core)</strong></p></td><td  ><p>3771 / 11979</p></td><td  ><p>2888 / 7113</p></td><td  ><p>1125 / 3417 </p></td></tr><tr><td class="firstcol " ><p><strong>3DMark Wild Life Extreme Unlimited (score/fps)</strong></p></td><td  ><p>7993 / 47.87</p></td><td  ><p>2863 / 17.1</p></td><td  ><p>1063 / 6.37</p></td></tr></tbody></table></div><p>With the Astra 2 connected to my Innova CB32U1 monitor, I toggled the Astra 2’s Competitive Key and got a full-fledged game launcher on my display, and I could also use the tablet simultaneously. All of the games you have installed appear in RedMagic’s Game Space, and you can also stream games from your PC or consoles using their respective remote play apps.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="aK7JJU4VwExS9eAXgyCGf3" name="Red Magic Astra 2--4" alt="A person holding the RedMagic Astra 2 showing off all of the compatible PC games via emulation in RedMagic's GameHub app" src="https://cdn.mos.cms.futurecdn.net/aK7JJU4VwExS9eAXgyCGf3-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Although it didn’t come pre-installed on my review unit, I was able to get the full AAA experience locally after downloading RedMagic’s GameHub app. That’s right, with GameHub installed and your Steam or Epic Games account linked, you can play many of the <a href="https://www.tomsguide.com/best-picks/best-PC-games">best PC games</a> via emulation directly on your Android tablet.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DfcMbyjPuSvLuKEBro62R8" name="Red Magic Astra 2--5" alt="A person holding a controller in front of the RedMagic Astra 2 gaming tablet running the PC version of Portal 2 using emulation" src="https://cdn.mos.cms.futurecdn.net/DfcMbyjPuSvLuKEBro62R8-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I loaded up a few and played my go-to game, the skateboarding sim Session, along with Valve’s Portal 2 at 50–60 fps without having to turn down their settings too much. The experience wasn’t perfect, and getting to the main menu in Metro Exodus took much longer than I expected. Still, being able to play the PC games you already own on your Android tablet is much better than being limited to mobile games, especially when big ports like Resident Evil 4 or Death Stranding are only available on Apple’s iPadOS.</p><h3 class="article-body__section" id="section-redmagic-astra-2-the-downs"><span>RedMagic Astra 2: The Downs</span></h3><p>The Astra 2 is an impressive Android tablet that easily rivals Apple’s iPad mini, but it’s not without its downsides. From a very premium price for a smaller tablet to a USB-C port that isn’t quite in the right place, there are certainly some kinks RedMagic needs to iron out before a potential follow-up. </p><h2 id="full-featured-but-off-center">Full-featured but off-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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="iExr2zxN6EQVx698CfVU7C" name="Red Magic Astra 2--13" alt="The centered, secondary USB-C port on the RedMagic Astra 2 gaming tablet" src="https://cdn.mos.cms.futurecdn.net/iExr2zxN6EQVx698CfVU7C-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Two is always better than one, and that’s especially true for USB-C ports on a device like the Astra 2. That way, you can play and charge at the same time or even use a wired keyboard and mouse while emulating PC games in the GameHub app. However, there’s just one problem: these dual USB-C ports aren’t identical.</p><p>While the USB-C port on the right side of the Astra 2 is a 3.2 Gen 2 port with DisplayPort out, the one on the underside of the tablet is a slower, less capable USB 2.0 port. Normally, this wouldn’t be a problem, and on my <a href="https://www.tomsguide.com/computing/tablets/i-thought-the-ipad-mini-was-the-perfect-small-tablet-until-i-tried-the-lenovo-legion-tab-3-heres-why">Lenovo Legion Tab Gen 3</a> with an identical dual-port setup, it isn’t. However, the Astra 2’s more powerful USB-C port is located in a very awkward place.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JSH9rKKEuZdbZvcmQumT2G" name="Red Magic Astra 2--7" alt="The RedMagic Astra 2 gaming tablet with the Razer Kishi Ultra telescoping controller attached on either side" src="https://cdn.mos.cms.futurecdn.net/JSH9rKKEuZdbZvcmQumT2G-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Now that many of the <a href="https://www.tomsguide.com/best-picks/best-mobile-game-controllers">best mobile game controllers</a> support smaller tablets like the Astra 2 or iPad mini, my first instinct was to attach one on either side of RedMagic’s tablet. </p><p>Unfortunately, instead of being centered, the more powerful USB-C port is located above the speaker grille on the right side. With my <a href="https://www.tomsguide.com/gaming/i-built-the-ultimate-remote-play-setup-with-wi-fi-7-to-say-goodbye-to-stuttery-gameplay-for-good-heres-how">Razer Kishi Ultra</a> connected, a good portion of the Astra 2 hangs below the controller, similar to the screen lip on the <a href="https://www.tomsguide.com/gaming/handheld-gaming/msi-claw-8-ex-ai-plus-review">MSI Claw 8 EX AI+</a>. However, while that handheld gaming PC’s screen extends slightly, almost half of the Astra 2’s display was positioned below my telescopic controller.</p><p>You see similar setups when people try to put a telescopic game controller on one of the <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldable phones</a>. I just never expected to have to deal with something like this on a tablet specifically made for gaming — and mobile gaming at that.</p><h2 id="a-steep-investment-without-the-extras">A steep investment without the extras</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Ng6tAYcSK8XVA7CSu7SSYL" name="Red Magic Astra 2--3" alt="A person reading the Tom's Guide homepage on the RedMagic Astra 2 gaming tablet" src="https://cdn.mos.cms.futurecdn.net/Ng6tAYcSK8XVA7CSu7SSYL-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>At $699 for the base model or $799 for the version with 16GB of RAM and 512GB of storage, the Astra 2 is certainly a premium Android tablet. If mobile gaming is your thing and you want to play on a larger screen, or if you want a very future-proof tablet, the Astra 2 could be worth it.</p><p>After paying $549 for the Legion Tab Gen 3 back in 2025, before <a href="https://www.tomsguide.com/computing/ram-price-crisis-2026-everything-you-need-to-know">RAMageddon</a> hit, it makes sense that RedMagic had to raise the price of the Astra 2. With components getting more expensive, launching it at $499 for the base model, as the company did with the Astra 1, no longer makes sense.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jkEFTroXhZSacLbJaPfLSP" name="Red Magic Astra 2--14" alt="The RedMagic Astra 2 gaming tablet unboxed on a table" src="https://cdn.mos.cms.futurecdn.net/jkEFTroXhZSacLbJaPfLSP-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>What surprised me, though, was how little was in the box. Of course, I got the tablet itself and a charging cable, but I was disappointed I didn’t find any other extras beyond a few stickers. For comparison, the Legion Tab Gen 3 included a folio case with a removable magnetic front cover and a glass screen protector.</p><p>Apparently, Lenovo has also become a bit more stringent with included freebies in the Tab Gen 5, likely to keep costs down. Still, I would have loved to see a case with a built-in stand included with the Astra 2, especially since you can’t comfortably use a mobile game controller with it because of that off-center USB-C port.</p><h3 class="article-body__section" id="section-redmagic-astra-2-verdict"><span>RedMagic Astra 2: Verdict</span></h3><p>The RedMagic Astra 2 is certainly an outlier among Android tablets. For starters, it has a compact, portable 9-inch design with true flagship power under the hood. Its 185Hz OLED display makes whatever content you’re watching or playing stand out in the best way. You also get dual USB-C ports and a fingerprint scanner integrated directly into its power button for secure, seamless logins.</p><p>While the off-center, full-featured USB-C port is a bit of a bummer, along with the Astra 2’s higher price, the device still feels exceptionally premium in hand. Still, I would have loved to have a case in the box and for RedMagic to work out a few of the kinks in its proprietary Android launcher.</p><p>If you want the versatility of a tablet that’s also highly portable and a gaming experience that’s almost on par with one of the <a href="https://www.tomsguide.com/round-up/best-handheld-gaming-consoles">best PC handhelds</a>, the Astra 2 can’t be beat. It’s one of the <a href="https://www.tomsguide.com/best-picks/best-android-tablets">best Android tablets</a> I’ve tried yet, and while using it, I didn’t miss my iPad mini at all.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ We awarded the Lenovo Tab Plus Gen 2 best tablet of the year — and you can buy it for $110 off right now ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Let’s be honest, it’s hard to get excited about Android tablets when you can get an iPad instead. However, one slate rose above the rest in 2026 and truly stands out — so much so that we awarded it the best tablet in our <a href="https://www.tomsguide.com/computing/toms-guide-awards-2026">Tom’s Guide Computing Awards</a>. Which tablet is that? The Lenovo Tab Plus Gen 2, which is on sale at a nice discount.</p><p>Right now, <a href="https://www.lenovo.com/us/en/p/tablets/android-tablets/lenovo-tab-series/lenovo-tab-plus-gen-2-12.1-inch-mediatek/zaht0078us" target="_blank" rel="nofollow">you can get the Lenovo Tab Plus Gen 2 for $289 at Lenovo</a>. This tablet typically retails for $399, so you’re saving $110. The big deal here, and I mean that quite literally, is the enormous back speaker that delivers loud, punchy sound for a tablet. Its rotatable built-in kickstand is also noteworthy. Read on to see why you should consider buying the Lenovo Tab Plus Gen 2. (For more deals, check out our guide to the <a href="https://www.tomsguide.com/computing/tablets/best-tablet-sales-and-deals">best tablet sales</a>). </p><ul><li><strong></strong><a href="https://www.amazon.com/deals" target="_blank" rel="nofollow"><strong>shop all early Prime Day deals</strong></a><strong></strong></li></ul><div class="product"><a data-dimension112="6a0c7608-b850-11f1-be1c-8f2ce6f076da" data-action="Deal Block" data-label="Tab Plus Gen 2" data-dimension48="Tab Plus Gen 2" data-dimension25="$289" href="https://www.lenovo.com/us/en/p/tablets/android-tablets/lenovo-tab-series/lenovo-tab-plus-gen-2-12.1-inch-mediatek/zaht0078us" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:604px;"><p class="vanilla-image-block" style="padding-top:75.17%;"><img id="FGrhe3k8vbpgSXv4VUWuB7" name="Lenovo Tab Plus Gen 2 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/FGrhe3k8vbpgSXv4VUWuB7-1920-80.jpg" mos="" align="middle" fullscreen="" width="604" height="454" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Lenovo Tab Plus Gen 2 easily won best tablet in our Tom's Guide Awards since it delivers loud and punchy sound thanks to its enormous JBL-9 speaker. It's also great for watching videos and reading, thanks to its sharp and bright 12.1-inch 2.5K 2560 x 1600 multitouch 120Hz display. Inside, it packs a MediaTek Dimensity 7400 CPU and 8GB of RAM, which is just powerful enough to easily handle streaming content.<a class="view-deal button" href="https://www.lenovo.com/us/en/p/tablets/android-tablets/lenovo-tab-series/lenovo-tab-plus-gen-2-12.1-inch-mediatek/zaht0078us" target="_blank" rel="nofollow" data-dimension112="6a0c7608-b850-11f1-be1c-8f2ce6f076da" data-action="Deal Block" data-label="Tab Plus Gen 2" data-dimension48="Tab Plus Gen 2" data-dimension25="$289">View Deal</a></p></div><p>While it’s not entirely fair to call this a speaker with a tablet attached, it also wouldn’t be inaccurate, since that huge JBL-9 unit speaker is the main reason you’d want to buy this tablet. There are 9 built-in speakers: four tweeters, three woofers, and two passive radiators. Those last two speakers deliver deep bass, while the tweeters handle higher-frequency sounds. As a result, movies, podcasts, and music sound vibrant. You can even use Lenovo’s tablet as a Bluetooth speaker, which is a nice bonus.</p><p>Then there’s the built-in kickstand, which attaches directly to the speaker. It can rotate 360 degrees clockwise or counterclockwise, letting you orient the tablet horizontally when watching movies or vertically for reading. The kickstand is made of aluminum, like the rest of the tablet, so it stays firmly in place once you’ve set it up. This is easily the best kickstand I’ve seen for a tablet.</p><p>While the big speaker is the main draw, this is still a tablet. The 12.1-inch (2560 x 1600) display delivers sharp, bright, and colorful image quality, despite not being an OLED panel. Color reproduction is generally oversaturated, which accounts for the vivid colors. Those colors truly stand out thanks to the bright SDR and HDR brightness. </p><p>The Lenovo Tab Plus Gen 2 isn’t the most powerful tablet out there, but if you just want an entertainment-focused slab with strong picture quality and exceptional speakers, get this one now while the deal lasts.</p><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=tablets&min_discount_ratio=0.95&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="8">8 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const finalHref = cardLink.href || cardLink.getAttribute('href') || '';                let actualRevenueId = cardLink.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = this.getRowsLimit();          } else {             this.displayLimit += this.getRowsLimit();          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: this.decodeHTML(item.name || item.title || item.model_name || item.product_name || 'Unknown Product'),            brand: this.decodeHTML(item.brand || ''),            productName: this.decodeHTML(item.model_name || item.product_name || item.name || ''),            merchant: this.decodeHTML(item.merchant_name || item.merchant || item.retailer || 'Retailer'),            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const finalHref = btn.href || btn.getAttribute('href') || '';                let actualRevenueId = btn.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += this.getRowsLimit();                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');               document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/android-tablets/we-awarded-the-lenovo-tab-plus-gen-2-best-tablet-of-the-year-and-you-can-buy-it-for-usd110-off-right-now</link>
                                                                            <description>
                            <![CDATA[ The Lenovo Tab Plus Gen 2 won best tablet of the year in our Tom's Guide Awards — and you can buy it for $110 off right now. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">c6CU39HFgqT399f2u5iZsL</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/y9boS3APcra7jAywyJKcsR-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 24 Sep 2026 20:16:54 +0000</pubDate>                                                                                                                                <updated>Fri, 02 Oct 2026 13:14:47 +0000</updated>
                                                                                                                                            <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                <author><![CDATA[ tony.polanco@futurenet.com (Tony Polanco) ]]></author>                    <dc:creator><![CDATA[ Tony Polanco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/atzRNqFt5wYgEUPBDahWsD-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/y9boS3APcra7jAywyJKcsR-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Lenovo Tab Plus Gen 2]]></media:description>                                                            <media:text><![CDATA[Lenovo Tab Plus Gen 2]]></media:text>
                                <media:title type="plain"><![CDATA[Lenovo Tab Plus Gen 2]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/y9boS3APcra7jAywyJKcsR-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Let’s be honest, it’s hard to get excited about Android tablets when you can get an iPad instead. However, one slate rose above the rest in 2026 and truly stands out — so much so that we awarded it the best tablet in our <a href="https://www.tomsguide.com/computing/toms-guide-awards-2026">Tom’s Guide Computing Awards</a>. Which tablet is that? The Lenovo Tab Plus Gen 2, which is on sale at a nice discount.</p><p>Right now, <a href="https://www.lenovo.com/us/en/p/tablets/android-tablets/lenovo-tab-series/lenovo-tab-plus-gen-2-12.1-inch-mediatek/zaht0078us" target="_blank" rel="nofollow">you can get the Lenovo Tab Plus Gen 2 for $289 at Lenovo</a>. This tablet typically retails for $399, so you’re saving $110. The big deal here, and I mean that quite literally, is the enormous back speaker that delivers loud, punchy sound for a tablet. Its rotatable built-in kickstand is also noteworthy. Read on to see why you should consider buying the Lenovo Tab Plus Gen 2. (For more deals, check out our guide to the <a href="https://www.tomsguide.com/computing/tablets/best-tablet-sales-and-deals">best tablet sales</a>). </p><ul><li><strong></strong><a href="https://www.amazon.com/deals" target="_blank" rel="nofollow"><strong>shop all early Prime Day deals</strong></a><strong></strong></li></ul><div class="product"><a data-dimension112="6a0c7608-b850-11f1-be1c-8f2ce6f076da" data-action="Deal Block" data-label="Tab Plus Gen 2" data-dimension48="Tab Plus Gen 2" data-dimension25="$289" href="https://www.lenovo.com/us/en/p/tablets/android-tablets/lenovo-tab-series/lenovo-tab-plus-gen-2-12.1-inch-mediatek/zaht0078us" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:604px;"><p class="vanilla-image-block" style="padding-top:75.17%;"><img id="FGrhe3k8vbpgSXv4VUWuB7" name="Lenovo Tab Plus Gen 2 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/FGrhe3k8vbpgSXv4VUWuB7-1920-80.jpg" mos="" align="middle" fullscreen="" width="604" height="454" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Lenovo Tab Plus Gen 2 easily won best tablet in our Tom's Guide Awards since it delivers loud and punchy sound thanks to its enormous JBL-9 speaker. It's also great for watching videos and reading, thanks to its sharp and bright 12.1-inch 2.5K 2560 x 1600 multitouch 120Hz display. Inside, it packs a MediaTek Dimensity 7400 CPU and 8GB of RAM, which is just powerful enough to easily handle streaming content.<a class="view-deal button" href="https://www.lenovo.com/us/en/p/tablets/android-tablets/lenovo-tab-series/lenovo-tab-plus-gen-2-12.1-inch-mediatek/zaht0078us" target="_blank" rel="nofollow" data-dimension112="6a0c7608-b850-11f1-be1c-8f2ce6f076da" data-action="Deal Block" data-label="Tab Plus Gen 2" data-dimension48="Tab Plus Gen 2" data-dimension25="$289">View Deal</a></p></div><p>While it’s not entirely fair to call this a speaker with a tablet attached, it also wouldn’t be inaccurate, since that huge JBL-9 unit speaker is the main reason you’d want to buy this tablet. There are 9 built-in speakers: four tweeters, three woofers, and two passive radiators. Those last two speakers deliver deep bass, while the tweeters handle higher-frequency sounds. As a result, movies, podcasts, and music sound vibrant. You can even use Lenovo’s tablet as a Bluetooth speaker, which is a nice bonus.</p><p>Then there’s the built-in kickstand, which attaches directly to the speaker. It can rotate 360 degrees clockwise or counterclockwise, letting you orient the tablet horizontally when watching movies or vertically for reading. The kickstand is made of aluminum, like the rest of the tablet, so it stays firmly in place once you’ve set it up. This is easily the best kickstand I’ve seen for a tablet.</p><p>While the big speaker is the main draw, this is still a tablet. The 12.1-inch (2560 x 1600) display delivers sharp, bright, and colorful image quality, despite not being an OLED panel. Color reproduction is generally oversaturated, which accounts for the vivid colors. Those colors truly stand out thanks to the bright SDR and HDR brightness. </p><p>The Lenovo Tab Plus Gen 2 isn’t the most powerful tablet out there, but if you just want an entertainment-focused slab with strong picture quality and exceptional speakers, get this one now while the deal lasts.</p><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=tablets&min_discount_ratio=0.95&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="8">8 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const finalHref = cardLink.href || cardLink.getAttribute('href') || '';                let actualRevenueId = cardLink.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = this.getRowsLimit();          } else {             this.displayLimit += this.getRowsLimit();          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: this.decodeHTML(item.name || item.title || item.model_name || item.product_name || 'Unknown Product'),            brand: this.decodeHTML(item.brand || ''),            productName: this.decodeHTML(item.model_name || item.product_name || item.name || ''),            merchant: this.decodeHTML(item.merchant_name || item.merchant || item.retailer || 'Retailer'),            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const finalHref = btn.href || btn.getAttribute('href') || '';                let actualRevenueId = btn.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += this.getRowsLimit();                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');               document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I used this Android tablet for three weeks — and its giant speaker has spoiled me ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Lenovo Tab Plus Gen 2 ($399) is the most unique tablet I’ve ever reviewed. It delivers exceptional sound thanks to the enormous JBL-9 speaker on its back. You could be forgiven for thinking it’s a speaker with a tablet attached! This is the most defining feature, but there’s more to like about Lenovo’s entertainment-focused tablet.</p><p>The bright, colorful 12.1-inch 2K display is ideal for watching your favorite videos and movies. The Tab Plus Gen 2 is also great for reading and web browsing. The large speaker can make the tablet uncomfortable to hold for too long, but the handy built-in kickstand balances that out, and you can rotate it for vertical or horizontal viewing.</p><p>If you’re looking for a powerful tablet for work, this slate isn’t for you, thanks to its relatively weak MediaTek Dimensity CPU and 8GB of RAM. But if you’re looking for an excellent entertainment machine with the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablet</a> sound, you should seriously consider the reasonably priced Lenovo Tab Plus Gen 2. Find out more in my full review!</p><h3 class="article-body__section" id="section-lenovo-tab-plus-gen-2-review-cheat-sheet"><span>Lenovo Tab Plus Gen 2 review: Cheat sheet</span></h3><ul><li><strong>What is it?</strong> The Lenovo Tab Plus Gen 2 is an Android tablet built for entertainment.</li><li><strong>Who is it for?</strong> For folks who want a tablet to watch videos and that can deliver stellar, punchy sound.</li><li><strong>What does it cost?</strong> The Lenovo Tab Plus Gen 2 is typically $399 but is often discounted. At the time of writing, it’s on sale for $289 on <a href="https://www.lenovo.com/us/en/p/tablets/android-tablets/lenovo-tab-series/lenovo-tab-plus-gen-2-12.1-inch-mediatek/len103l0038" target="_blank" rel="nofollow">Lenovo’s website</a>.</li><li><strong>What do we like?</strong> We like the giant speaker that pumps out phenomenal sound, the handy kickstand, and the vivid 2.5K display.</li><li><strong>What don’t we like?</strong> We don’t like that the tablet can be cumbersome to hold for long periods and that its performance isn’t suitable for productivity.</li></ul><h3 class="article-body__section" id="section-lenovo-tab-plus-gen-2-review-specs"><span>Lenovo Tab Plus Gen 2 review: Specs</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Lenovo Tab Plus Gen 2</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$399</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>12.1-inch 2.5K (2560 x 1600), Multi-Touch, 120Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Chip</strong></p></td><td  ><p>MediaTek Dimensity 7400 Processor</p></td></tr><tr><td class="firstcol " ><p><strong>Memory</strong></p></td><td  ><p>8GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>128GB </p></td></tr><tr><td class="firstcol " ><p><strong>Cameras</strong></p></td><td  ><p>Front: 8MP, fixed focus | Rear: 13MP, autofocus</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>WIFI 6 & Bluetooth 5.4</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>USB-C 2.0 </p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Celestial White </p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>7.13 × 10.98 × 0.27 inches (with speaker bump 0.89 inches)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>1.69 pounds</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-lenovo-tab-plus-gen-2-review-the-ups"><span>Lenovo Tab Plus Gen 2 review: The ups</span></h3><p>The Tab Plus Gen 2's giant speaker and rotatable kickstand instantly draw attention, but it also features a sharp, vibrant 12.1-inch display and long-lasting battery life.</p><h2 id="incredible-speaker-sound">Incredible speaker sound</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="s2wFLhTXzEQFnNSaJ6WifV" name="Lenovo Tab Plus Gen 2--7" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/s2wFLhTXzEQFnNSaJ6WifV-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Speaker quality is, at best, a footnote in my tablet reviews, since slates generally produce less-than-stellar sound. With the Tab Plus Gen 2, this is the first thing I want to discuss as it’s the standout feature—so much so that I had already written an entire piece about how <a href="https://www.tomsguide.com/computing/android-tablets/the-gargantuan-speaker-on-this-android-tablet-isnt-a-gimmick-i-cant-believe-how-good-it-sounds">the gargantuan speaker on this Android tablet isn’t a gimmick</a>. If you’ll pardon the cliché, the speaker quality is music to your ears.</p><p>The JBL 9-Unit Pro speaker system is what makes the magic happen. As its name suggests, there are nine speakers: four tweeters, three woofers, and two passive radiators. Those last two speakers deliver deep bass, while the tweeters handle higher-frequency sounds.</p><p>Sound is great out of the box, but to make everything truly sound spectacular, you’ll need to head into the Dolby Atmos sub-menu in sound settings. There are three presets: Dynamic, which identifies the content and automatically adjusts for the best sound; Movie, which provides surround sound and clearer dialogue; and Music, which delivers detailed audio so every note and beat sounds punchy. Music also has presets: Detailed, Balanced, and Warm, plus a manual equalizer.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6xyjQgcGqcDSf37WzdYcLS" name="Lenovo Tab Plus Gen 2--14" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/6xyjQgcGqcDSf37WzdYcLS-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I’m a hard rock and heavy metal fan, and I’m almost always disappointed by the thin, flat sound from most tablets when listening to these genres. That wasn’t the case here, as everything from death metal bands like Amon Amarth to ‘80s tunes like Stan Bush’s “The Touch” sounded rich, punchy, and loud. Movies and podcasts also sound incredible in Movie Mode, with dialogue coming through clear and crisp.</p><p>The presets let you quickly enjoy whatever you’re listening to, but you can also dive into the equalizer settings to truly fine-tune how things sound. Regardless, your ears won’t be disappointed.</p><h2 id="built-in-rotatable-kickstand">Built-in, rotatable kickstand</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jBcfo7ASZyZNEDrkSbzXPc" name="Lenovo Tab Plus Gen 2--6" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/jBcfo7ASZyZNEDrkSbzXPc-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The other notable design feature is the built-in kickstand. Attached directly to the speaker, the kickstand can rotate 360 degrees clockwise or counterclockwise. This lets you comfortably orient the slate horizontally when watching movies or vertically for reading.</p><p>While the rotating kickstand moves smoothly, it firmly stays in place once you’ve set it to your preferred position. And when you’re ready to travel with the slate, the kickstand snaps back into place when you push it inward. This might be a minor thing to some, but rotating the kickstand is also enjoyable since you can feel small bumps along the way.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mBdjAqrqHxTHxpoYSfYKBb" name="Lenovo Tab Plus Gen 2--3" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/mBdjAqrqHxTHxpoYSfYKBb-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I enjoy reading digital comics, so I love propping the tablet up on my table in portrait orientation so I don’t have to hold it while I read. The 16:9 aspect ratio is relatively close to a real comic’s trim size, which also helps. Naturally, this is also a great way to read books.</p><p>Like the kickstand, the tablet is made of sturdy aluminum that doesn’t bend or flex easily. Even if you won’t hold the tablet very often (more on why shortly), its smooth metal body feels nice against your fingers. I also like how the concave volume and power buttons are on the back and easy to reach when it’s in the horizontal position.</p><h2 id="vivid-display-2">Vivid display</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4Y6NTp4SSit5mg8Zx3DDdj" name="Lenovo Tab Plus Gen 2--15" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/4Y6NTp4SSit5mg8Zx3DDdj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The 12.1-inch (2560 x 1600) display on the Tab Plus Gen 2 might not stand out as much as the huge speaker, but it’s also no slouch. Even without an OLED panel, you get sharp image quality that’s bright and colorful.</p><p>When watching the latest trailer for the Street Fighter movie, I was impressed by how good everything looked. The detail and colors on the costumes and super moves pop. And thanks to the smooth 120Hz refresh rate, all the action moved smoothly. For watching movies, TV shows, and other videos, this display gets the job done.</p><div ><table><caption>Display benchmark results</caption><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Lenovo Tab Plus Gen 2</strong></p></th><th  ><p><strong>Apple iPad (11th gen)</strong></p></th><th  ><p><strong>OnePlus Pad Go 2</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Nits (brightness)</strong></p></td><td  ><p>597 (SDR) | 776 (HDR)</p></td><td  ><p>506 (SDR) | 496 (HDR)</p></td><td  ><p>544 (SDR) | 554 (HDR)</p></td></tr><tr><td class="firstcol " ><p><strong>sRGB</strong></p></td><td  ><p>157.5%</p></td><td  ><p>108.8%</p></td><td  ><p>159.6%</p></td></tr><tr><td class="firstcol " ><p><strong>DCI-P3</strong></p></td><td  ><p>111.5%</p></td><td  ><p>77.1%</p></td><td  ><p>113.1%</p></td></tr><tr><td class="firstcol " ><p><strong>Delta-E</strong></p></td><td  ><p>0.25</p></td><td  ><p>0.30</p></td><td  ><p>0.29</p></td></tr></tbody></table></div><p>Our lab test confirms what my eyes saw. Color reproduction (sRGB and DCI-P3) is generally oversaturated, which accounts for the vivid colors. Color accuracy (Delta-E) is also on par with other tablets. Those colors truly stand out thanks to the bright SDR and HDR brightness.</p><p>As you can see, Lenovo’s tablet quite literally outshines Apple’s iPad 11 and the OnePlus Pad Go 2 in both SDR and HDR brightness with adaptive brightness disabled. In fairness to the iPad, it delivers more natural hues than both Android tablets, since its sRGB and DCI-P3 values are closer to the 100% target.</p><h2 id="epic-battery-life">Epic battery life</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8ME6jXoWftuZc8mWxdG2z4" name="Lenovo Tab Plus Gen 2--9" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/8ME6jXoWftuZc8mWxdG2z4-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you’re going to spend hours watching videos, then you’ll want a tablet that can last for the long haul. Thankfully, that’s the case here, as the Tab Plus Gen 2 offers astonishing battery life.</p><div ><table><caption>Battery life results</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Time (hours:mins)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Lenovo Tab Gen 2</strong></p></td><td  ><p>16:00 (60Hz) | 13:39 (120Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Apple iPad (11th gen)</strong></p></td><td  ><p>11:25</p></td></tr><tr><td class="firstcol " ><p><strong>OnePlus Pad Go 2</strong></p></td><td  ><p>16:39</p></td></tr></tbody></table></div><p>In our battery test, which involved continuous web surfing over Wi-Fi with the display set to 150 nits of brightness, Lenovo’s slate lasted 16 hours at 60Hz and 13 hours and 39 minutes at 120Hz. While the OnePlus Pad Go 2 lasted almost 40 minutes longer, Lenovo’s tablet outlasted the iPad by nearly four and a half hours.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GQbFxdJu3aWa23MSAettaj" name="Lenovo Tab Plus Gen 2--5" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/GQbFxdJu3aWa23MSAettaj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I should note that the Tab Plus Gen 2 takes a while to fully charge. In our testing and in my own experience, it took 30 minutes to charge the tablet to 20%. Though you won’t have to charge the battery very often, just keep in mind that you’ll have to wait a while to fully juice it up.</p><h3 class="article-body__section" id="section-lenovo-tab-plus-gen-2-review-the-downs"><span>Lenovo Tab Plus Gen 2 review: The Downs</span></h3><p>While the Tab Plus Gen 2 excels as an entertainment device, it falls short in some key areas.</p><h2 id="awkward-to-hold">Awkward to hold</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4KoEVhPEhMiTtH4rdM25MB" name="Lenovo Tab Plus Gen 2--17" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/4KoEVhPEhMiTtH4rdM25MB-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The giant JBL speaker is the Tab Plus Gen 2’s main selling point, but it can also be a hindrance.</p><p>Because the speaker adds bulk to the tablet’s bottom, holding the slate like a traditional tablet can be burdensome. While 1.69 pounds doesn’t sound that heavy, the weight distribution makes the tablet feel heavier.</p><p>If you rest the tablet on your lap or use the kickstand to prop it up on your desk, then its weight won’t be an issue. However, this isn’t a slate you can easily hold with one hand, let alone two, for long periods.</p><h2 id="basic-performance">Basic performance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="sNWTzap4AUU9CAxYmzq9mH" name="Lenovo Tab Plus Gen 2--4" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/sNWTzap4AUU9CAxYmzq9mH-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I don’t consider this a major drawback since this is an entertainment-focused tablet. Still, if you plan to do serious work on the Tab Plus Gen 2, you might not get the smoothest or fastest experience because of its lackluster performance.</p><p>The Tab Plus Gen 2 handles basic tasks like scrolling websites in Google Chrome and reading books on Kindle without issue. However, when I opened multiple apps or Chrome tabs, performance suffered. If I wanted to use this for work, where I typically have 20 to 30 Chrome tabs open, I wouldn't have the smoothest experience.</p><div ><table><caption>Performance benchmarks</caption><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Lenovo Tab Gen 2</strong></p></th><th  ><p><strong>Apple iPad (11th gen)</strong></p></th><th  ><p><strong>OnePlus Pad Go 2</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Geekbench 6 score (single-core / multi-core) </strong></p></td><td  ><p>1125 / 3417</p></td><td  ><p>2589 / 6176</p></td><td  ><p>1013 / 3081</p></td></tr><tr><td class="firstcol " ><p><strong>3DMark Wild Life Extreme Unlimited (score/fps) </strong></p></td><td  ><p>1063 / 6.37</p></td><td  ><p>2623 / 15.70</p></td><td  ><p>863 / 5.17</p></td></tr></tbody></table></div><p>While the Tab Gen 2 matches the <a href="https://www.tomsguide.com/tablets/android-tablets/oneplus-pad-2-review">OnePlus Pad Go 2</a> in both CPU performance (Geekbench 6) and gaming performance (3DMark), these MediaTek Dimensity-powered Android tablets still can’t compete with Apple’s entry-level iPad.</p><p>Again, you won’t have a sluggish experience when using this tablet for its intended purpose. Just keep your expectations in check if you try to run heavier workloads or graphically demanding video games.</p><h3 class="article-body__section" id="section-lenovo-tab-plus-gen-2-review-verdict"><span>Lenovo Tab Plus Gen 2 review: Verdict</span></h3><p>I’m an iPad Pro user, so an Android tablet truly has to go above and beyond to impress me. And that’s exactly what the Lenovo Tab Plus Gen 2 has done thanks to its amazing sound quality, versatile kickstand, and crisp image quality.</p><p>Sure, it’s not powerful for heavy workloads, but if you mostly watch videos or read, this tablet has everything you’d need. The fact that it tops out at $399 is just icing on the proverbial cake. If you’re looking for an iPad alternative for your entertainment needs, don’t ignore the Lenovo Tab Plus Gen 2.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/tablets/lenovo-tab-plus-gen-2-review</link>
                                                                            <description>
                            <![CDATA[ The Lenovo Tab Plus Gen 2 delivers exceptional sound thanks to its enormous speaker. It's a great, reasonably priced, entertainment-focused tablet overall. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">FKZUjK3Q4sv5PzHmNtSqaJ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/h8Rsjf4PfGip98fuWVXp5M-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 13 Sep 2026 12:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                <author><![CDATA[ tony.polanco@futurenet.com (Tony Polanco) ]]></author>                    <dc:creator><![CDATA[ Tony Polanco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/atzRNqFt5wYgEUPBDahWsD-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/h8Rsjf4PfGip98fuWVXp5M-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Lenovo Tab Plus Gen 2]]></media:description>                                                            <media:text><![CDATA[Lenovo Tab Plus Gen 2]]></media:text>
                                <media:title type="plain"><![CDATA[Lenovo Tab Plus Gen 2]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/h8Rsjf4PfGip98fuWVXp5M-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Lenovo Tab Plus Gen 2 ($399) is the most unique tablet I’ve ever reviewed. It delivers exceptional sound thanks to the enormous JBL-9 speaker on its back. You could be forgiven for thinking it’s a speaker with a tablet attached! This is the most defining feature, but there’s more to like about Lenovo’s entertainment-focused tablet.</p><p>The bright, colorful 12.1-inch 2K display is ideal for watching your favorite videos and movies. The Tab Plus Gen 2 is also great for reading and web browsing. The large speaker can make the tablet uncomfortable to hold for too long, but the handy built-in kickstand balances that out, and you can rotate it for vertical or horizontal viewing.</p><p>If you’re looking for a powerful tablet for work, this slate isn’t for you, thanks to its relatively weak MediaTek Dimensity CPU and 8GB of RAM. But if you’re looking for an excellent entertainment machine with the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablet</a> sound, you should seriously consider the reasonably priced Lenovo Tab Plus Gen 2. Find out more in my full review!</p><h3 class="article-body__section" id="section-lenovo-tab-plus-gen-2-review-cheat-sheet"><span>Lenovo Tab Plus Gen 2 review: Cheat sheet</span></h3><ul><li><strong>What is it?</strong> The Lenovo Tab Plus Gen 2 is an Android tablet built for entertainment.</li><li><strong>Who is it for?</strong> For folks who want a tablet to watch videos and that can deliver stellar, punchy sound.</li><li><strong>What does it cost?</strong> The Lenovo Tab Plus Gen 2 is typically $399 but is often discounted. At the time of writing, it’s on sale for $289 on <a href="https://www.lenovo.com/us/en/p/tablets/android-tablets/lenovo-tab-series/lenovo-tab-plus-gen-2-12.1-inch-mediatek/len103l0038" target="_blank" rel="nofollow">Lenovo’s website</a>.</li><li><strong>What do we like?</strong> We like the giant speaker that pumps out phenomenal sound, the handy kickstand, and the vivid 2.5K display.</li><li><strong>What don’t we like?</strong> We don’t like that the tablet can be cumbersome to hold for long periods and that its performance isn’t suitable for productivity.</li></ul><h3 class="article-body__section" id="section-lenovo-tab-plus-gen-2-review-specs"><span>Lenovo Tab Plus Gen 2 review: Specs</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Lenovo Tab Plus Gen 2</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$399</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>12.1-inch 2.5K (2560 x 1600), Multi-Touch, 120Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Chip</strong></p></td><td  ><p>MediaTek Dimensity 7400 Processor</p></td></tr><tr><td class="firstcol " ><p><strong>Memory</strong></p></td><td  ><p>8GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>128GB </p></td></tr><tr><td class="firstcol " ><p><strong>Cameras</strong></p></td><td  ><p>Front: 8MP, fixed focus | Rear: 13MP, autofocus</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>WIFI 6 & Bluetooth 5.4</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>USB-C 2.0 </p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Celestial White </p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>7.13 × 10.98 × 0.27 inches (with speaker bump 0.89 inches)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>1.69 pounds</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-lenovo-tab-plus-gen-2-review-the-ups"><span>Lenovo Tab Plus Gen 2 review: The ups</span></h3><p>The Tab Plus Gen 2's giant speaker and rotatable kickstand instantly draw attention, but it also features a sharp, vibrant 12.1-inch display and long-lasting battery life.</p><h2 id="incredible-speaker-sound">Incredible speaker sound</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="s2wFLhTXzEQFnNSaJ6WifV" name="Lenovo Tab Plus Gen 2--7" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/s2wFLhTXzEQFnNSaJ6WifV-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Speaker quality is, at best, a footnote in my tablet reviews, since slates generally produce less-than-stellar sound. With the Tab Plus Gen 2, this is the first thing I want to discuss as it’s the standout feature—so much so that I had already written an entire piece about how <a href="https://www.tomsguide.com/computing/android-tablets/the-gargantuan-speaker-on-this-android-tablet-isnt-a-gimmick-i-cant-believe-how-good-it-sounds">the gargantuan speaker on this Android tablet isn’t a gimmick</a>. If you’ll pardon the cliché, the speaker quality is music to your ears.</p><p>The JBL 9-Unit Pro speaker system is what makes the magic happen. As its name suggests, there are nine speakers: four tweeters, three woofers, and two passive radiators. Those last two speakers deliver deep bass, while the tweeters handle higher-frequency sounds.</p><p>Sound is great out of the box, but to make everything truly sound spectacular, you’ll need to head into the Dolby Atmos sub-menu in sound settings. There are three presets: Dynamic, which identifies the content and automatically adjusts for the best sound; Movie, which provides surround sound and clearer dialogue; and Music, which delivers detailed audio so every note and beat sounds punchy. Music also has presets: Detailed, Balanced, and Warm, plus a manual equalizer.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6xyjQgcGqcDSf37WzdYcLS" name="Lenovo Tab Plus Gen 2--14" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/6xyjQgcGqcDSf37WzdYcLS-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I’m a hard rock and heavy metal fan, and I’m almost always disappointed by the thin, flat sound from most tablets when listening to these genres. That wasn’t the case here, as everything from death metal bands like Amon Amarth to ‘80s tunes like Stan Bush’s “The Touch” sounded rich, punchy, and loud. Movies and podcasts also sound incredible in Movie Mode, with dialogue coming through clear and crisp.</p><p>The presets let you quickly enjoy whatever you’re listening to, but you can also dive into the equalizer settings to truly fine-tune how things sound. Regardless, your ears won’t be disappointed.</p><h2 id="built-in-rotatable-kickstand">Built-in, rotatable kickstand</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jBcfo7ASZyZNEDrkSbzXPc" name="Lenovo Tab Plus Gen 2--6" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/jBcfo7ASZyZNEDrkSbzXPc-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The other notable design feature is the built-in kickstand. Attached directly to the speaker, the kickstand can rotate 360 degrees clockwise or counterclockwise. This lets you comfortably orient the slate horizontally when watching movies or vertically for reading.</p><p>While the rotating kickstand moves smoothly, it firmly stays in place once you’ve set it to your preferred position. And when you’re ready to travel with the slate, the kickstand snaps back into place when you push it inward. This might be a minor thing to some, but rotating the kickstand is also enjoyable since you can feel small bumps along the way.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mBdjAqrqHxTHxpoYSfYKBb" name="Lenovo Tab Plus Gen 2--3" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/mBdjAqrqHxTHxpoYSfYKBb-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I enjoy reading digital comics, so I love propping the tablet up on my table in portrait orientation so I don’t have to hold it while I read. The 16:9 aspect ratio is relatively close to a real comic’s trim size, which also helps. Naturally, this is also a great way to read books.</p><p>Like the kickstand, the tablet is made of sturdy aluminum that doesn’t bend or flex easily. Even if you won’t hold the tablet very often (more on why shortly), its smooth metal body feels nice against your fingers. I also like how the concave volume and power buttons are on the back and easy to reach when it’s in the horizontal position.</p><h2 id="vivid-display-2">Vivid display</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4Y6NTp4SSit5mg8Zx3DDdj" name="Lenovo Tab Plus Gen 2--15" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/4Y6NTp4SSit5mg8Zx3DDdj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The 12.1-inch (2560 x 1600) display on the Tab Plus Gen 2 might not stand out as much as the huge speaker, but it’s also no slouch. Even without an OLED panel, you get sharp image quality that’s bright and colorful.</p><p>When watching the latest trailer for the Street Fighter movie, I was impressed by how good everything looked. The detail and colors on the costumes and super moves pop. And thanks to the smooth 120Hz refresh rate, all the action moved smoothly. For watching movies, TV shows, and other videos, this display gets the job done.</p><div ><table><caption>Display benchmark results</caption><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Lenovo Tab Plus Gen 2</strong></p></th><th  ><p><strong>Apple iPad (11th gen)</strong></p></th><th  ><p><strong>OnePlus Pad Go 2</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Nits (brightness)</strong></p></td><td  ><p>597 (SDR) | 776 (HDR)</p></td><td  ><p>506 (SDR) | 496 (HDR)</p></td><td  ><p>544 (SDR) | 554 (HDR)</p></td></tr><tr><td class="firstcol " ><p><strong>sRGB</strong></p></td><td  ><p>157.5%</p></td><td  ><p>108.8%</p></td><td  ><p>159.6%</p></td></tr><tr><td class="firstcol " ><p><strong>DCI-P3</strong></p></td><td  ><p>111.5%</p></td><td  ><p>77.1%</p></td><td  ><p>113.1%</p></td></tr><tr><td class="firstcol " ><p><strong>Delta-E</strong></p></td><td  ><p>0.25</p></td><td  ><p>0.30</p></td><td  ><p>0.29</p></td></tr></tbody></table></div><p>Our lab test confirms what my eyes saw. Color reproduction (sRGB and DCI-P3) is generally oversaturated, which accounts for the vivid colors. Color accuracy (Delta-E) is also on par with other tablets. Those colors truly stand out thanks to the bright SDR and HDR brightness.</p><p>As you can see, Lenovo’s tablet quite literally outshines Apple’s iPad 11 and the OnePlus Pad Go 2 in both SDR and HDR brightness with adaptive brightness disabled. In fairness to the iPad, it delivers more natural hues than both Android tablets, since its sRGB and DCI-P3 values are closer to the 100% target.</p><h2 id="epic-battery-life">Epic battery life</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8ME6jXoWftuZc8mWxdG2z4" name="Lenovo Tab Plus Gen 2--9" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/8ME6jXoWftuZc8mWxdG2z4-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you’re going to spend hours watching videos, then you’ll want a tablet that can last for the long haul. Thankfully, that’s the case here, as the Tab Plus Gen 2 offers astonishing battery life.</p><div ><table><caption>Battery life results</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Time (hours:mins)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Lenovo Tab Gen 2</strong></p></td><td  ><p>16:00 (60Hz) | 13:39 (120Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Apple iPad (11th gen)</strong></p></td><td  ><p>11:25</p></td></tr><tr><td class="firstcol " ><p><strong>OnePlus Pad Go 2</strong></p></td><td  ><p>16:39</p></td></tr></tbody></table></div><p>In our battery test, which involved continuous web surfing over Wi-Fi with the display set to 150 nits of brightness, Lenovo’s slate lasted 16 hours at 60Hz and 13 hours and 39 minutes at 120Hz. While the OnePlus Pad Go 2 lasted almost 40 minutes longer, Lenovo’s tablet outlasted the iPad by nearly four and a half hours.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GQbFxdJu3aWa23MSAettaj" name="Lenovo Tab Plus Gen 2--5" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/GQbFxdJu3aWa23MSAettaj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I should note that the Tab Plus Gen 2 takes a while to fully charge. In our testing and in my own experience, it took 30 minutes to charge the tablet to 20%. Though you won’t have to charge the battery very often, just keep in mind that you’ll have to wait a while to fully juice it up.</p><h3 class="article-body__section" id="section-lenovo-tab-plus-gen-2-review-the-downs"><span>Lenovo Tab Plus Gen 2 review: The Downs</span></h3><p>While the Tab Plus Gen 2 excels as an entertainment device, it falls short in some key areas.</p><h2 id="awkward-to-hold">Awkward to hold</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4KoEVhPEhMiTtH4rdM25MB" name="Lenovo Tab Plus Gen 2--17" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/4KoEVhPEhMiTtH4rdM25MB-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The giant JBL speaker is the Tab Plus Gen 2’s main selling point, but it can also be a hindrance.</p><p>Because the speaker adds bulk to the tablet’s bottom, holding the slate like a traditional tablet can be burdensome. While 1.69 pounds doesn’t sound that heavy, the weight distribution makes the tablet feel heavier.</p><p>If you rest the tablet on your lap or use the kickstand to prop it up on your desk, then its weight won’t be an issue. However, this isn’t a slate you can easily hold with one hand, let alone two, for long periods.</p><h2 id="basic-performance">Basic performance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="sNWTzap4AUU9CAxYmzq9mH" name="Lenovo Tab Plus Gen 2--4" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/sNWTzap4AUU9CAxYmzq9mH-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I don’t consider this a major drawback since this is an entertainment-focused tablet. Still, if you plan to do serious work on the Tab Plus Gen 2, you might not get the smoothest or fastest experience because of its lackluster performance.</p><p>The Tab Plus Gen 2 handles basic tasks like scrolling websites in Google Chrome and reading books on Kindle without issue. However, when I opened multiple apps or Chrome tabs, performance suffered. If I wanted to use this for work, where I typically have 20 to 30 Chrome tabs open, I wouldn't have the smoothest experience.</p><div ><table><caption>Performance benchmarks</caption><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Lenovo Tab Gen 2</strong></p></th><th  ><p><strong>Apple iPad (11th gen)</strong></p></th><th  ><p><strong>OnePlus Pad Go 2</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Geekbench 6 score (single-core / multi-core) </strong></p></td><td  ><p>1125 / 3417</p></td><td  ><p>2589 / 6176</p></td><td  ><p>1013 / 3081</p></td></tr><tr><td class="firstcol " ><p><strong>3DMark Wild Life Extreme Unlimited (score/fps) </strong></p></td><td  ><p>1063 / 6.37</p></td><td  ><p>2623 / 15.70</p></td><td  ><p>863 / 5.17</p></td></tr></tbody></table></div><p>While the Tab Gen 2 matches the <a href="https://www.tomsguide.com/tablets/android-tablets/oneplus-pad-2-review">OnePlus Pad Go 2</a> in both CPU performance (Geekbench 6) and gaming performance (3DMark), these MediaTek Dimensity-powered Android tablets still can’t compete with Apple’s entry-level iPad.</p><p>Again, you won’t have a sluggish experience when using this tablet for its intended purpose. Just keep your expectations in check if you try to run heavier workloads or graphically demanding video games.</p><h3 class="article-body__section" id="section-lenovo-tab-plus-gen-2-review-verdict"><span>Lenovo Tab Plus Gen 2 review: Verdict</span></h3><p>I’m an iPad Pro user, so an Android tablet truly has to go above and beyond to impress me. And that’s exactly what the Lenovo Tab Plus Gen 2 has done thanks to its amazing sound quality, versatile kickstand, and crisp image quality.</p><p>Sure, it’s not powerful for heavy workloads, but if you mostly watch videos or read, this tablet has everything you’d need. The fact that it tops out at $399 is just icing on the proverbial cake. If you’re looking for an iPad alternative for your entertainment needs, don’t ignore the Lenovo Tab Plus Gen 2.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I test tablets for a living — here are the pros and cons of using them for school ]]></title>
                                                                                                <dc:content><![CDATA[ <p>If you’re reading this, then you’re considering whether it’s beneficial to get your kid a tablet for schoolwork. That’s reasonable. The <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a> are lighter than most laptops, can cost less than many Chromebooks, and students already know how to use them. The appeal is pretty evident.</p><p>That said, a tablet isn’t just a small computer. It’s a distinct device with its own strengths and limitations for schoolwork. If you’re deciding whether a tablet makes sense for your child this year, you need a clear picture of both sides before you hit buy.</p><p>I’ve reviewed dozens of tablets over the years and have spent a lot of time testing whether certain models (like the <a href="https://www.tomsguide.com/computing/i-switched-from-my-laptop-to-the-ipad-pro-m5-and-its-now-a-tablet-i-can-finally-work-on">iPad Pro</a>) can realistically replace a laptop. The answers aren’t always cut and dry, but I have a solid sense of when a tablet works for schoolwork and when it falls short.</p><p>Here’s a breakdown of the pros and cons of using a tablet for school to help you make the right call.</p><h2 id="tablets-for-school-the-pros">Tablets for school: The pros</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="P2onUe3S65XPF97vszhBNX" name="iPad Air M4 held in portrait mode" alt="iPad Air M4 held in portrait mode" src="https://cdn.mos.cms.futurecdn.net/P2onUe3S65XPF97vszhBNX-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>A tablet’s form factor is hard to beat. Most students can toss an iPad or mid-range Android tablet into a backpack without thinking twice because they’re so thin and light. Better options last a full school day on a charge, and they’re ready the second you take them out of rest mode or open the case. That lower friction is especially helpful for younger students.</p><p>Tablets are also strong for more visual, interactive schoolwork. Reading digital textbooks, annotating PDFs with a stylus, watching short instructional videos, and using educational apps all feel natural on a tablet. Many schools already deliver content through Google Classroom or similar platforms that work cleanly with tablets. If your kid needs to sketch, snap photos of notes, or complete interactive worksheets, a tablet with a decent stylus can feel more intuitive than a traditional laptop.</p><p>Cost is another factor. A solid mid-range tablet paired with a keyboard case can sometimes be cheaper than a budget laptop, and there’s generally less to break or keep updated. For a student who mainly needs a device for reading, research, light writing, and school apps, a tablet can cover a lot of ground without the extra complexity of a full computer.</p><p>If you've already decided to get a tablet for back-to-school, here are some options I recommend.</p><div class="product"><a data-dimension112="ceff20e6-9d9e-11f1-89b3-9571a5772d43" data-action="Deal Block" data-label="11" iPad (WiFi/128GB)" data-dimension48="11" iPad (WiFi/128GB)" data-dimension25="$399" href="https://www.amazon.com/Apple-iPad-11-inch-Display-All-Day/dp/B0DZ77D5HL" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1325px;"><p class="vanilla-image-block" style="padding-top:113.21%;"><img id="oi25obYHzoyNfMHoycGamh" name="iPad 2022 Blue.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/oi25obYHzoyNfMHoycGamh-1920-80.jpg" mos="" align="middle" fullscreen="" width="1325" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Apple-iPad-11-inch-Display-All-Day/dp/B0DZ77D5HL" target="_blank" rel="nofollow" data-dimension112="ceff20e6-9d9e-11f1-89b3-9571a5772d43" data-action="Deal Block" data-label='11" iPad (WiFi/128GB)' data-dimension48='11" iPad (WiFi/128GB)' data-dimension25="$399">11" iPad (WiFi/128GB): was $499 now $399</a></strong><br>The 2025 iPad features a larger 11-inch (2360 x 1640) screen, A16 CPU, 12MP rear/front cameras, USB-C connectivity, and Magic Keyboard Folio ($249) support. The base model features 128GB of storage, which is double the capacity of its predecessor. It's available in 128GB, 256GB, and 512GB capacities.<a class="view-deal button" href="https://www.amazon.com/Apple-iPad-11-inch-Display-All-Day/dp/B0DZ77D5HL" target="_blank" rel="nofollow" data-dimension112="ceff20e6-9d9e-11f1-89b3-9571a5772d43" data-action="Deal Block" data-label="11" iPad (WiFi/128GB)" data-dimension48="11" iPad (WiFi/128GB)" data-dimension25="$399">View Deal</a></p></div><div class="product"><a data-dimension112="ceff21b8-9d9e-11f1-ad8f-510af24ad226" data-action="Deal Block" data-label="Edge (for iPad 11)" data-dimension48="Edge (for iPad 11)" data-dimension25="$71" href="https://www.amazon.com/typecase-Edge-Keyboard-Case-iPad/dp/B0DL2V54T9?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:97.00%;"><img id="3LoA6pCGdej2NiqF73RPh" name="typecase Edge for iPad 11" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/3LoA6pCGdej2NiqF73RPh-1920-80.jpg" mos="" align="middle" fullscreen="" width="1500" height="1455" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/typecase-Edge-Keyboard-Case-iPad/dp/B0DL2V54T9?th=1" target="_blank" rel="nofollow" data-dimension112="ceff21b8-9d9e-11f1-ad8f-510af24ad226" data-action="Deal Block" data-label="Edge (for iPad 11)" data-dimension48="Edge (for iPad 11)" data-dimension25="$71">Edge (for iPad 11): was $79 now $71</a></strong><br>The typecase Edge is a perfect partner for the entry-level iPad. Its floating magnetic stand holds the iPad above the keyboard for more comfortable typing, while its backlit keys let you work in the dark.<a class="view-deal button" href="https://www.amazon.com/typecase-Edge-Keyboard-Case-iPad/dp/B0DL2V54T9?th=1" target="_blank" rel="nofollow" data-dimension112="ceff21b8-9d9e-11f1-ad8f-510af24ad226" data-action="Deal Block" data-label="Edge (for iPad 11)" data-dimension48="Edge (for iPad 11)" data-dimension25="$71">View Deal</a></p></div><div class="product"><a data-dimension112="ceff226c-9d9e-11f1-8a6b-4df6e8529c28" data-action="Deal Block" data-label="11" iPad Air (WiFi/128GB)" data-dimension48="11" iPad Air (WiFi/128GB)" data-dimension25="$649" href="https://www.amazon.com/Apple-iPad-Air-11-inch-M4/dp/B0GQVBJT4J" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1325px;"><p class="vanilla-image-block" style="padding-top:113.21%;"><img id="NVZkwX7FuVd3CYdiYHdsgm" name="iPad Air 11 2024 deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/NVZkwX7FuVd3CYdiYHdsgm-1920-80.jpg" mos="" align="middle" fullscreen="" width="1325" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Apple-iPad-Air-11-inch-M4/dp/B0GQVBJT4J" target="_blank" rel="nofollow" data-dimension112="ceff226c-9d9e-11f1-8a6b-4df6e8529c28" data-action="Deal Block" data-label='11" iPad Air (WiFi/128GB)' data-dimension48='11" iPad Air (WiFi/128GB)' data-dimension25="$649">11" iPad Air (WiFi/128GB): was $749 now $649</a></strong><br>The 2026 iPad Air packs Apple's M4 processor, which Apple states is up to 30 percent faster than the iPad Air with M3. It also has an 11-inch LED (2360 x 1640) display, 128GB of storage, 12MP rear camera, and 12MP front camera. The tablet now supports Wi-Fi 7, Bluetooth 6, and Thread. In our <a href="https://www.tomsguide.com/computing/ipads/apple-ipad-air-m4-review-small-tweaks-to-the-gold-standard">iPad Air M4 review</a>, we said the upgrades are modest, but the iPad Air remains the best tablet out there.<a class="view-deal button" href="https://www.amazon.com/Apple-iPad-Air-11-inch-M4/dp/B0GQVBJT4J" target="_blank" rel="nofollow" data-dimension112="ceff226c-9d9e-11f1-8a6b-4df6e8529c28" data-action="Deal Block" data-label="11" iPad Air (WiFi/128GB)" data-dimension48="11" iPad Air (WiFi/128GB)" data-dimension25="$649">View Deal</a></p></div><div class="product"><a data-dimension112="ceff232a-9d9e-11f1-bc78-79761be42074" data-action="Deal Block" data-label="ZAGG iPad cases/keyboards: up to 35% off @ Amazon" data-dimension48="ZAGG iPad cases/keyboards: up to 35% off @ Amazon" href="https://www.amazon.com/stores/page/95B57F20-ECDA-432D-9A36-8F6767ABF8F8" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1019px;"><p class="vanilla-image-block" style="padding-top:96.66%;"><img id="mnQ5ank7EYesxjauvV63vF" name="ZAGG Pro Keys Wireless Keyboard and Detachable Case.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/mnQ5ank7EYesxjauvV63vF-1920-80.jpg" mos="" align="middle" fullscreen="" width="1019" height="985" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>ZAGG iPad cases/keyboards: </strong><a href="https://www.amazon.com/stores/page/95B57F20-ECDA-432D-9A36-8F6767ABF8F8" target="_blank" rel="nofollow" data-dimension112="ceff232a-9d9e-11f1-bc78-79761be42074" data-action="Deal Block" data-label="ZAGG iPad cases/keyboards: up to 35% off @ Amazon" data-dimension48="ZAGG iPad cases/keyboards: up to 35% off @ Amazon" data-dimension25=""><strong>up to 35% off @ Amazon</strong></a><br>Amazon is taking up to 35% off select ZAGG iPad cases and accessories. After discount, prices start as low as $47. It's one of the best iPad deals we've seen on these accessories. <a class="view-deal button" href="https://www.amazon.com/stores/page/95B57F20-ECDA-432D-9A36-8F6767ABF8F8" target="_blank" rel="nofollow" data-dimension112="ceff232a-9d9e-11f1-bc78-79761be42074" data-action="Deal Block" data-label="ZAGG iPad cases/keyboards: up to 35% off @ Amazon" data-dimension48="ZAGG iPad cases/keyboards: up to 35% off @ Amazon" data-dimension25="">View Deal</a></p></div><h2 id="tablets-for-school-the-cons">Tablets for school: The cons</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="2DjYj7Z2JwEmzSkBiDfqkB" name="iPad Air M4" alt="iPad Air M4 being held in landscape mode" src="https://cdn.mos.cms.futurecdn.net/2DjYj7Z2JwEmzSkBiDfqkB-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>While tablets can work well for school, they come with some serious drawbacks.</p><p>Serious tasks like writing longer papers, building spreadsheets, coding, or juggling multiple apps are still noticeably harder on a tablet than on a laptop. Even with a keyboard attached, multitasking and file management often feel limited. If your child’s schoolwork involves a lot of writing or switching between documents, a tablet can slow them down.</p><p>You’ll also need to account for the cost of peripherals if you want real school use out of the tablet. Something like <a href="https://www.tomsguide.com/reviews/ipad-pro-magic-keyboard">Apple’s Magic Keyboard</a> makes typing far more comfortable than the on-screen keyboard, and keeps an iPad protected from accidental drops. A stylus isn’t always essential, but it can be if your child takes notes by hand or does any drawing. The cost of these peripherals can erase the tablet’s initial price advantage.</p><p>Not every school’s software or testing platform plays nicely with tablets, either. Some require specific browsers or extensions that work more reliably on a laptop. If your kid’s school leans heavily on certain tools, a tablet can create more headaches than it solves.</p><p>Finally, distraction is a bigger issue on a tablet. It’s much easier for a student to fire up a game, fall into YouTube, or get lost on social media instead of finishing homework or getting to bed on time. Those same temptations exist on laptops, but the tablet form factor makes them easier to slip into.</p><p>If these cons are a deal-breaker, here are two excellent and budget-friendly laptops I suggest you get for your kid instead.</p><div class="product"><a data-dimension112="1b1b1a0c-9d9f-11f1-8c07-b18868904660" data-action="Deal Block" data-label="XPS 13 (2026)" data-dimension48="XPS 13 (2026)" data-dimension25="$699" href="https://www.dell.com/en-us/shop/dell-laptops/new-xps-13-laptop/spd/xps13dx13260laptop" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="yVpTsWNESwCtxxLQmbPTgh" name="Dell XPS 13 (2026) deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yVpTsWNESwCtxxLQmbPTgh-1920-80.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.dell.com/en-us/shop/dell-laptops/new-xps-13-laptop/spd/xps13dx13260laptop" target="_blank" rel="nofollow" data-dimension112="1b1b1a0c-9d9f-11f1-8c07-b18868904660" data-action="Deal Block" data-label="XPS 13 (2026)" data-dimension48="XPS 13 (2026)" data-dimension25="$699">XPS 13 (2026): $699</a></strong><br>The new Dell XPS 13 is here to help you beat the RAMageddon blues. This model has a 13.4-inch InfinityEdge 2.5K touch display, an Intel Core Series 3 "Wildcat Lake" CPU, 8GB of RAM, and 512GB of SSD storage. It's wrapped in an aluminum design that's just 0.5 inches thick and weighs 2.2 pounds.<a class="view-deal button" href="https://www.dell.com/en-us/shop/dell-laptops/new-xps-13-laptop/spd/xps13dx13260laptop" target="_blank" rel="nofollow" data-dimension112="1b1b1a0c-9d9f-11f1-8c07-b18868904660" data-action="Deal Block" data-label="XPS 13 (2026)" data-dimension48="XPS 13 (2026)" data-dimension25="$699">View Deal</a></p></div><div class="product"><a data-dimension112="1b1b1a84-9d9f-11f1-9105-01f7f7962f19" data-action="Deal Block" data-label="13" MacBook Neo" data-dimension48="13" MacBook Neo" data-dimension25="$699" href="https://www.apple.com/shop/buy-mac/macbook-air/13-inch" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:61.07%;"><img id="Lg4Dvg68j9SbB5CPNrTEpH" name="MacBook Neo deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH-1920-80.jpg" mos="" align="middle" fullscreen="" width="1500" height="916" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.apple.com/shop/buy-mac/macbook-air/13-inch" target="_blank" rel="nofollow" data-dimension112="1b1b1a84-9d9f-11f1-9105-01f7f7962f19" data-action="Deal Block" data-label='13" MacBook Neo' data-dimension48='13" MacBook Neo' data-dimension25="$699">13" MacBook Neo: $699</a></strong><br>The MacBook Neo is Apple's most affordable Mac. The $699 laptop sports a 13-inch Liquid Retina (2408 x 1506) display, an A18 Pro chipset, 8GB of RAM, a 256GB SSD, and a 1080p FaceTime HD camera. There's also the option to add Touch ID and a 512GB SSD for a total price of $799. The 2.7-lb. laptop is available in Indigo, Blush, Citrus, and Silver.<a class="view-deal button" href="https://www.apple.com/shop/buy-mac/macbook-air/13-inch" target="_blank" rel="nofollow" data-dimension112="1b1b1a84-9d9f-11f1-9105-01f7f7962f19" data-action="Deal Block" data-label="13" MacBook Neo" data-dimension48="13" MacBook Neo" data-dimension25="$699">View Deal</a></p></div><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XmxNPO"></div>                            </div>                            <script src="https://kwizly.com/embed/XmxNPO.js" async></script><h2 id="bottom-line">Bottom line</h2><p>A tablet can be a fantastic tool for schoolwork, but only if it matches how your kid works and what their school expects.</p><p>For younger children focused on reading, interactive lessons, and lighter assignments, a tablet is often the better fit. For older students handling longer writing, research projects, or heavier software, a proper laptop is usually the smarter daily driver. Solid options in that category that I recommend include the <a href="https://www.tomsguide.com/computing/laptops/dell-xps-13-2026-review">Dell XPS 13</a> or <a href="https://www.tomsguide.com/computing/macbooks/apple-macbook-neo-review">MacBook Neo</a>, both of which currently start at $699.</p><p>If you decide to go the tablet route, pair it with a good keyboard case, enable strong parental controls, and set clear rules about when it’s a school device versus a fun distraction. This keeps the advantages while limiting the downsides.</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/laptops/dell-xps-13-vs-macbook-neo-which-usd699-laptop-is-right-for-you"><strong>Dell XPS 13 vs. MacBook Neo: Which $699 laptop is right for you?</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/computing/laptops/im-a-laptop-reviewer-12-essential-back-to-school-laptop-accessories-under-usd50-i-recommend"><strong>12 essential back-to-school laptop accessories under $50 I recommend</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/computing/laptops/i-tested-the-new-dell-xps-13-for-two-weeks-heres-3-things-i-love-and-1-i-hate"><strong>I tested the new Dell XPS 13 for two weeks — here's 3 things I love (and 1 I hate)</strong></a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/tablets/i-test-tablets-for-a-living-here-are-the-pros-and-cons-of-using-them-for-school</link>
                                                                            <description>
                            <![CDATA[ Wondering whether a tablet is right for your kid’s schoolwork? Here’s a breakdown of the advantages, drawbacks, and what parents should consider. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">qhTvXCVzG6KJ7jsCUHjEoH</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/7xaBCkUaZ6h5SShfW5XoBK-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 22 Aug 2026 09:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                                                                <author><![CDATA[ tony.polanco@futurenet.com (Tony Polanco) ]]></author>                    <dc:creator><![CDATA[ Tony Polanco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/atzRNqFt5wYgEUPBDahWsD-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/7xaBCkUaZ6h5SShfW5XoBK-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iPad Air M4 with magic keyboard folio]]></media:description>                                                            <media:text><![CDATA[iPad Air M4 with magic keyboard folio]]></media:text>
                                <media:title type="plain"><![CDATA[iPad Air M4 with magic keyboard folio]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/7xaBCkUaZ6h5SShfW5XoBK-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you’re reading this, then you’re considering whether it’s beneficial to get your kid a tablet for schoolwork. That’s reasonable. The <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a> are lighter than most laptops, can cost less than many Chromebooks, and students already know how to use them. The appeal is pretty evident.</p><p>That said, a tablet isn’t just a small computer. It’s a distinct device with its own strengths and limitations for schoolwork. If you’re deciding whether a tablet makes sense for your child this year, you need a clear picture of both sides before you hit buy.</p><p>I’ve reviewed dozens of tablets over the years and have spent a lot of time testing whether certain models (like the <a href="https://www.tomsguide.com/computing/i-switched-from-my-laptop-to-the-ipad-pro-m5-and-its-now-a-tablet-i-can-finally-work-on">iPad Pro</a>) can realistically replace a laptop. The answers aren’t always cut and dry, but I have a solid sense of when a tablet works for schoolwork and when it falls short.</p><p>Here’s a breakdown of the pros and cons of using a tablet for school to help you make the right call.</p><h2 id="tablets-for-school-the-pros">Tablets for school: The pros</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="P2onUe3S65XPF97vszhBNX" name="iPad Air M4 held in portrait mode" alt="iPad Air M4 held in portrait mode" src="https://cdn.mos.cms.futurecdn.net/P2onUe3S65XPF97vszhBNX-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>A tablet’s form factor is hard to beat. Most students can toss an iPad or mid-range Android tablet into a backpack without thinking twice because they’re so thin and light. Better options last a full school day on a charge, and they’re ready the second you take them out of rest mode or open the case. That lower friction is especially helpful for younger students.</p><p>Tablets are also strong for more visual, interactive schoolwork. Reading digital textbooks, annotating PDFs with a stylus, watching short instructional videos, and using educational apps all feel natural on a tablet. Many schools already deliver content through Google Classroom or similar platforms that work cleanly with tablets. If your kid needs to sketch, snap photos of notes, or complete interactive worksheets, a tablet with a decent stylus can feel more intuitive than a traditional laptop.</p><p>Cost is another factor. A solid mid-range tablet paired with a keyboard case can sometimes be cheaper than a budget laptop, and there’s generally less to break or keep updated. For a student who mainly needs a device for reading, research, light writing, and school apps, a tablet can cover a lot of ground without the extra complexity of a full computer.</p><p>If you've already decided to get a tablet for back-to-school, here are some options I recommend.</p><div class="product"><a data-dimension112="ceff20e6-9d9e-11f1-89b3-9571a5772d43" data-action="Deal Block" data-label="11" iPad (WiFi/128GB)" data-dimension48="11" iPad (WiFi/128GB)" data-dimension25="$399" href="https://www.amazon.com/Apple-iPad-11-inch-Display-All-Day/dp/B0DZ77D5HL" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1325px;"><p class="vanilla-image-block" style="padding-top:113.21%;"><img id="oi25obYHzoyNfMHoycGamh" name="iPad 2022 Blue.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/oi25obYHzoyNfMHoycGamh-1920-80.jpg" mos="" align="middle" fullscreen="" width="1325" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Apple-iPad-11-inch-Display-All-Day/dp/B0DZ77D5HL" target="_blank" rel="nofollow" data-dimension112="ceff20e6-9d9e-11f1-89b3-9571a5772d43" data-action="Deal Block" data-label='11" iPad (WiFi/128GB)' data-dimension48='11" iPad (WiFi/128GB)' data-dimension25="$399">11" iPad (WiFi/128GB): was $499 now $399</a></strong><br>The 2025 iPad features a larger 11-inch (2360 x 1640) screen, A16 CPU, 12MP rear/front cameras, USB-C connectivity, and Magic Keyboard Folio ($249) support. The base model features 128GB of storage, which is double the capacity of its predecessor. It's available in 128GB, 256GB, and 512GB capacities.<a class="view-deal button" href="https://www.amazon.com/Apple-iPad-11-inch-Display-All-Day/dp/B0DZ77D5HL" target="_blank" rel="nofollow" data-dimension112="ceff20e6-9d9e-11f1-89b3-9571a5772d43" data-action="Deal Block" data-label="11" iPad (WiFi/128GB)" data-dimension48="11" iPad (WiFi/128GB)" data-dimension25="$399">View Deal</a></p></div><div class="product"><a data-dimension112="ceff21b8-9d9e-11f1-ad8f-510af24ad226" data-action="Deal Block" data-label="Edge (for iPad 11)" data-dimension48="Edge (for iPad 11)" data-dimension25="$71" href="https://www.amazon.com/typecase-Edge-Keyboard-Case-iPad/dp/B0DL2V54T9?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:97.00%;"><img id="3LoA6pCGdej2NiqF73RPh" name="typecase Edge for iPad 11" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/3LoA6pCGdej2NiqF73RPh-1920-80.jpg" mos="" align="middle" fullscreen="" width="1500" height="1455" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/typecase-Edge-Keyboard-Case-iPad/dp/B0DL2V54T9?th=1" target="_blank" rel="nofollow" data-dimension112="ceff21b8-9d9e-11f1-ad8f-510af24ad226" data-action="Deal Block" data-label="Edge (for iPad 11)" data-dimension48="Edge (for iPad 11)" data-dimension25="$71">Edge (for iPad 11): was $79 now $71</a></strong><br>The typecase Edge is a perfect partner for the entry-level iPad. Its floating magnetic stand holds the iPad above the keyboard for more comfortable typing, while its backlit keys let you work in the dark.<a class="view-deal button" href="https://www.amazon.com/typecase-Edge-Keyboard-Case-iPad/dp/B0DL2V54T9?th=1" target="_blank" rel="nofollow" data-dimension112="ceff21b8-9d9e-11f1-ad8f-510af24ad226" data-action="Deal Block" data-label="Edge (for iPad 11)" data-dimension48="Edge (for iPad 11)" data-dimension25="$71">View Deal</a></p></div><div class="product"><a data-dimension112="ceff226c-9d9e-11f1-8a6b-4df6e8529c28" data-action="Deal Block" data-label="11" iPad Air (WiFi/128GB)" data-dimension48="11" iPad Air (WiFi/128GB)" data-dimension25="$649" href="https://www.amazon.com/Apple-iPad-Air-11-inch-M4/dp/B0GQVBJT4J" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1325px;"><p class="vanilla-image-block" style="padding-top:113.21%;"><img id="NVZkwX7FuVd3CYdiYHdsgm" name="iPad Air 11 2024 deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/NVZkwX7FuVd3CYdiYHdsgm-1920-80.jpg" mos="" align="middle" fullscreen="" width="1325" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Apple-iPad-Air-11-inch-M4/dp/B0GQVBJT4J" target="_blank" rel="nofollow" data-dimension112="ceff226c-9d9e-11f1-8a6b-4df6e8529c28" data-action="Deal Block" data-label='11" iPad Air (WiFi/128GB)' data-dimension48='11" iPad Air (WiFi/128GB)' data-dimension25="$649">11" iPad Air (WiFi/128GB): was $749 now $649</a></strong><br>The 2026 iPad Air packs Apple's M4 processor, which Apple states is up to 30 percent faster than the iPad Air with M3. It also has an 11-inch LED (2360 x 1640) display, 128GB of storage, 12MP rear camera, and 12MP front camera. The tablet now supports Wi-Fi 7, Bluetooth 6, and Thread. In our <a href="https://www.tomsguide.com/computing/ipads/apple-ipad-air-m4-review-small-tweaks-to-the-gold-standard">iPad Air M4 review</a>, we said the upgrades are modest, but the iPad Air remains the best tablet out there.<a class="view-deal button" href="https://www.amazon.com/Apple-iPad-Air-11-inch-M4/dp/B0GQVBJT4J" target="_blank" rel="nofollow" data-dimension112="ceff226c-9d9e-11f1-8a6b-4df6e8529c28" data-action="Deal Block" data-label="11" iPad Air (WiFi/128GB)" data-dimension48="11" iPad Air (WiFi/128GB)" data-dimension25="$649">View Deal</a></p></div><div class="product"><a data-dimension112="ceff232a-9d9e-11f1-bc78-79761be42074" data-action="Deal Block" data-label="ZAGG iPad cases/keyboards: up to 35% off @ Amazon" data-dimension48="ZAGG iPad cases/keyboards: up to 35% off @ Amazon" href="https://www.amazon.com/stores/page/95B57F20-ECDA-432D-9A36-8F6767ABF8F8" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1019px;"><p class="vanilla-image-block" style="padding-top:96.66%;"><img id="mnQ5ank7EYesxjauvV63vF" name="ZAGG Pro Keys Wireless Keyboard and Detachable Case.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/mnQ5ank7EYesxjauvV63vF-1920-80.jpg" mos="" align="middle" fullscreen="" width="1019" height="985" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>ZAGG iPad cases/keyboards: </strong><a href="https://www.amazon.com/stores/page/95B57F20-ECDA-432D-9A36-8F6767ABF8F8" target="_blank" rel="nofollow" data-dimension112="ceff232a-9d9e-11f1-bc78-79761be42074" data-action="Deal Block" data-label="ZAGG iPad cases/keyboards: up to 35% off @ Amazon" data-dimension48="ZAGG iPad cases/keyboards: up to 35% off @ Amazon" data-dimension25=""><strong>up to 35% off @ Amazon</strong></a><br>Amazon is taking up to 35% off select ZAGG iPad cases and accessories. After discount, prices start as low as $47. It's one of the best iPad deals we've seen on these accessories. <a class="view-deal button" href="https://www.amazon.com/stores/page/95B57F20-ECDA-432D-9A36-8F6767ABF8F8" target="_blank" rel="nofollow" data-dimension112="ceff232a-9d9e-11f1-bc78-79761be42074" data-action="Deal Block" data-label="ZAGG iPad cases/keyboards: up to 35% off @ Amazon" data-dimension48="ZAGG iPad cases/keyboards: up to 35% off @ Amazon" data-dimension25="">View Deal</a></p></div><h2 id="tablets-for-school-the-cons">Tablets for school: The cons</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="2DjYj7Z2JwEmzSkBiDfqkB" name="iPad Air M4" alt="iPad Air M4 being held in landscape mode" src="https://cdn.mos.cms.futurecdn.net/2DjYj7Z2JwEmzSkBiDfqkB-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>While tablets can work well for school, they come with some serious drawbacks.</p><p>Serious tasks like writing longer papers, building spreadsheets, coding, or juggling multiple apps are still noticeably harder on a tablet than on a laptop. Even with a keyboard attached, multitasking and file management often feel limited. If your child’s schoolwork involves a lot of writing or switching between documents, a tablet can slow them down.</p><p>You’ll also need to account for the cost of peripherals if you want real school use out of the tablet. Something like <a href="https://www.tomsguide.com/reviews/ipad-pro-magic-keyboard">Apple’s Magic Keyboard</a> makes typing far more comfortable than the on-screen keyboard, and keeps an iPad protected from accidental drops. A stylus isn’t always essential, but it can be if your child takes notes by hand or does any drawing. The cost of these peripherals can erase the tablet’s initial price advantage.</p><p>Not every school’s software or testing platform plays nicely with tablets, either. Some require specific browsers or extensions that work more reliably on a laptop. If your kid’s school leans heavily on certain tools, a tablet can create more headaches than it solves.</p><p>Finally, distraction is a bigger issue on a tablet. It’s much easier for a student to fire up a game, fall into YouTube, or get lost on social media instead of finishing homework or getting to bed on time. Those same temptations exist on laptops, but the tablet form factor makes them easier to slip into.</p><p>If these cons are a deal-breaker, here are two excellent and budget-friendly laptops I suggest you get for your kid instead.</p><div class="product"><a data-dimension112="1b1b1a0c-9d9f-11f1-8c07-b18868904660" data-action="Deal Block" data-label="XPS 13 (2026)" data-dimension48="XPS 13 (2026)" data-dimension25="$699" href="https://www.dell.com/en-us/shop/dell-laptops/new-xps-13-laptop/spd/xps13dx13260laptop" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="yVpTsWNESwCtxxLQmbPTgh" name="Dell XPS 13 (2026) deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yVpTsWNESwCtxxLQmbPTgh-1920-80.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.dell.com/en-us/shop/dell-laptops/new-xps-13-laptop/spd/xps13dx13260laptop" target="_blank" rel="nofollow" data-dimension112="1b1b1a0c-9d9f-11f1-8c07-b18868904660" data-action="Deal Block" data-label="XPS 13 (2026)" data-dimension48="XPS 13 (2026)" data-dimension25="$699">XPS 13 (2026): $699</a></strong><br>The new Dell XPS 13 is here to help you beat the RAMageddon blues. This model has a 13.4-inch InfinityEdge 2.5K touch display, an Intel Core Series 3 "Wildcat Lake" CPU, 8GB of RAM, and 512GB of SSD storage. It's wrapped in an aluminum design that's just 0.5 inches thick and weighs 2.2 pounds.<a class="view-deal button" href="https://www.dell.com/en-us/shop/dell-laptops/new-xps-13-laptop/spd/xps13dx13260laptop" target="_blank" rel="nofollow" data-dimension112="1b1b1a0c-9d9f-11f1-8c07-b18868904660" data-action="Deal Block" data-label="XPS 13 (2026)" data-dimension48="XPS 13 (2026)" data-dimension25="$699">View Deal</a></p></div><div class="product"><a data-dimension112="1b1b1a84-9d9f-11f1-9105-01f7f7962f19" data-action="Deal Block" data-label="13" MacBook Neo" data-dimension48="13" MacBook Neo" data-dimension25="$699" href="https://www.apple.com/shop/buy-mac/macbook-air/13-inch" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:61.07%;"><img id="Lg4Dvg68j9SbB5CPNrTEpH" name="MacBook Neo deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH-1920-80.jpg" mos="" align="middle" fullscreen="" width="1500" height="916" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.apple.com/shop/buy-mac/macbook-air/13-inch" target="_blank" rel="nofollow" data-dimension112="1b1b1a84-9d9f-11f1-9105-01f7f7962f19" data-action="Deal Block" data-label='13" MacBook Neo' data-dimension48='13" MacBook Neo' data-dimension25="$699">13" MacBook Neo: $699</a></strong><br>The MacBook Neo is Apple's most affordable Mac. The $699 laptop sports a 13-inch Liquid Retina (2408 x 1506) display, an A18 Pro chipset, 8GB of RAM, a 256GB SSD, and a 1080p FaceTime HD camera. There's also the option to add Touch ID and a 512GB SSD for a total price of $799. The 2.7-lb. laptop is available in Indigo, Blush, Citrus, and Silver.<a class="view-deal button" href="https://www.apple.com/shop/buy-mac/macbook-air/13-inch" target="_blank" rel="nofollow" data-dimension112="1b1b1a84-9d9f-11f1-9105-01f7f7962f19" data-action="Deal Block" data-label="13" MacBook Neo" data-dimension48="13" MacBook Neo" data-dimension25="$699">View Deal</a></p></div><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XmxNPO"></div>                            </div>                            <script src="https://kwizly.com/embed/XmxNPO.js" async></script><h2 id="bottom-line">Bottom line</h2><p>A tablet can be a fantastic tool for schoolwork, but only if it matches how your kid works and what their school expects.</p><p>For younger children focused on reading, interactive lessons, and lighter assignments, a tablet is often the better fit. For older students handling longer writing, research projects, or heavier software, a proper laptop is usually the smarter daily driver. Solid options in that category that I recommend include the <a href="https://www.tomsguide.com/computing/laptops/dell-xps-13-2026-review">Dell XPS 13</a> or <a href="https://www.tomsguide.com/computing/macbooks/apple-macbook-neo-review">MacBook Neo</a>, both of which currently start at $699.</p><p>If you decide to go the tablet route, pair it with a good keyboard case, enable strong parental controls, and set clear rules about when it’s a school device versus a fun distraction. This keeps the advantages while limiting the downsides.</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/laptops/dell-xps-13-vs-macbook-neo-which-usd699-laptop-is-right-for-you"><strong>Dell XPS 13 vs. MacBook Neo: Which $699 laptop is right for you?</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/computing/laptops/im-a-laptop-reviewer-12-essential-back-to-school-laptop-accessories-under-usd50-i-recommend"><strong>12 essential back-to-school laptop accessories under $50 I recommend</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/computing/laptops/i-tested-the-new-dell-xps-13-for-two-weeks-heres-3-things-i-love-and-1-i-hate"><strong>I tested the new Dell XPS 13 for two weeks — here's 3 things I love (and 1 I hate)</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The gargantuan speaker on this Android tablet isn’t a gimmick — I can’t believe how good it sounds ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I’ve reviewed dozens of the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a> over the years, and the one thing they almost always have in common is less-than-ideal speaker quality. While the <a href="https://www.tomsguide.com/best-picks/best-ipad">best iPads</a> tend to produce great sound, their speakers can’t compete even with built-in TV speakers. Perhaps that's why Lenovo decided to slap a giant speaker on its Tab Plus Gen 2 to buck this trend.</p><p>I’m currently testing the Tab Plus Gen 2 and will have a full review for you soon. But I wanted to write a dedicated piece on the tablet’s sound since it’s so darn impressive. Whether it’s ear-scorching heavy metal or your favorite podcast, everything sounds fantastic on this tablet thanks to its enormous JBL speaker and its various sound settings.</p><p>If you’re like me and are generally disappointed by tablet speakers, then the Lenovo Tab Plus Gen 2 will be literal music to your ears. Let me tell you why.</p><div class="product"><a data-dimension112="0c828c66-9cc6-11f1-9c23-354cb9250bf1" data-action="Deal Block" data-label="Tab Plus Gen 2" data-dimension48="Tab Plus Gen 2" data-dimension25="$299" href="https://www.lenovo.com/us/en/p/tablets/android-tablets/lenovo-tab-series/lenovo-tab-plus-gen-2-12.1-inch-mediatek/zaht0078us" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:604px;"><p class="vanilla-image-block" style="padding-top:75.17%;"><img id="FGrhe3k8vbpgSXv4VUWuB7" name="Lenovo Tab Plus Gen 2 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/FGrhe3k8vbpgSXv4VUWuB7-1920-80.jpg" mos="" align="middle" fullscreen="" width="604" height="454" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>On the hunt for a super affordable and lightweight tablet? The Lenovo Tab Plus Gen 2 is currently on sale for $299. It features a 12.1-inch 2.5K 2560 x 1600 multitouch 120Hz display, MediaTek Dimensity 7400 CPU, 8GB of RAM, 128GB SSD, 13MP rear camera, and 8MP front camera.<a class="view-deal button" href="https://www.lenovo.com/us/en/p/tablets/android-tablets/lenovo-tab-series/lenovo-tab-plus-gen-2-12.1-inch-mediatek/zaht0078us" target="_blank" rel="nofollow" data-dimension112="0c828c66-9cc6-11f1-9c23-354cb9250bf1" data-action="Deal Block" data-label="Tab Plus Gen 2" data-dimension48="Tab Plus Gen 2" data-dimension25="$299">View Deal</a></p></div><h2 id="speaker-tech">Speaker tech</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="yfyA9CGCgwXPVkPjvZmM2G" name="Lenovo Tab Plus Gen 2 (speakers)-3" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/yfyA9CGCgwXPVkPjvZmM2G-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Lenovo Tab Plus Gen 2 features a JBL 9-Unit Pro speaker system, tuned by Dolby Atmos. That 9 isn’t superfluous, as it’s exactly how many speakers this thing packs.</p><p>To be specific, this includes four tweeters, three woofers, and two passive radiators. The latter two allow the speaker to produce truly deep bass, while the tweeters handle higher-frequency sounds. Combined, they deliver exceptional audio quality for a tablet.</p><h2 id="my-initial-experience">My initial experience</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LQwfkCsRd3KU5xg7TYEirS" name="Lenovo Tab Plus Gen 2 (speakers)-2" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/LQwfkCsRd3KU5xg7TYEirS-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I decided to go into the deep end right from the start by firing up Amon Amarth’s “We Rule the Waves” to see how the speakers handled melodic death metal at max volume. While the bass was punchy and the overall sound was room-filling, I wasn’t impressed by the thin midrange. This is a demanding genre even for a good speaker system, so I initially chalked it up to that.</p><p>Next, I fired up Lion’s “Transformers” from the legendary (and childhood trauma-inducing) 1986 film. This song sounded better than the Amon Amarth track since everything came through evenly and punchy. 80s songs also aren’t nearly as compressed as modern songs, which also helps.</p><p>After that, I watched an episode of the The Comics Pals on YouTube and was equally stunned by how natural the dialogue sounded. All the panelists came through clearly, even if some had better microphones than others. I also liked how well the speaker handled the dialogue and music in the latest Avengers: Doomsday trailer, making everything sound appropriately cinematic.</p><p>I was already impressed by the out-of-the-box sound experience, but then I realized you could select different sound profiles within settings. This is when I went from impressed to having my mind (or my ears) completely blown.</p><h2 id="optimized-sound">Optimized sound</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RGMAAUoUcWdEr3aZgSmCa" name="Lenovo Tab Plus Gen 2 (speakers)-7" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/RGMAAUoUcWdEr3aZgSmCa-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Dolby Atmos sub-menu is where you can get the Lenovo Tab Plus Gen 2 to sound its absolute best. There are three presets: Dynamic, which identifies the content and automatically adjusts for the best sound; Movie, which provides surround sound and clearer dialogue; and Music, which delivers detailed audio so every note and beat sounds punchy. Music also has its own presets: Detailed, Balanced, and Warm, along with a manual equalizer.</p><p>Listening to the aforementioned songs with the Music preset enabled makes a world of difference, as everything from the highs and mids to the lows packs an appropriate amount of power and bass. </p><p>For Amon Amarth specifically, the Warm preset in Music helps the guttural vocals stand out more. The Transformers track sounded fantastic and made me even more stoked to see the 40th-anniversary screening next month!</p><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:62.50%;"><img id="MkhHwAZkV5kAJXRffwNFpH" name="Lenovo Tab Plus Gen 2 settings" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/MkhHwAZkV5kAJXRffwNFpH-1920-80.png" mos="" align="middle" fullscreen="" width="2560" height="1600" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Lenovo / Tom's Guide)</span></figcaption></figure><p>As you’d expect, Movie mode is perfect for movies, TV shows, and trailers. For instance, I felt like I was in the theater when I fired up the Doomsday trailer again. Dialogue-focused videos also sound fantastic in Movie mode, though I found the sound was a tad richer and fuller in Music mode.</p><p>I didn’t mess around too much with the equalizer settings, as I’m no audio engineer. But I like that this option exists for the true audiophiles out there. While the Dynamic preset is decent enough, its mid-range is too thin to my liking. The Movie and Music presets are the best bet for nearly all the content you’ll be engaging with on this tablet.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XpoNpO"></div>                            </div>                            <script src="https://kwizly.com/embed/XpoNpO.js" async></script><h2 id="music-to-my-ears">Music to my ears</h2><p>If you’re looking for a tablet with phenomenal speaker quality, you can’t do much better than the Lenovo Tab Plus Gen 2. While that giant speaker looks somewhat awkward and makes the slate heavy to hold, it excels at what it's designed for. The out-of-the-box sound is pretty impressive, but it can sound way better with some minor fiddling.</p><p>There’s more to discuss about this entertainment-focused Android tablet, such as its display quality, performance, battery life, and more, so stay tuned for that. But if you found what I said interesting, then don’t hesitate to check out this tablet, especially since it’s pretty affordable at $299. Trust me, your ears will thank you!</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/laptops/i-just-got-invited-to-the-googlebook-september-15-event-in-nyc-this-is-what-i-expect-to-see"><strong>This is what I expect to see at the Googlebook event</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/computing/vr-ar/steam-frame-unboxing-and-tutorial-videos-just-leaked-release-could-be-imminent"><strong>Steam Frame unboxing and tutorial videos just leaked</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/gaming/marvel-tokon-fighting-souls-review"><strong>Marvel Tōkon is now one of my all-time favorite fighting games</strong></a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/android-tablets/the-gargantuan-speaker-on-this-android-tablet-isnt-a-gimmick-i-cant-believe-how-good-it-sounds</link>
                                                                            <description>
                            <![CDATA[ Tablets don't usually have great speaker quality, but the Lenovo Tab Plus Gen 2 bucks that trend thanks to its enormous JBL speaker. The sound is astonishing. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">RaYj3FhkuWzejLD8iLHYH8</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/XqhzBSR8ayJWLTT5bT2SSd-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 21 Aug 2026 06:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                <author><![CDATA[ tony.polanco@futurenet.com (Tony Polanco) ]]></author>                    <dc:creator><![CDATA[ Tony Polanco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/atzRNqFt5wYgEUPBDahWsD-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/XqhzBSR8ayJWLTT5bT2SSd-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Lenovo Tab Plus Gen 2]]></media:description>                                                            <media:text><![CDATA[Lenovo Tab Plus Gen 2]]></media:text>
                                <media:title type="plain"><![CDATA[Lenovo Tab Plus Gen 2]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/XqhzBSR8ayJWLTT5bT2SSd-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I’ve reviewed dozens of the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a> over the years, and the one thing they almost always have in common is less-than-ideal speaker quality. While the <a href="https://www.tomsguide.com/best-picks/best-ipad">best iPads</a> tend to produce great sound, their speakers can’t compete even with built-in TV speakers. Perhaps that's why Lenovo decided to slap a giant speaker on its Tab Plus Gen 2 to buck this trend.</p><p>I’m currently testing the Tab Plus Gen 2 and will have a full review for you soon. But I wanted to write a dedicated piece on the tablet’s sound since it’s so darn impressive. Whether it’s ear-scorching heavy metal or your favorite podcast, everything sounds fantastic on this tablet thanks to its enormous JBL speaker and its various sound settings.</p><p>If you’re like me and are generally disappointed by tablet speakers, then the Lenovo Tab Plus Gen 2 will be literal music to your ears. Let me tell you why.</p><div class="product"><a data-dimension112="0c828c66-9cc6-11f1-9c23-354cb9250bf1" data-action="Deal Block" data-label="Tab Plus Gen 2" data-dimension48="Tab Plus Gen 2" data-dimension25="$299" href="https://www.lenovo.com/us/en/p/tablets/android-tablets/lenovo-tab-series/lenovo-tab-plus-gen-2-12.1-inch-mediatek/zaht0078us" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:604px;"><p class="vanilla-image-block" style="padding-top:75.17%;"><img id="FGrhe3k8vbpgSXv4VUWuB7" name="Lenovo Tab Plus Gen 2 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/FGrhe3k8vbpgSXv4VUWuB7-1920-80.jpg" mos="" align="middle" fullscreen="" width="604" height="454" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>On the hunt for a super affordable and lightweight tablet? The Lenovo Tab Plus Gen 2 is currently on sale for $299. It features a 12.1-inch 2.5K 2560 x 1600 multitouch 120Hz display, MediaTek Dimensity 7400 CPU, 8GB of RAM, 128GB SSD, 13MP rear camera, and 8MP front camera.<a class="view-deal button" href="https://www.lenovo.com/us/en/p/tablets/android-tablets/lenovo-tab-series/lenovo-tab-plus-gen-2-12.1-inch-mediatek/zaht0078us" target="_blank" rel="nofollow" data-dimension112="0c828c66-9cc6-11f1-9c23-354cb9250bf1" data-action="Deal Block" data-label="Tab Plus Gen 2" data-dimension48="Tab Plus Gen 2" data-dimension25="$299">View Deal</a></p></div><h2 id="speaker-tech">Speaker tech</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="yfyA9CGCgwXPVkPjvZmM2G" name="Lenovo Tab Plus Gen 2 (speakers)-3" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/yfyA9CGCgwXPVkPjvZmM2G-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Lenovo Tab Plus Gen 2 features a JBL 9-Unit Pro speaker system, tuned by Dolby Atmos. That 9 isn’t superfluous, as it’s exactly how many speakers this thing packs.</p><p>To be specific, this includes four tweeters, three woofers, and two passive radiators. The latter two allow the speaker to produce truly deep bass, while the tweeters handle higher-frequency sounds. Combined, they deliver exceptional audio quality for a tablet.</p><h2 id="my-initial-experience">My initial experience</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LQwfkCsRd3KU5xg7TYEirS" name="Lenovo Tab Plus Gen 2 (speakers)-2" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/LQwfkCsRd3KU5xg7TYEirS-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I decided to go into the deep end right from the start by firing up Amon Amarth’s “We Rule the Waves” to see how the speakers handled melodic death metal at max volume. While the bass was punchy and the overall sound was room-filling, I wasn’t impressed by the thin midrange. This is a demanding genre even for a good speaker system, so I initially chalked it up to that.</p><p>Next, I fired up Lion’s “Transformers” from the legendary (and childhood trauma-inducing) 1986 film. This song sounded better than the Amon Amarth track since everything came through evenly and punchy. 80s songs also aren’t nearly as compressed as modern songs, which also helps.</p><p>After that, I watched an episode of the The Comics Pals on YouTube and was equally stunned by how natural the dialogue sounded. All the panelists came through clearly, even if some had better microphones than others. I also liked how well the speaker handled the dialogue and music in the latest Avengers: Doomsday trailer, making everything sound appropriately cinematic.</p><p>I was already impressed by the out-of-the-box sound experience, but then I realized you could select different sound profiles within settings. This is when I went from impressed to having my mind (or my ears) completely blown.</p><h2 id="optimized-sound">Optimized sound</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RGMAAUoUcWdEr3aZgSmCa" name="Lenovo Tab Plus Gen 2 (speakers)-7" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/RGMAAUoUcWdEr3aZgSmCa-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Dolby Atmos sub-menu is where you can get the Lenovo Tab Plus Gen 2 to sound its absolute best. There are three presets: Dynamic, which identifies the content and automatically adjusts for the best sound; Movie, which provides surround sound and clearer dialogue; and Music, which delivers detailed audio so every note and beat sounds punchy. Music also has its own presets: Detailed, Balanced, and Warm, along with a manual equalizer.</p><p>Listening to the aforementioned songs with the Music preset enabled makes a world of difference, as everything from the highs and mids to the lows packs an appropriate amount of power and bass. </p><p>For Amon Amarth specifically, the Warm preset in Music helps the guttural vocals stand out more. The Transformers track sounded fantastic and made me even more stoked to see the 40th-anniversary screening next month!</p><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:62.50%;"><img id="MkhHwAZkV5kAJXRffwNFpH" name="Lenovo Tab Plus Gen 2 settings" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/MkhHwAZkV5kAJXRffwNFpH-1920-80.png" mos="" align="middle" fullscreen="" width="2560" height="1600" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Lenovo / Tom's Guide)</span></figcaption></figure><p>As you’d expect, Movie mode is perfect for movies, TV shows, and trailers. For instance, I felt like I was in the theater when I fired up the Doomsday trailer again. Dialogue-focused videos also sound fantastic in Movie mode, though I found the sound was a tad richer and fuller in Music mode.</p><p>I didn’t mess around too much with the equalizer settings, as I’m no audio engineer. But I like that this option exists for the true audiophiles out there. While the Dynamic preset is decent enough, its mid-range is too thin to my liking. The Movie and Music presets are the best bet for nearly all the content you’ll be engaging with on this tablet.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XpoNpO"></div>                            </div>                            <script src="https://kwizly.com/embed/XpoNpO.js" async></script><h2 id="music-to-my-ears">Music to my ears</h2><p>If you’re looking for a tablet with phenomenal speaker quality, you can’t do much better than the Lenovo Tab Plus Gen 2. While that giant speaker looks somewhat awkward and makes the slate heavy to hold, it excels at what it's designed for. The out-of-the-box sound is pretty impressive, but it can sound way better with some minor fiddling.</p><p>There’s more to discuss about this entertainment-focused Android tablet, such as its display quality, performance, battery life, and more, so stay tuned for that. But if you found what I said interesting, then don’t hesitate to check out this tablet, especially since it’s pretty affordable at $299. Trust me, your ears will thank you!</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/laptops/i-just-got-invited-to-the-googlebook-september-15-event-in-nyc-this-is-what-i-expect-to-see"><strong>This is what I expect to see at the Googlebook event</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/computing/vr-ar/steam-frame-unboxing-and-tutorial-videos-just-leaked-release-could-be-imminent"><strong>Steam Frame unboxing and tutorial videos just leaked</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/gaming/marvel-tokon-fighting-souls-review"><strong>Marvel Tōkon is now one of my all-time favorite fighting games</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The Motorola MotoPad (2026) might be the new budget tablet king ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Motorola MotoPad (2026) is a light, thin, and affordable tablet with powerful audio, a vibrant display, and all-day battery life. While its MediaTek Dimensity 6300 CPU isn’t winning any benchmarking awards, it is powerful enough to handle light research, web browsing and email management. </p><p>Unfortunately, Motorola also positioned the MotoPad as capable of casual gaming. Which only highlights its dismal graphics performance, as the Arm Mali G-57 integrated GPU struggles with any game more demanding than Candy Crush.</p><p>Despite the MotoPad’s grim graphics performance, it's a great tablet to use as a work or school sidecar in addition to a traditional laptop, and it’s fantastic as a streaming device for your next movie night. But is that enough to make it onto our <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a> list? Let’s take a closer look.</p><h3 class="article-body__section" id="section-motorola-motopad-cheat-sheet"><span>Motorola MotoPad: Cheat sheet</span></h3><ul><li><strong>What is it?: </strong>The Motorola MotoPad is an affordable tablet for every-day use.</li><li><strong>Who is it for?: </strong>Students and professionals who need a lightweight, portable tablet for work, class, or relaxation.</li><li><strong>What does it cost?: The Motorola MotoPad (2026) comes in one </strong><a href="https://www.motorola.com/us/en/p/tablets/moto-pad/zzitztt2575?pn=ZAHU0000US" target="_blank" rel="nofollow"><strong>$249 configuration</strong></a><strong>.</strong></li><li><strong>What do we like?:</strong> The MotoPad has a lightweight, easily portable build, and sports a unique bronze green color aluminum chassis. It’s got powerful audio, all-day battery life, and it's affordable.</li><li><strong>What don’t we like?:</strong> The MotoPad is advertised as capable of casual gaming, but its graphics are underpowered for anything beyond puzzle games.</li></ul><h3 class="article-body__section" id="section-motorola-motopad-specs"><span>Motorola MotoPad: Specs</span></h3><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p>Motorola MotoPad (2026)</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$249</p></td></tr><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>MediaTek Dimensity 6300</p></td></tr><tr><td class="firstcol " ><p><strong>GPU</strong></p></td><td  ><p>Arm Mali G-57 MC2</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>11-inch, 90Hz, 2,560 x 1,600, </p></td></tr><tr><td class="firstcol " ><p><strong>Memory</strong></p></td><td  ><p>8GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>128GB</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>1x USB Type-C 2.0, 1x MicroSD card reader</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>BlueTooth 5.2, WiFi 5, SIM</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>10.02 x 6.54 x 0.28 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>1.06 pounds</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-motorola-motopad-the-ups"><span>Motorola MotoPad: The ups</span></h3><p>The MotoPad has plenty going for it, from its lightweight, stylish design to its robust audio system and crisp display, to its all-day battery life. Combined with its affordable price, the MotoPad is a fantastic bargain.</p><h2 id="lightweight-stylish-design">Lightweight, stylish 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="bezyuEspd5nqDDdoFtnTnD" name="Motorola-MotoPad-design" alt="The Motorola MotoPad (2026) face down on a table showing off its design" src="https://cdn.mos.cms.futurecdn.net/bezyuEspd5nqDDdoFtnTnD-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Motorola MotoPad (2026) comes in a striking Pantone Bronze Green aluminum chassis with modern detailing and a glass camera hub on the back panel that makes it feel like a more premium tablet.</p><p>The MotoPad is also incredibly lightweight at just 1.06 pounds with a thickness of 0.28 inches, making it a lightweight fashion statement that’s easy to slot into a bag or backpack to take to work or school, or even to fit into your carry-on for inflight entertainment on your next vacation.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kmj5s5oGbabbujD8SWKcxH" name="Motorola-MotoPad-USB-C-port" alt="The USB-C port on the bottom of the Motorola MotoPad (2026)" src="https://cdn.mos.cms.futurecdn.net/kmj5s5oGbabbujD8SWKcxH-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The only real drawback in the MotoPad’s design is its lack of ports, as it features just one USB-C port and one 3.5mm Audio Jack. So you’ll need to use bluetooth accessories if you plan to charge the MotoPad while also connecting a keyboard or mouse to it. Then again, most people tend to use bluetooth accessories these days, so that’s not as much of a drawback as it would have been a few years ago.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="KxdcvS2MqZpVi8bEqLkwwM" name="Motorola-MotoPad-camera" alt="A side view of the Motorola MotoPad (2026) showing off its microSD card reader" src="https://cdn.mos.cms.futurecdn.net/KxdcvS2MqZpVi8bEqLkwwM-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The MotoPad also comes with a MicroSD card reader, so you can expand your device storage up to 2TB from the 128GB base storage option. Which is a nice addition for a budget tablet. But the real star of the MotoPad’s design is that unique Pantone Bronze Green colorway, which gives the MotoPad a sense of identity that most budget tablets lack.</p><h2 id="affordable-pricing">Affordable pricing</h2><p>The MotoPad has only one configuration, boasting a MediaTek Dimensity 6300 CPU with integrated Arm Mali G-57 graphics card, 8GB of RAM, a 128GB SSD, and an 11-inch, 90Hz, 2,560 x 1,600, LCD display. That configuration costs just $249, making it one of the more affordable Android tablets on the market.</p><p>It’s a whole $100 cheaper than our <a href="https://www.tomsguide.com/best-picks/best-cheap-tablets">best budget tablet</a> pick, the <a href="https://www.tomsguide.com/computing/ipads/ipad-11-2025-review">Apple iPad 11</a>, and it's less than half the price of our favorite Android tablet, the <a href="https://www.tomsguide.com/computing/android-tablets/oneplus-pad-3">OnePlus Pad 3</a>. Of course, the MotoPad takes a significant performance hit over the OnePlus Pad, but the price differential is nothing to scoff at. In fact, only our favorite budget Android tablet, the <a href="https://www.tomsguide.com/reviews/amazon-fire-hd-10-2023">Amazon Fire HD 10 (2023)</a> is cheaper at $139. And the Fire HD 10 has some serious drawbacks like middling performance and Amazon’s poor app selection holding it back.</p><p>Like most tablets, the MotoPad’s $249 price tag doesn’t include a case or the Moto Pen Ultra ($99). So if you want to protect your tablet and get the most use out of its touchscreen display, you’ll need to invest at least another $100. But even then, you’re still saving compared to the iPad 11 and OnePlus Pad 3.</p><h2 id="ideal-audio-and-display-for-a-video-binge">Ideal audio and display for a video binge</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="H9JL2FaHHAduriCKzacruT" name="Motorola-MotoPad-audio" alt="A closeup shot showing off the Motorola MotoPad (2026)'s quad speakers and Dolby Atmos capabilities" src="https://cdn.mos.cms.futurecdn.net/H9JL2FaHHAduriCKzacruT-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>While the MotoPad does have a 3.5mm audio jack, if you’re just relaxing at home you likely don’t want to use headphones or earbuds. And that’s where the robust quad-speaker system comes in. </p><p>The MotoPad has speakers on both the top and bottom sides of the tablet which gives you great sound balance when held in landscape mode, however the speakers are powerful enough you can use the tablet as a set of portable speakers in either orientation. In fact, I found the most comfortable listening range was at about 20-30 percent rather than the tablet’s full volume.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NsWs9kALVx4U52CmZ4GS2X" name="Motorola-MotoPad-display" alt="The Motorola MotoPad (2026) on a table showing off its display" src="https://cdn.mos.cms.futurecdn.net/NsWs9kALVx4U52CmZ4GS2X-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>That powerful audio combined with the MotoPad’s crisp LCD display, make it an ideal streaming companion for a movie night or Netflix binge session.</p><p>While not the most impressive display we’ve ever tested, the MotoPad’s LCD display does cover 112% of the sRGB color space, which is more than enough vibrancy for most content. And at 430-nits of average brightness, the MotoPad can cut through most indoor glare. Unfortunately, the MotoPad isn’t equipped with HDR, so it’s not the best option to binge the Battle of Winterfell during the final season of <em>Game of Thrones</em>, but most other shows and movies will play just fine on the MotoPad.</p><h2 id="all-day-battery-life">All-day 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="j8SgX6hhvmwoXzkijDk5EZ" name="Motorola MotoPad-2" alt="The Motorola MotoPad (2026) on a table" src="https://cdn.mos.cms.futurecdn.net/j8SgX6hhvmwoXzkijDk5EZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Battery life is as key for a tablet as it is for a laptop, though most tablets haven’t come close to the 24-hour battery life mark the way some recent laptops have. However, you still want at least 8 hours of web surfing battery life on a tablet if you plan to use it for school or for work. And the MotoPad exceeds that threshold handily.</p><p>On our web surfing battery test, the MotoPad (2026) lasted a solid 10 hours and 31 minutes on Wi-Fi, while its battery life dropped down to 10 hours and 1 minute while using LTE data. The Apple iPad 11 lasted 11 hours and 25 minutes on WiFi, and the OnePlus Pad 3 lasted 16 hours and 21 minutes using its adaptive refresh rate setting. The Amazon Fire HD 10 (2023) lasted 12 hours and 39 minutes. While this does put the MotoPad at the bottom of the pack, it's still more than enough battery to last for an 8-hour work day or a full day of classes.</p><h3 class="article-body__section" id="section-motorola-motopad-the-downs"><span>Motorola MotoPad: The downs</span></h3><p>While the MotoPad’s general performance is nothing to write home about, the tablet’s graphics performance is the real let-down.</p><h2 id="middling-performance">Middling performance</h2><p>The MotoPad is on the below-average side of things in terms of performance. The MediaTek Dimensity 6300 is an 8-core, 6nm CPU so it’s not going to be as powerful as the iPad 11’s A16 processor or the OnePlus Pad 3’s Snapdragon 8 Elite. The iPad 11 gets nearly 3x the multicore performance of the MotoPad, while the OnePlus Pad 3 hits nearly 4x the performance on benchmarks  like Geekbench 6 or Adobe Premiere Rush. </p><p>But the MotoPad does have enough computing power to handle web browsing, light research tasks, email management, and casual puzzle games. Which does make it a bit more powerful than the Amazon Fire HD 10, which can slow down when running more intensive tasks.</p><p>The MotoPad is just fine for your average day-to-day computing tasks, but it’s nothing special. And it’s not going to drastically speed up your work or school life.</p><h2 id="dismal-graphics-performance">Dismal graphics 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="pVis6tcrPkNDBFuPz9ehyb" name="Motorola-MotoPad-gaming" alt="The Motorola MotoPad (2026) seen running a demanding mobile game" src="https://cdn.mos.cms.futurecdn.net/pVis6tcrPkNDBFuPz9ehyb-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Unfortunately for Motorola, gaming was part of the MotoPad’s marketing. The MotoPad’s integrated Arm Mali G-57 MC2 graphics card is great for puzzle games like Candy Crush or Block Blast which come pre-installed.Unfortunately, running any game more graphically intense than a puzzle game results in slowdowns, graphics stuttering, and unplayable frame-rates. This is particularly true with action titles like <em>Genshin Impact</em> or <em>Fortnite</em>. If I wasn’t intimately familiar with the controls of both games, I wouldn’t even be able to navigate the menus well enough to do any kind of combat, and even that was a struggle at under 30fps on the lowest possible graphics and resolution presets.</p><p>Granted, I wasn’t expecting much considering the MotoPad barely scraped past 7fps on the 3DMark Wild Life benchmark and was a 2fps slideshow on Wild Life Extreme. So if you want to do any kind of real gaming on the MotoPad, I would highly recommend downloading a game streaming app like Nvidia GeForce Now, because it’s the only way you’ll get decent performance.</p><p>Considering Motorola advertised the MotoPad for “casual gaming,” the grim graphics performance is more of a detriment than if gaming never even made it into the MotoPad’s marketing. While you could argue that <em>Genshin</em> and <em>Fortnite</em> are too intensive on mobile to be considered casual games, they are two of the most popular mobile titles on the market and are considered casual games by the gaming industry. Thus, calling the MotoPad’s casual performance abysmal feels earned.</p><h3 class="article-body__section" id="section-motorola-motopad-review-verdict"><span>Motorola MotoPad review: Verdict</span></h3><p>The Motorola MotoPad (2026) is an ideal work or school companion, and it makes for a fantastic streaming experience thanks to its colorful display and powerful audio system. Its lightweight, bronze green chassis makes it easy to fit into a backpack or bag alongside your work or school laptop, but it also works as a standalone Android device if you just want to watch a few movies and maybe read a book while on vacation. That experience alone is worth praise, but at just $249, it’s an incredible bargain.</p><p>The only pitfall with the MotoPad is its underpowered GPU, but there are ways around that. Game streaming services like Nvidia GeForce Now are available on the Play Store, which will get you a much smoother gaming experience than the native GPU performance. Plus, tablets aren’t exactly a high-performance gaming device anyway.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/android-tablets/the-motorola-motopad-2026-might-be-the-new-budget-tablet-king</link>
                                                                            <description>
                            <![CDATA[ The Motorola MotoPad (2026) is a thin, affordable tablet with a vibrant screen, great audio, and all-day battery, but graphics performance is weak. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">hLD9iV4UxTciHSciD7e56g</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/boEdHyDPxh2knTR5MqZB97-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 16 Jul 2026 12:00:00 +0000</pubDate>                                                                                                                                <updated>Fri, 17 Jul 2026 08:59:50 +0000</updated>
                                                                                                                                            <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                                    <dc:creator><![CDATA[ Madeline Ricchiuto ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/huJopNra2ToeEpbCSHU9MV-320-70.webp ]]></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/boEdHyDPxh2knTR5MqZB97-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Motorola MotoPad (2026) on a table]]></media:description>                                                            <media:text><![CDATA[The Motorola MotoPad (2026) on a table]]></media:text>
                                <media:title type="plain"><![CDATA[The Motorola MotoPad (2026) on a table]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/boEdHyDPxh2knTR5MqZB97-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Motorola MotoPad (2026) is a light, thin, and affordable tablet with powerful audio, a vibrant display, and all-day battery life. While its MediaTek Dimensity 6300 CPU isn’t winning any benchmarking awards, it is powerful enough to handle light research, web browsing and email management. </p><p>Unfortunately, Motorola also positioned the MotoPad as capable of casual gaming. Which only highlights its dismal graphics performance, as the Arm Mali G-57 integrated GPU struggles with any game more demanding than Candy Crush.</p><p>Despite the MotoPad’s grim graphics performance, it's a great tablet to use as a work or school sidecar in addition to a traditional laptop, and it’s fantastic as a streaming device for your next movie night. But is that enough to make it onto our <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a> list? Let’s take a closer look.</p><h3 class="article-body__section" id="section-motorola-motopad-cheat-sheet"><span>Motorola MotoPad: Cheat sheet</span></h3><ul><li><strong>What is it?: </strong>The Motorola MotoPad is an affordable tablet for every-day use.</li><li><strong>Who is it for?: </strong>Students and professionals who need a lightweight, portable tablet for work, class, or relaxation.</li><li><strong>What does it cost?: The Motorola MotoPad (2026) comes in one </strong><a href="https://www.motorola.com/us/en/p/tablets/moto-pad/zzitztt2575?pn=ZAHU0000US" target="_blank" rel="nofollow"><strong>$249 configuration</strong></a><strong>.</strong></li><li><strong>What do we like?:</strong> The MotoPad has a lightweight, easily portable build, and sports a unique bronze green color aluminum chassis. It’s got powerful audio, all-day battery life, and it's affordable.</li><li><strong>What don’t we like?:</strong> The MotoPad is advertised as capable of casual gaming, but its graphics are underpowered for anything beyond puzzle games.</li></ul><h3 class="article-body__section" id="section-motorola-motopad-specs"><span>Motorola MotoPad: Specs</span></h3><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p>Motorola MotoPad (2026)</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$249</p></td></tr><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>MediaTek Dimensity 6300</p></td></tr><tr><td class="firstcol " ><p><strong>GPU</strong></p></td><td  ><p>Arm Mali G-57 MC2</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>11-inch, 90Hz, 2,560 x 1,600, </p></td></tr><tr><td class="firstcol " ><p><strong>Memory</strong></p></td><td  ><p>8GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>128GB</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>1x USB Type-C 2.0, 1x MicroSD card reader</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>BlueTooth 5.2, WiFi 5, SIM</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>10.02 x 6.54 x 0.28 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>1.06 pounds</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-motorola-motopad-the-ups"><span>Motorola MotoPad: The ups</span></h3><p>The MotoPad has plenty going for it, from its lightweight, stylish design to its robust audio system and crisp display, to its all-day battery life. Combined with its affordable price, the MotoPad is a fantastic bargain.</p><h2 id="lightweight-stylish-design">Lightweight, stylish 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="bezyuEspd5nqDDdoFtnTnD" name="Motorola-MotoPad-design" alt="The Motorola MotoPad (2026) face down on a table showing off its design" src="https://cdn.mos.cms.futurecdn.net/bezyuEspd5nqDDdoFtnTnD-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Motorola MotoPad (2026) comes in a striking Pantone Bronze Green aluminum chassis with modern detailing and a glass camera hub on the back panel that makes it feel like a more premium tablet.</p><p>The MotoPad is also incredibly lightweight at just 1.06 pounds with a thickness of 0.28 inches, making it a lightweight fashion statement that’s easy to slot into a bag or backpack to take to work or school, or even to fit into your carry-on for inflight entertainment on your next vacation.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kmj5s5oGbabbujD8SWKcxH" name="Motorola-MotoPad-USB-C-port" alt="The USB-C port on the bottom of the Motorola MotoPad (2026)" src="https://cdn.mos.cms.futurecdn.net/kmj5s5oGbabbujD8SWKcxH-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The only real drawback in the MotoPad’s design is its lack of ports, as it features just one USB-C port and one 3.5mm Audio Jack. So you’ll need to use bluetooth accessories if you plan to charge the MotoPad while also connecting a keyboard or mouse to it. Then again, most people tend to use bluetooth accessories these days, so that’s not as much of a drawback as it would have been a few years ago.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="KxdcvS2MqZpVi8bEqLkwwM" name="Motorola-MotoPad-camera" alt="A side view of the Motorola MotoPad (2026) showing off its microSD card reader" src="https://cdn.mos.cms.futurecdn.net/KxdcvS2MqZpVi8bEqLkwwM-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The MotoPad also comes with a MicroSD card reader, so you can expand your device storage up to 2TB from the 128GB base storage option. Which is a nice addition for a budget tablet. But the real star of the MotoPad’s design is that unique Pantone Bronze Green colorway, which gives the MotoPad a sense of identity that most budget tablets lack.</p><h2 id="affordable-pricing">Affordable pricing</h2><p>The MotoPad has only one configuration, boasting a MediaTek Dimensity 6300 CPU with integrated Arm Mali G-57 graphics card, 8GB of RAM, a 128GB SSD, and an 11-inch, 90Hz, 2,560 x 1,600, LCD display. That configuration costs just $249, making it one of the more affordable Android tablets on the market.</p><p>It’s a whole $100 cheaper than our <a href="https://www.tomsguide.com/best-picks/best-cheap-tablets">best budget tablet</a> pick, the <a href="https://www.tomsguide.com/computing/ipads/ipad-11-2025-review">Apple iPad 11</a>, and it's less than half the price of our favorite Android tablet, the <a href="https://www.tomsguide.com/computing/android-tablets/oneplus-pad-3">OnePlus Pad 3</a>. Of course, the MotoPad takes a significant performance hit over the OnePlus Pad, but the price differential is nothing to scoff at. In fact, only our favorite budget Android tablet, the <a href="https://www.tomsguide.com/reviews/amazon-fire-hd-10-2023">Amazon Fire HD 10 (2023)</a> is cheaper at $139. And the Fire HD 10 has some serious drawbacks like middling performance and Amazon’s poor app selection holding it back.</p><p>Like most tablets, the MotoPad’s $249 price tag doesn’t include a case or the Moto Pen Ultra ($99). So if you want to protect your tablet and get the most use out of its touchscreen display, you’ll need to invest at least another $100. But even then, you’re still saving compared to the iPad 11 and OnePlus Pad 3.</p><h2 id="ideal-audio-and-display-for-a-video-binge">Ideal audio and display for a video binge</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="H9JL2FaHHAduriCKzacruT" name="Motorola-MotoPad-audio" alt="A closeup shot showing off the Motorola MotoPad (2026)'s quad speakers and Dolby Atmos capabilities" src="https://cdn.mos.cms.futurecdn.net/H9JL2FaHHAduriCKzacruT-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>While the MotoPad does have a 3.5mm audio jack, if you’re just relaxing at home you likely don’t want to use headphones or earbuds. And that’s where the robust quad-speaker system comes in. </p><p>The MotoPad has speakers on both the top and bottom sides of the tablet which gives you great sound balance when held in landscape mode, however the speakers are powerful enough you can use the tablet as a set of portable speakers in either orientation. In fact, I found the most comfortable listening range was at about 20-30 percent rather than the tablet’s full volume.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NsWs9kALVx4U52CmZ4GS2X" name="Motorola-MotoPad-display" alt="The Motorola MotoPad (2026) on a table showing off its display" src="https://cdn.mos.cms.futurecdn.net/NsWs9kALVx4U52CmZ4GS2X-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>That powerful audio combined with the MotoPad’s crisp LCD display, make it an ideal streaming companion for a movie night or Netflix binge session.</p><p>While not the most impressive display we’ve ever tested, the MotoPad’s LCD display does cover 112% of the sRGB color space, which is more than enough vibrancy for most content. And at 430-nits of average brightness, the MotoPad can cut through most indoor glare. Unfortunately, the MotoPad isn’t equipped with HDR, so it’s not the best option to binge the Battle of Winterfell during the final season of <em>Game of Thrones</em>, but most other shows and movies will play just fine on the MotoPad.</p><h2 id="all-day-battery-life">All-day 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="j8SgX6hhvmwoXzkijDk5EZ" name="Motorola MotoPad-2" alt="The Motorola MotoPad (2026) on a table" src="https://cdn.mos.cms.futurecdn.net/j8SgX6hhvmwoXzkijDk5EZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Battery life is as key for a tablet as it is for a laptop, though most tablets haven’t come close to the 24-hour battery life mark the way some recent laptops have. However, you still want at least 8 hours of web surfing battery life on a tablet if you plan to use it for school or for work. And the MotoPad exceeds that threshold handily.</p><p>On our web surfing battery test, the MotoPad (2026) lasted a solid 10 hours and 31 minutes on Wi-Fi, while its battery life dropped down to 10 hours and 1 minute while using LTE data. The Apple iPad 11 lasted 11 hours and 25 minutes on WiFi, and the OnePlus Pad 3 lasted 16 hours and 21 minutes using its adaptive refresh rate setting. The Amazon Fire HD 10 (2023) lasted 12 hours and 39 minutes. While this does put the MotoPad at the bottom of the pack, it's still more than enough battery to last for an 8-hour work day or a full day of classes.</p><h3 class="article-body__section" id="section-motorola-motopad-the-downs"><span>Motorola MotoPad: The downs</span></h3><p>While the MotoPad’s general performance is nothing to write home about, the tablet’s graphics performance is the real let-down.</p><h2 id="middling-performance">Middling performance</h2><p>The MotoPad is on the below-average side of things in terms of performance. The MediaTek Dimensity 6300 is an 8-core, 6nm CPU so it’s not going to be as powerful as the iPad 11’s A16 processor or the OnePlus Pad 3’s Snapdragon 8 Elite. The iPad 11 gets nearly 3x the multicore performance of the MotoPad, while the OnePlus Pad 3 hits nearly 4x the performance on benchmarks  like Geekbench 6 or Adobe Premiere Rush. </p><p>But the MotoPad does have enough computing power to handle web browsing, light research tasks, email management, and casual puzzle games. Which does make it a bit more powerful than the Amazon Fire HD 10, which can slow down when running more intensive tasks.</p><p>The MotoPad is just fine for your average day-to-day computing tasks, but it’s nothing special. And it’s not going to drastically speed up your work or school life.</p><h2 id="dismal-graphics-performance">Dismal graphics 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="pVis6tcrPkNDBFuPz9ehyb" name="Motorola-MotoPad-gaming" alt="The Motorola MotoPad (2026) seen running a demanding mobile game" src="https://cdn.mos.cms.futurecdn.net/pVis6tcrPkNDBFuPz9ehyb-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Unfortunately for Motorola, gaming was part of the MotoPad’s marketing. The MotoPad’s integrated Arm Mali G-57 MC2 graphics card is great for puzzle games like Candy Crush or Block Blast which come pre-installed.Unfortunately, running any game more graphically intense than a puzzle game results in slowdowns, graphics stuttering, and unplayable frame-rates. This is particularly true with action titles like <em>Genshin Impact</em> or <em>Fortnite</em>. If I wasn’t intimately familiar with the controls of both games, I wouldn’t even be able to navigate the menus well enough to do any kind of combat, and even that was a struggle at under 30fps on the lowest possible graphics and resolution presets.</p><p>Granted, I wasn’t expecting much considering the MotoPad barely scraped past 7fps on the 3DMark Wild Life benchmark and was a 2fps slideshow on Wild Life Extreme. So if you want to do any kind of real gaming on the MotoPad, I would highly recommend downloading a game streaming app like Nvidia GeForce Now, because it’s the only way you’ll get decent performance.</p><p>Considering Motorola advertised the MotoPad for “casual gaming,” the grim graphics performance is more of a detriment than if gaming never even made it into the MotoPad’s marketing. While you could argue that <em>Genshin</em> and <em>Fortnite</em> are too intensive on mobile to be considered casual games, they are two of the most popular mobile titles on the market and are considered casual games by the gaming industry. Thus, calling the MotoPad’s casual performance abysmal feels earned.</p><h3 class="article-body__section" id="section-motorola-motopad-review-verdict"><span>Motorola MotoPad review: Verdict</span></h3><p>The Motorola MotoPad (2026) is an ideal work or school companion, and it makes for a fantastic streaming experience thanks to its colorful display and powerful audio system. Its lightweight, bronze green chassis makes it easy to fit into a backpack or bag alongside your work or school laptop, but it also works as a standalone Android device if you just want to watch a few movies and maybe read a book while on vacation. That experience alone is worth praise, but at just $249, it’s an incredible bargain.</p><p>The only pitfall with the MotoPad is its underpowered GPU, but there are ways around that. Game streaming services like Nvidia GeForce Now are available on the Play Store, which will get you a much smoother gaming experience than the native GPU performance. Plus, tablets aren’t exactly a high-performance gaming device anyway.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 5 early Prime Day tablet deals worth your money — Lenovo, TCL and iPads for up to 27% off ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The next <a href="https://www.tomsguide.com/news/best-prime-day-deals-and-sales">Prime Day</a> event launches on June 23, which means it’ll be your opportunity to save some cash on your next tablet. While the big sales haven’t hit just yet, some worthwhile deals are happening right now.</p><p>For instance, you can <a href="https://www.amazon.com/TCL-TAB-A1-Plus-Entertainment/dp/B0GS1JK2SV" target="_blank" rel="nofollow">save $80 off the TCL Tab A1 Plus</a> and <a href="https://www.amazon.com/Lenovo-MediaTek-Octa-Core-1920x1200-Light-Sensor/dp/B0CQMGKBK9" target="_blank" rel="nofollow">$40 off the Lenovo Tab M11</a> if you’re looking for an Android tablet. Want an iPad instead? Well, <a href="https://www.amazon.com/Apple-iPad-11-inch-Display-All-Day/dp/B0DZ77D5HL" target="_blank" rel="nofollow">the base iPad 11 is currently $50 off</a>, while <a href="https://www.amazon.com/dp/B0FWCXJVHN" target="_blank" rel="nofollow">the 11-inch iPad Pro M5 has been discounted by $62</a>.</p><p>There isn’t much to choose from at the moment from well-known brands, but I’ll update this post with the latest deals as we get closer to Prime Day, when we’ll surely see better offerings. Now, here are 5 early Prime Day deals to check out.</p><p>Also, if you’re not yet an Amazon Prime member, you can <a href="https://www.amazon.com/amazonprime" target="_blank" rel="nofollow">sign up for a free 30-day trial at Amazon</a> and <a href="https://www.amazon.com/amazonprime?primeCampaignId=studentWlpPrimeRedir" target="_blank" rel="nofollow">students can get a 6-month free trial</a>. For more ways to save, check out the <a href="https://www.tomsguide.com/savings-squad">Tom's Guide Savings Squad</a> as well as our list of the best <a href="https://www.tomsguide.com/coupons/amazon.com">Amazon promo codes</a> this week. </p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><strong>Lenovo Tab M11: </strong><a href="https://www.amazon.com/Lenovo-MediaTek-Octa-Core-1920x1200-Light-Sensor/dp/B0CQMGKBK9" target="_blank" rel="nofollow"><strong>was $249 now $209 @ Amazon</strong></a><strong></strong></li><li><strong>TCL Tab A1 Plus: </strong><a href="https://www.amazon.com/TCL-TAB-A1-Plus-Entertainment/dp/B0GS1JK2SV" target="_blank" rel="nofollow"><strong>was $299 now $279 @ Amazon</strong></a></li><li><strong>11" iPad (A16): </strong><a href="https://www.amazon.com/Apple-iPad-11-inch-Display-All-Day/dp/B0DZ77D5HL" target="_blank" rel="nofollow"><strong>was $349 now $299 @ Amazon</strong></a></li><li><strong>11" iPad Air (M4): </strong><a href="https://www.amazon.com/Apple-iPad-Air-11-inch-M4/dp/B0GQVBJT4J" target="_blank" rel="nofollow"><strong>was $599 now $559 @ Amazon</strong></a></li><li><strong>11" iPad Pro (M5): </strong><a href="https://www.amazon.com/dp/B0FWCXJVHN" target="_blank" rel="nofollow"><strong>was $999 now $937 @ Amazon</strong></a></li></ul><h3 class="article-body__section" id="section-early-prime-day-tablet-deals"><span>Early Prime Day tablet deals</span></h3><div class="product"><a data-dimension112="b4988528-0b66-407e-96b2-0e1e6631bfe7" data-action="Deal Block" data-label="Tab M11" data-dimension48="Tab M11" data-dimension25="$209" href="https://www.amazon.com/Lenovo-MediaTek-Octa-Core-1920x1200-Light-Sensor/dp/B0CQMGKBK9" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="o5Rc2NcN4CUySEAJUBeBi4" name="Lenovo Tab M11" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/o5Rc2NcN4CUySEAJUBeBi4-1920-80.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This Lenovo Tab M11 might not be the most powerful slate out there, but it'll get the job done if you mainly want to watch streaming videos or do some sketching. It has an 11-inch 1920 x 1200 LCD display, a MediaTek Helio G88 processor, 4GB of RAM, and a 128GB SSD.<a class="view-deal button" href="https://www.amazon.com/Lenovo-MediaTek-Octa-Core-1920x1200-Light-Sensor/dp/B0CQMGKBK9" target="_blank" rel="nofollow" data-dimension112="b4988528-0b66-407e-96b2-0e1e6631bfe7" data-action="Deal Block" data-label="Tab M11" data-dimension48="Tab M11" data-dimension25="$209">View Deal</a></p></div><div class="product"><a data-dimension112="05693e55-0f66-4cfe-ad98-e2a5b0c576fc" data-action="Deal Block" data-label="Tab A1 Plus" data-dimension48="Tab A1 Plus" data-dimension25="$278.5" href="https://www.amazon.com/TCL-TAB-A1-Plus-Entertainment/dp/B0GS1JK2SV" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1497px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="eALW3tEHxz63pJinHv7pP4" name="TCL Tab A1 Plus" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/eALW3tEHxz63pJinHv7pP4-1920-80.jpg" mos="" align="middle" fullscreen="" width="1497" height="1497" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you're looking for a more powerful Android tablet that's still affordable, the TCL Tab A1 Plus is a solid choice. This model features a 12.2-inch 2.4K display with a 120Hz refresh rate, 16GB of RAM, and a generous 128GB of storage. The Snapdragon 4 Gen 2 processor inside is more than capable for streaming videos and even some light gaming.<a class="view-deal button" href="https://www.amazon.com/TCL-TAB-A1-Plus-Entertainment/dp/B0GS1JK2SV" target="_blank" rel="nofollow" data-dimension112="05693e55-0f66-4cfe-ad98-e2a5b0c576fc" data-action="Deal Block" data-label="Tab A1 Plus" data-dimension48="Tab A1 Plus" data-dimension25="$278.5">View Deal</a></p></div><div class="product"><a data-dimension112="bf163e7e-3aa9-401c-9c24-439b2e7966a7" data-action="Deal Block" data-label="11" iPad (WiFi/128GB)" data-dimension48="11" iPad (WiFi/128GB)" data-dimension25="$299" href="https://www.amazon.com/Apple-iPad-11-inch-Display-All-Day/dp/B0DZ77D5HL" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1325px;"><p class="vanilla-image-block" style="padding-top:113.21%;"><img id="oi25obYHzoyNfMHoycGamh" name="iPad 2022 Blue.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/oi25obYHzoyNfMHoycGamh-1920-80.jpg" mos="" align="middle" fullscreen="" width="1325" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Apple-iPad-11-inch-Display-All-Day/dp/B0DZ77D5HL" target="_blank" rel="nofollow" data-dimension112="bf163e7e-3aa9-401c-9c24-439b2e7966a7" data-action="Deal Block" data-label='11" iPad (WiFi/128GB)' data-dimension48='11" iPad (WiFi/128GB)' data-dimension25="$299">11" iPad (WiFi/128GB): was $349 now $299</a></strong><br>The 2025 iPad features a larger 11-inch (2360 x 1640) screen, A16 CPU, 12MP rear/front cameras, USB-C connectivity, and Magic Keyboard Folio ($249) support. The base model features 128GB of storage, which double the capacity of its predecessor. It's available in 128GB, 256GB, and 512GB capacities.<a class="view-deal button" href="https://www.amazon.com/Apple-iPad-11-inch-Display-All-Day/dp/B0DZ77D5HL" target="_blank" rel="nofollow" data-dimension112="bf163e7e-3aa9-401c-9c24-439b2e7966a7" data-action="Deal Block" data-label="11" iPad (WiFi/128GB)" data-dimension48="11" iPad (WiFi/128GB)" data-dimension25="$299">View Deal</a></p></div><div class="product"><a data-dimension112="1595d7ed-d903-4068-834c-4a2b8fe10ba0" data-action="Deal Block" data-label="11" iPad Air (WiFi/128GB)" data-dimension48="11" iPad Air (WiFi/128GB)" data-dimension25="$559" href="https://www.amazon.com/Apple-iPad-Air-11-inch-M4/dp/B0GQVBJT4J" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1325px;"><p class="vanilla-image-block" style="padding-top:113.21%;"><img id="NVZkwX7FuVd3CYdiYHdsgm" name="iPad Air 11 2024 deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/NVZkwX7FuVd3CYdiYHdsgm-1920-80.jpg" mos="" align="middle" fullscreen="" width="1325" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Apple-iPad-Air-11-inch-M4/dp/B0GQVBJT4J" target="_blank" rel="nofollow" data-dimension112="1595d7ed-d903-4068-834c-4a2b8fe10ba0" data-action="Deal Block" data-label='11" iPad Air (WiFi/128GB)' data-dimension48='11" iPad Air (WiFi/128GB)' data-dimension25="$559">11" iPad Air (WiFi/128GB): was $599 now $559</a></strong><br>The 2026 iPad Air packs Apple's M4 processor, which Apple states is up to 30 percent faster than the iPad Air with M3. It also has an 11-inch LED display (2360 x 1640), 128GB of storage, a 12MP rear camera, and a 12MP front camera. The tablet now supports Wi-Fi 7, Bluetooth 6, and Thread. In our <a href="https://www.tomsguide.com/computing/ipads/apple-ipad-air-m4-review-small-tweaks-to-the-gold-standard">iPad Air M4 review</a>, we said the upgrades are modest, but the iPad Air remains the best tablet on the market.<a class="view-deal button" href="https://www.amazon.com/Apple-iPad-Air-11-inch-M4/dp/B0GQVBJT4J" target="_blank" rel="nofollow" data-dimension112="1595d7ed-d903-4068-834c-4a2b8fe10ba0" data-action="Deal Block" data-label="11" iPad Air (WiFi/128GB)" data-dimension48="11" iPad Air (WiFi/128GB)" data-dimension25="$559">View Deal</a></p></div><div class="product"><a data-dimension112="44b29820-8aaa-4fcc-bf1d-f43d349bafb6" data-action="Deal Block" data-label="iPad Pro M5 11" (Wi-Fi/256GB)" data-dimension48="iPad Pro M5 11" (Wi-Fi/256GB)" data-dimension25="$937" href="https://www.amazon.com/dp/B0FWCXJVHN" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1308px;"><p class="vanilla-image-block" style="padding-top:114.68%;"><img id="kVGdyTH2y4y4yS5Mwos2bg" name="iPad Pro M5 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/kVGdyTH2y4y4yS5Mwos2bg-1920-80.jpg" mos="" align="middle" fullscreen="" width="1308" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/dp/B0FWCXJVHN" target="_blank" rel="nofollow" data-dimension112="44b29820-8aaa-4fcc-bf1d-f43d349bafb6" data-action="Deal Block" data-label='iPad Pro M5 11" (Wi-Fi/256GB)' data-dimension48='iPad Pro M5 11" (Wi-Fi/256GB)' data-dimension25="$937">iPad Pro M5 11" (Wi-Fi/256GB): was $999 now $937</a></strong><br>This iPad Pro packs Apple's latest M5 processor, paired with a stunning 11-inch Ultra Retina XDR OLED display (2420 x 1668). The new M5 processor features 9 CPU cores and 10 GPU cores. It also features a landscape 12MP Center Stage camera and a 12MP Wide camera with adaptive True Tone flash. In our <a href="https://www.tomsguide.com/computing/ipads/ipad-pro-m5-review">iPad Pro M5 review,</a> we said this is "the most powerful tablet ever." <a class="view-deal button" href="https://www.amazon.com/dp/B0FWCXJVHN" target="_blank" rel="nofollow" data-dimension112="44b29820-8aaa-4fcc-bf1d-f43d349bafb6" data-action="Deal Block" data-label="iPad Pro M5 11" (Wi-Fi/256GB)" data-dimension48="iPad Pro M5 11" (Wi-Fi/256GB)" data-dimension25="$937">View Deal</a></p></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/tablets/best-early-prime-day-tablet-deals</link>
                                                                            <description>
                            <![CDATA[ Looking for a new tablet? If so, here are 5 early Amazon Prime Day tablet deals worth your money, from Android tablets to iPads. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">5jYSty4NtnE9fZvMjvL6i5</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/S3BJ6ra54aiDHT5j9bTspF-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 16 Jun 2026 11:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                                                                <author><![CDATA[ tony.polanco@futurenet.com (Tony Polanco) ]]></author>                    <dc:creator><![CDATA[ Tony Polanco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/atzRNqFt5wYgEUPBDahWsD-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/S3BJ6ra54aiDHT5j9bTspF-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iPad (2025)]]></media:description>                                                            <media:text><![CDATA[iPad (2025)]]></media:text>
                                <media:title type="plain"><![CDATA[iPad (2025)]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/S3BJ6ra54aiDHT5j9bTspF-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The next <a href="https://www.tomsguide.com/news/best-prime-day-deals-and-sales">Prime Day</a> event launches on June 23, which means it’ll be your opportunity to save some cash on your next tablet. While the big sales haven’t hit just yet, some worthwhile deals are happening right now.</p><p>For instance, you can <a href="https://www.amazon.com/TCL-TAB-A1-Plus-Entertainment/dp/B0GS1JK2SV" target="_blank" rel="nofollow">save $80 off the TCL Tab A1 Plus</a> and <a href="https://www.amazon.com/Lenovo-MediaTek-Octa-Core-1920x1200-Light-Sensor/dp/B0CQMGKBK9" target="_blank" rel="nofollow">$40 off the Lenovo Tab M11</a> if you’re looking for an Android tablet. Want an iPad instead? Well, <a href="https://www.amazon.com/Apple-iPad-11-inch-Display-All-Day/dp/B0DZ77D5HL" target="_blank" rel="nofollow">the base iPad 11 is currently $50 off</a>, while <a href="https://www.amazon.com/dp/B0FWCXJVHN" target="_blank" rel="nofollow">the 11-inch iPad Pro M5 has been discounted by $62</a>.</p><p>There isn’t much to choose from at the moment from well-known brands, but I’ll update this post with the latest deals as we get closer to Prime Day, when we’ll surely see better offerings. Now, here are 5 early Prime Day deals to check out.</p><p>Also, if you’re not yet an Amazon Prime member, you can <a href="https://www.amazon.com/amazonprime" target="_blank" rel="nofollow">sign up for a free 30-day trial at Amazon</a> and <a href="https://www.amazon.com/amazonprime?primeCampaignId=studentWlpPrimeRedir" target="_blank" rel="nofollow">students can get a 6-month free trial</a>. For more ways to save, check out the <a href="https://www.tomsguide.com/savings-squad">Tom's Guide Savings Squad</a> as well as our list of the best <a href="https://www.tomsguide.com/coupons/amazon.com">Amazon promo codes</a> this week. </p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><strong>Lenovo Tab M11: </strong><a href="https://www.amazon.com/Lenovo-MediaTek-Octa-Core-1920x1200-Light-Sensor/dp/B0CQMGKBK9" target="_blank" rel="nofollow"><strong>was $249 now $209 @ Amazon</strong></a><strong></strong></li><li><strong>TCL Tab A1 Plus: </strong><a href="https://www.amazon.com/TCL-TAB-A1-Plus-Entertainment/dp/B0GS1JK2SV" target="_blank" rel="nofollow"><strong>was $299 now $279 @ Amazon</strong></a></li><li><strong>11" iPad (A16): </strong><a href="https://www.amazon.com/Apple-iPad-11-inch-Display-All-Day/dp/B0DZ77D5HL" target="_blank" rel="nofollow"><strong>was $349 now $299 @ Amazon</strong></a></li><li><strong>11" iPad Air (M4): </strong><a href="https://www.amazon.com/Apple-iPad-Air-11-inch-M4/dp/B0GQVBJT4J" target="_blank" rel="nofollow"><strong>was $599 now $559 @ Amazon</strong></a></li><li><strong>11" iPad Pro (M5): </strong><a href="https://www.amazon.com/dp/B0FWCXJVHN" target="_blank" rel="nofollow"><strong>was $999 now $937 @ Amazon</strong></a></li></ul><h3 class="article-body__section" id="section-early-prime-day-tablet-deals"><span>Early Prime Day tablet deals</span></h3><div class="product"><a data-dimension112="b4988528-0b66-407e-96b2-0e1e6631bfe7" data-action="Deal Block" data-label="Tab M11" data-dimension48="Tab M11" data-dimension25="$209" href="https://www.amazon.com/Lenovo-MediaTek-Octa-Core-1920x1200-Light-Sensor/dp/B0CQMGKBK9" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="o5Rc2NcN4CUySEAJUBeBi4" name="Lenovo Tab M11" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/o5Rc2NcN4CUySEAJUBeBi4-1920-80.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This Lenovo Tab M11 might not be the most powerful slate out there, but it'll get the job done if you mainly want to watch streaming videos or do some sketching. It has an 11-inch 1920 x 1200 LCD display, a MediaTek Helio G88 processor, 4GB of RAM, and a 128GB SSD.<a class="view-deal button" href="https://www.amazon.com/Lenovo-MediaTek-Octa-Core-1920x1200-Light-Sensor/dp/B0CQMGKBK9" target="_blank" rel="nofollow" data-dimension112="b4988528-0b66-407e-96b2-0e1e6631bfe7" data-action="Deal Block" data-label="Tab M11" data-dimension48="Tab M11" data-dimension25="$209">View Deal</a></p></div><div class="product"><a data-dimension112="05693e55-0f66-4cfe-ad98-e2a5b0c576fc" data-action="Deal Block" data-label="Tab A1 Plus" data-dimension48="Tab A1 Plus" data-dimension25="$278.5" href="https://www.amazon.com/TCL-TAB-A1-Plus-Entertainment/dp/B0GS1JK2SV" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1497px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="eALW3tEHxz63pJinHv7pP4" name="TCL Tab A1 Plus" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/eALW3tEHxz63pJinHv7pP4-1920-80.jpg" mos="" align="middle" fullscreen="" width="1497" height="1497" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you're looking for a more powerful Android tablet that's still affordable, the TCL Tab A1 Plus is a solid choice. This model features a 12.2-inch 2.4K display with a 120Hz refresh rate, 16GB of RAM, and a generous 128GB of storage. The Snapdragon 4 Gen 2 processor inside is more than capable for streaming videos and even some light gaming.<a class="view-deal button" href="https://www.amazon.com/TCL-TAB-A1-Plus-Entertainment/dp/B0GS1JK2SV" target="_blank" rel="nofollow" data-dimension112="05693e55-0f66-4cfe-ad98-e2a5b0c576fc" data-action="Deal Block" data-label="Tab A1 Plus" data-dimension48="Tab A1 Plus" data-dimension25="$278.5">View Deal</a></p></div><div class="product"><a data-dimension112="bf163e7e-3aa9-401c-9c24-439b2e7966a7" data-action="Deal Block" data-label="11" iPad (WiFi/128GB)" data-dimension48="11" iPad (WiFi/128GB)" data-dimension25="$299" href="https://www.amazon.com/Apple-iPad-11-inch-Display-All-Day/dp/B0DZ77D5HL" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1325px;"><p class="vanilla-image-block" style="padding-top:113.21%;"><img id="oi25obYHzoyNfMHoycGamh" name="iPad 2022 Blue.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/oi25obYHzoyNfMHoycGamh-1920-80.jpg" mos="" align="middle" fullscreen="" width="1325" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Apple-iPad-11-inch-Display-All-Day/dp/B0DZ77D5HL" target="_blank" rel="nofollow" data-dimension112="bf163e7e-3aa9-401c-9c24-439b2e7966a7" data-action="Deal Block" data-label='11" iPad (WiFi/128GB)' data-dimension48='11" iPad (WiFi/128GB)' data-dimension25="$299">11" iPad (WiFi/128GB): was $349 now $299</a></strong><br>The 2025 iPad features a larger 11-inch (2360 x 1640) screen, A16 CPU, 12MP rear/front cameras, USB-C connectivity, and Magic Keyboard Folio ($249) support. The base model features 128GB of storage, which double the capacity of its predecessor. It's available in 128GB, 256GB, and 512GB capacities.<a class="view-deal button" href="https://www.amazon.com/Apple-iPad-11-inch-Display-All-Day/dp/B0DZ77D5HL" target="_blank" rel="nofollow" data-dimension112="bf163e7e-3aa9-401c-9c24-439b2e7966a7" data-action="Deal Block" data-label="11" iPad (WiFi/128GB)" data-dimension48="11" iPad (WiFi/128GB)" data-dimension25="$299">View Deal</a></p></div><div class="product"><a data-dimension112="1595d7ed-d903-4068-834c-4a2b8fe10ba0" data-action="Deal Block" data-label="11" iPad Air (WiFi/128GB)" data-dimension48="11" iPad Air (WiFi/128GB)" data-dimension25="$559" href="https://www.amazon.com/Apple-iPad-Air-11-inch-M4/dp/B0GQVBJT4J" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1325px;"><p class="vanilla-image-block" style="padding-top:113.21%;"><img id="NVZkwX7FuVd3CYdiYHdsgm" name="iPad Air 11 2024 deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/NVZkwX7FuVd3CYdiYHdsgm-1920-80.jpg" mos="" align="middle" fullscreen="" width="1325" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Apple-iPad-Air-11-inch-M4/dp/B0GQVBJT4J" target="_blank" rel="nofollow" data-dimension112="1595d7ed-d903-4068-834c-4a2b8fe10ba0" data-action="Deal Block" data-label='11" iPad Air (WiFi/128GB)' data-dimension48='11" iPad Air (WiFi/128GB)' data-dimension25="$559">11" iPad Air (WiFi/128GB): was $599 now $559</a></strong><br>The 2026 iPad Air packs Apple's M4 processor, which Apple states is up to 30 percent faster than the iPad Air with M3. It also has an 11-inch LED display (2360 x 1640), 128GB of storage, a 12MP rear camera, and a 12MP front camera. The tablet now supports Wi-Fi 7, Bluetooth 6, and Thread. In our <a href="https://www.tomsguide.com/computing/ipads/apple-ipad-air-m4-review-small-tweaks-to-the-gold-standard">iPad Air M4 review</a>, we said the upgrades are modest, but the iPad Air remains the best tablet on the market.<a class="view-deal button" href="https://www.amazon.com/Apple-iPad-Air-11-inch-M4/dp/B0GQVBJT4J" target="_blank" rel="nofollow" data-dimension112="1595d7ed-d903-4068-834c-4a2b8fe10ba0" data-action="Deal Block" data-label="11" iPad Air (WiFi/128GB)" data-dimension48="11" iPad Air (WiFi/128GB)" data-dimension25="$559">View Deal</a></p></div><div class="product"><a data-dimension112="44b29820-8aaa-4fcc-bf1d-f43d349bafb6" data-action="Deal Block" data-label="iPad Pro M5 11" (Wi-Fi/256GB)" data-dimension48="iPad Pro M5 11" (Wi-Fi/256GB)" data-dimension25="$937" href="https://www.amazon.com/dp/B0FWCXJVHN" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1308px;"><p class="vanilla-image-block" style="padding-top:114.68%;"><img id="kVGdyTH2y4y4yS5Mwos2bg" name="iPad Pro M5 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/kVGdyTH2y4y4yS5Mwos2bg-1920-80.jpg" mos="" align="middle" fullscreen="" width="1308" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/dp/B0FWCXJVHN" target="_blank" rel="nofollow" data-dimension112="44b29820-8aaa-4fcc-bf1d-f43d349bafb6" data-action="Deal Block" data-label='iPad Pro M5 11" (Wi-Fi/256GB)' data-dimension48='iPad Pro M5 11" (Wi-Fi/256GB)' data-dimension25="$937">iPad Pro M5 11" (Wi-Fi/256GB): was $999 now $937</a></strong><br>This iPad Pro packs Apple's latest M5 processor, paired with a stunning 11-inch Ultra Retina XDR OLED display (2420 x 1668). The new M5 processor features 9 CPU cores and 10 GPU cores. It also features a landscape 12MP Center Stage camera and a 12MP Wide camera with adaptive True Tone flash. In our <a href="https://www.tomsguide.com/computing/ipads/ipad-pro-m5-review">iPad Pro M5 review,</a> we said this is "the most powerful tablet ever." <a class="view-deal button" href="https://www.amazon.com/dp/B0FWCXJVHN" target="_blank" rel="nofollow" data-dimension112="44b29820-8aaa-4fcc-bf1d-f43d349bafb6" data-action="Deal Block" data-label="iPad Pro M5 11" (Wi-Fi/256GB)" data-dimension48="iPad Pro M5 11" (Wi-Fi/256GB)" data-dimension25="$937">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I thought smaller was better until I tried a massive 14-inch tablet that feels like a clipboard ]]></title>
                                                                                                <dc:content><![CDATA[ <p>From the <a href="https://www.tomsguide.com/computing/tablets/i-thought-the-ipad-mini-was-the-perfect-small-tablet-until-i-tried-the-lenovo-legion-tab-3-heres-why">Nexus 7</a> to the <a href="https://www.tomsguide.com/tablets/i-spent-two-weeks-with-the-ipad-mini-7-and-it-reignited-my-love-for-smaller-tablets">iPad mini</a>, I’ve always preferred smaller tablets you can hold in one hand and easily slip into a bag, which is why I was so surprised when I found myself reaching for an absolutely massive 14.3-inch slate instead.</p><p>Unlike other tablets where specs and sheer power are the main draw, the screen itself is why you’d choose a device like the TCL NXTPAPER 14 over something more conventional. Its specs are nothing to scoff at either though, with 8GB of RAM, 256GB of storage and a whopping 10,000 mAh battery under the hood. However, the paper-like feel of its matte display and how you can go from a dedicated black and white ink mode to color paper mode with the push of a button is the kind of thing you truly have to see for yourself.</p><p>Although I tested out its smaller, more powerful sibling the <a href="https://www.tomsguide.com/computing/tablets/i-tried-the-tcl-nxtpaper-11-plus-and-this-budget-tablet-is-easily-my-ipad-killer-heres-why">TCL NXTPAPER 11 Plus</a>, it was the NXTPAPER 14 that first caught my eye. Even under harsh direct lighting, its larger screen remained completely glare and reflection-free. Now, I finally had a chance to use it in the real world and not just at a mall in Taiwan.</p><p>I’ve been using the NXTPAPER 14 for the past few months and while it may not end up being my daily driver, there’s certainly a place for larger tablets like this one — especially if you’d rather carry something more substantial under your arm.</p><div class="product"><a data-dimension112="9a7290b1-b771-497a-aab4-dd39ed2c8af3" data-action="Deal Block" data-label="NXTPAPER 14" data-dimension48="NXTPAPER 14" data-dimension25="$369" href="https://www.amazon.com/TCL-NXTPAPER-Paper-Like-4096-Level-Multi-Window/dp/B0FLP554CZ" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1479px;"><p class="vanilla-image-block" style="padding-top:78.23%;"><img id="RieyhMD4q8Qys2uDrwLwWP" name="NXTPAPER 14" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/RieyhMD4q8Qys2uDrwLwWP-1920-80.jpg" mos="" align="middle" fullscreen="" width="1479" height="1157" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This 14.3-inch Android tablet boasts a 10,000 mAh battery and a 2.4K display, but it’s the NXTPAPER 3.0 tech and 3:2 aspect ratio that really make it stand out. You get a paper-like feel when scrolling through documents or taking notes with the included T-Pen. The NXTPAPER 14 also comes with a folio-style carrying case.<a class="view-deal button" href="https://www.amazon.com/TCL-NXTPAPER-Paper-Like-4096-Level-Multi-Window/dp/B0FLP554CZ" target="_blank" rel="nofollow" data-dimension112="9a7290b1-b771-497a-aab4-dd39ed2c8af3" data-action="Deal Block" data-label="NXTPAPER 14" data-dimension48="NXTPAPER 14" data-dimension25="$369">View Deal</a></p></div><h2 id="from-tablet-to-portfolio">From tablet to portfolio</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kwnabDFk2FBcRtYVfTZdmW" name="TCL NXTPAPER 14--3" alt="The TCL NXTPAPER 14 unboxed on a desk" src="https://cdn.mos.cms.futurecdn.net/kwnabDFk2FBcRtYVfTZdmW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>One thing I immediately appreciated about the NXTPAPER 14 is how TCL provides you with everything you need right in the box. You get a folio-style case with a magnetic cover, a lengthy charging cable and more surprisingly, a pressure-sensitive, active stylus with a USB-C port on the side for charging.</p><p>Even with many of the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a>, you often find yourself hunting for accessories like a case or screen protector after the fact. TCL takes the guesswork out of protecting and making full use of its NXTPAPER tablets, so you can instantly go from unboxing to enjoying them. And while there isn’t a screen protector in the box, I wouldn’t recommend using one since that would mean missing out on the paper-like feel of the NXTPAPER 14’s matte display.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4caKnqvmwpxm2BsxmTsFtZ" name="TCL NXTPAPER 14--2" alt="The TCL NXTPAPER 14 in its case open on a desk" src="https://cdn.mos.cms.futurecdn.net/4caKnqvmwpxm2BsxmTsFtZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I’m no digital artist but I like having a stylus on hand for scrolling and signing the occasional document. TCL’s T-Pen is quite capable too with 4,096 levels of pressure sensitivity and around 100 hours of battery life on a single charge. What I like most about using it though is how the combination of its active tip and the matte texture of the NXTPAPER 14’s display feels. You don’t get that same drag when using a stylus like the <a href="https://www.tomsguide.com/opinion/apple-pencil-usb-c-3-things-i-like-and-3-i-dont">Apple Pencil</a> or the <a href="https://www.tomsguide.com/opinion/i-finally-got-the-right-stylus-for-my-chromebook-and-its-a-game-changer">Surface Pen</a> on a glass tablet.</p><p>Another thing I really enjoy about the NXTPAPER 14 is how it feels under my arm when carrying it from room to room around my house. With a screen slightly larger than your standard sheet of printer paper and an aluminum back, it really feels like I’m holding a clipboard folio that’s ready for any task.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OozPqW"></div>                            </div>                            <script src="https://kwizly.com/embed/OozPqW.js" async></script><h2 id="made-to-scroll">Made to scroll</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="57BBCRqWe5DV8ujUzX6Psc" name="TCL NXTPAPER 14--6" alt="A person scrolling through Google Discover on the TCL NXTPAPER 14" src="https://cdn.mos.cms.futurecdn.net/57BBCRqWe5DV8ujUzX6Psc-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As someone who’s constantly checking the news, it almost feels like I scroll for a living when I’m not hammering away on my keyboard. With 7.9 inches from top to bottom horizontally or an even larger 11.9 inches vertically, the NXTPAPER 14 just feels great for scrolling. It’s almost like going from a budget laptop to one of the <a href="https://www.tomsguide.com/computing/laptops/best-laptops">best laptops</a> with a much larger trackpad.</p><p>TCL doesn’t let the NXTPAPER 14’s extra screen real estate go to waste either. Not only can you have two apps running side by side, but you can also have one app in floating window mode while another runs full-size behind it—great for having a calculator or a quick chat window just a tap away.</p><p>Going all the way back to your app drawer can be a hassle on a massive tablet like this one, which is why TCL added its Edge Bar feature. By swiping in from the edge and briefly holding, you bring up a customizable mini dock with useful shortcuts and tools, but you can also add your own apps to the mix.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Qf3XfDFcds6E99j7VFBByf" name="TCL NXTPAPER 14--5" alt="A person scrolling through the redesigned Tom's Guide home page on the TCL NXTPAPER 14" src="https://cdn.mos.cms.futurecdn.net/Qf3XfDFcds6E99j7VFBByf-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As an avid reader, using the NXTPAPER 14 in portrait mode feels even better, at least for me. Whether I’m scrolling through a Google Doc or even the recently redesigned <a href="https://www.tomsguide.com/" target="_blank">Tom’s Guide home page</a>, I still can’t get over how much I can see at a time on this tablet’s larger display.</p><p>Though I covered this in more depth with the NXTPAPER 11 Plus, don’t forget that you aren’t limited to your standard reading modes here either. With a push of its namesake NXTPAPER Key, you can switch from the default Regular Mode to either Color Paper Mode or Ink Paper Mode. Both have their upsides, but I particularly like how using Ink Paper Mode on the NXTPAPER 14 extends its battery life significantly. There’s just something about seeing your remaining battery estimate jump from double to triple-digit hours with the push of a button.</p><p>If reading isn’t your thing, you’re still in luck because at 14.3 inches, the NXTPAPER 14 is around the same size as a <a href="https://www.tomsguide.com/computing/peripherals/i-added-a-portable-monitor-next-to-my-main-display-and-this-inexpensive-upgrade-is-a-game-changer">portable monitor</a>.</p><h2 id="a-smarter-portable-monitor">A smarter portable monitor</h2><p>You won’t have any trouble running the respective apps for any of the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">best streaming services</a> on the NXTPAPER 14. However, when I first used it to stream video content, I did so a bit differently. I was wrapping Christmas presents in the sitting room where we don’t have a TV and wanted to put on something in the background. Instead of Netflix, I opened the app for the Ugreen NAS I <a href="https://www.tomsguide.com/computing/peripherals/i-finally-added-a-nas-to-my-home-network-and-i-cant-believe-i-waited-this-long">recently added to my home network</a> and watched one of my favorite holiday movies to help deal with the fact that I’m terrible at wrapping presents. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HoiUwJn9LeuBSYcH9jqsw6" name="TCL NXTPAPER 14--7" alt="A Nintendo Switch 2 connected to a TCL NXTPAPER 14 using the Genki Covert Dock 3 and Genki ShadowCast 3 Pro" src="https://cdn.mos.cms.futurecdn.net/HoiUwJn9LeuBSYcH9jqsw6-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As I recently had a chance to test out Genki’s new <a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-tried-genkis-covert-dock-3-with-the-nintendo-switch-2-and-it-beats-the-official-dock-for-one-key-reason">Covert Dock 3</a> with my Switch 2, I wanted to see if I could get some more demanding games running on the NXTPAPER 14. With its octa-core MediaTek MT8781 processor, you can play some simple games, but you won’t be playing the mobile version of Red Dead Redemption anytime soon. That’s where Genki’s ShadowCast 3 Pro comes in.</p><p>I hooked up the Covert Dock 3 under my desk, but instead of plugging in an HDMI cable to go out to my TV, I used the ShadowCast 3 Pro to get the video feed from my Switch 2 on the NXTPAPER 14. I did have to buy and download the <a href="https://play.google.com/store/apps/details?id=me.dt2dev.uvcpreview.free&hl=en_US">Noir Pro: USB Camera</a> app for $9, but that’s a small price to pay to play my Switch 2 on a tablet. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HuAJ3fVA9pCvcPgxMbdjYL" name="TCL NXTPAPER 14--8" alt="A person playing Super Mario Galaxy on the Nintendo Switch 2 on the TCL NXTPAPER 14 using the Genki Covert Dock 3 and the Genki ShadowCast 3 Pro" src="https://cdn.mos.cms.futurecdn.net/HuAJ3fVA9pCvcPgxMbdjYL-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As I recently had a chance to test out Genki’s new <a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-tried-genkis-covert-dock-3-with-the-nintendo-switch-2-and-it-beats-the-official-dock-for-one-key-reason">Covert Dock 3</a> with my Switch 2, I wanted to see if I could get some more demanding games running on the NXTPAPER 14. With its octa-core MediaTek MT8781 processor, you can play some simple games, but you won’t be playing the mobile version of Red Dead Redemption anytime soon. That’s where Genki’s ShadowCast 3 Pro comes in.</p><p>I hooked up the Covert Dock 3 under my desk, but instead of plugging in an HDMI cable to go out to my TV, I used the ShadowCast 3 Pro to get the video feed from my Switch 2 on the NXTPAPER 14. I did have to buy and download the <a href="https://play.google.com/store/apps/details?id=me.dt2dev.uvcpreview.free&hl=en_US">Noir Pro: USB Camera</a> app for $9, but that’s a small price to pay to play my Switch 2 on a tablet. </p><h2 id="not-quite-prime-real-estate">Not quite prime real estate</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="av7XxersZaSBrCp6MjmkLQ" name="TCL NXTPAPER 14--4" alt="A person carrying the TCL NXTPAPER 14 under their arm at a restauarant" src="https://cdn.mos.cms.futurecdn.net/av7XxersZaSBrCp6MjmkLQ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The NXTPAPER 14 remains just as impressive after using it for several months now as it did when it literally stopped me in my tracks while walking through that mall in Taiwan. I always thought smaller was best when it comes to tablets, but after spending some quality time with its massive display, I now appreciate all that extra screen real estate.</p><p>Compared to more premium tablets like the <a href="https://www.tomsguide.com/computing/android-tablets/i-ditched-my-laptop-for-the-samsung-galaxy-tab-s11-ultra-heres-what-happened">Samsung Galaxy Tab S11 Ultra</a> or the <a href="https://www.tomsguide.com/computing/i-switched-from-my-laptop-to-the-ipad-pro-m5-and-its-now-a-tablet-i-can-finally-work-on">iPad Pro</a>, the NXTPAPER 14 does struggle at times with more demanding tasks. However, not only are you paying half or even a third less than those flagship prices, but you also don’t have to budget for the extra cost of accessories like a case or a stylus — TCL gives you the whole "clipboard folio" kit right in the box.</p><p>Given that TCL was kind enough to send over both the NXTPAPER 14 and the 11 Plus, I’m going to use the latter when I need portable power and the former when sheer screen size is most important. Still, you can’t go wrong with either of these more affordable tablets, especially as they pack in plenty of unique features you just won’t find anywhere else.</p><p>Who knows? Maybe TCL will go even larger with its next NXTPAPER tablet. Even if it doesn’t, though, I’d love to see a second-generation NXTPAPER 14 with just a bit more power under the hood to match its massive potential.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/opinion/i-use-these-3-tricks-with-all-my-tablets-so-they-dont-just-feel-like-a-bigger-phone">I use these 3 tricks with all my tablets so they don’t just feel like a bigger phone</a></li><li><a href="https://www.tomsguide.com/best-picks/best-tablets-under-dollar500">These are the best budget tablets under $500</a></li><li><a href="https://www.tomsguide.com/computing/tablets/samsung-galaxy-tab-s11-ultra-vs-ipad-pro-m5-which-tablet-should-you-buy">Samsung Galaxy Tab S11 Ultra vs. iPad Pro M5 — which tablet should you buy?</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/android-tablets/i-thought-smaller-was-better-until-i-tried-a-massive-14-inch-tablet-that-feels-like-a-clipboard</link>
                                                                            <description>
                            <![CDATA[ The TCL NXTPAPER 14 may look like a portable monitor but it’s actually a giant Android tablet that trades sheer power for a paper-like display. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">GtAHQvBXcVZiBBqajSZpw4</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/4N8hWYkWN7bcKuqJNHDRFU-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 02 May 2026 10:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                <author><![CDATA[ anthony.spadafora@futurenet.com (Anthony Spadafora) ]]></author>                    <dc:creator><![CDATA[ Anthony Spadafora ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/z73LEoj7FkUjNG85GcWHtH-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Anthony Spadafora is the managing editor for security and home office furniture at Tom’s Guide where he covers everything from data breaches and malware to password managers and the best way to cover your whole home or business with a strong Wi-Fi signal.&lt;/p&gt;&lt;p&gt;Before joining the team, he spent three years covering cybersecurity and B2B tech for ITProPortal while living in South Korea. After moving back to the US. Anthony joined the TechRadar Pro team where he covered these topics along with VPNs, web hosting, online collaboration software and video conferencing for four years. Anthony also has his ears to the ground and is on the lookout for the next major cyberattack or data breach.&lt;/p&gt;&lt;p&gt;Based in Houston, Texas, Anthony also handles VPN testing for both Tom’s Guide and TechRadar. As someone who has worked from home exclusively since 2018, he has reviewed dozens of standing desks as well as office chairs and has taken a closer look at other essential remote working accessories. As part of these reviews, Anthony frequently builds intricate desk setups which is why he’s such a big advocate for cable management and keeping things organized. When he’s not writing, he can be found tinkering with PCs and game consoles, managing cables and making upgrades to his smart home.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/4N8hWYkWN7bcKuqJNHDRFU-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A person holding the TCL NXTPAPER 14 tablet at a table]]></media:description>                                                            <media:text><![CDATA[A person holding the TCL NXTPAPER 14 tablet at a table]]></media:text>
                                <media:title type="plain"><![CDATA[A person holding the TCL NXTPAPER 14 tablet at a table]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/4N8hWYkWN7bcKuqJNHDRFU-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>From the <a href="https://www.tomsguide.com/computing/tablets/i-thought-the-ipad-mini-was-the-perfect-small-tablet-until-i-tried-the-lenovo-legion-tab-3-heres-why">Nexus 7</a> to the <a href="https://www.tomsguide.com/tablets/i-spent-two-weeks-with-the-ipad-mini-7-and-it-reignited-my-love-for-smaller-tablets">iPad mini</a>, I’ve always preferred smaller tablets you can hold in one hand and easily slip into a bag, which is why I was so surprised when I found myself reaching for an absolutely massive 14.3-inch slate instead.</p><p>Unlike other tablets where specs and sheer power are the main draw, the screen itself is why you’d choose a device like the TCL NXTPAPER 14 over something more conventional. Its specs are nothing to scoff at either though, with 8GB of RAM, 256GB of storage and a whopping 10,000 mAh battery under the hood. However, the paper-like feel of its matte display and how you can go from a dedicated black and white ink mode to color paper mode with the push of a button is the kind of thing you truly have to see for yourself.</p><p>Although I tested out its smaller, more powerful sibling the <a href="https://www.tomsguide.com/computing/tablets/i-tried-the-tcl-nxtpaper-11-plus-and-this-budget-tablet-is-easily-my-ipad-killer-heres-why">TCL NXTPAPER 11 Plus</a>, it was the NXTPAPER 14 that first caught my eye. Even under harsh direct lighting, its larger screen remained completely glare and reflection-free. Now, I finally had a chance to use it in the real world and not just at a mall in Taiwan.</p><p>I’ve been using the NXTPAPER 14 for the past few months and while it may not end up being my daily driver, there’s certainly a place for larger tablets like this one — especially if you’d rather carry something more substantial under your arm.</p><div class="product"><a data-dimension112="9a7290b1-b771-497a-aab4-dd39ed2c8af3" data-action="Deal Block" data-label="NXTPAPER 14" data-dimension48="NXTPAPER 14" data-dimension25="$369" href="https://www.amazon.com/TCL-NXTPAPER-Paper-Like-4096-Level-Multi-Window/dp/B0FLP554CZ" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1479px;"><p class="vanilla-image-block" style="padding-top:78.23%;"><img id="RieyhMD4q8Qys2uDrwLwWP" name="NXTPAPER 14" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/RieyhMD4q8Qys2uDrwLwWP-1920-80.jpg" mos="" align="middle" fullscreen="" width="1479" height="1157" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This 14.3-inch Android tablet boasts a 10,000 mAh battery and a 2.4K display, but it’s the NXTPAPER 3.0 tech and 3:2 aspect ratio that really make it stand out. You get a paper-like feel when scrolling through documents or taking notes with the included T-Pen. The NXTPAPER 14 also comes with a folio-style carrying case.<a class="view-deal button" href="https://www.amazon.com/TCL-NXTPAPER-Paper-Like-4096-Level-Multi-Window/dp/B0FLP554CZ" target="_blank" rel="nofollow" data-dimension112="9a7290b1-b771-497a-aab4-dd39ed2c8af3" data-action="Deal Block" data-label="NXTPAPER 14" data-dimension48="NXTPAPER 14" data-dimension25="$369">View Deal</a></p></div><h2 id="from-tablet-to-portfolio">From tablet to portfolio</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kwnabDFk2FBcRtYVfTZdmW" name="TCL NXTPAPER 14--3" alt="The TCL NXTPAPER 14 unboxed on a desk" src="https://cdn.mos.cms.futurecdn.net/kwnabDFk2FBcRtYVfTZdmW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>One thing I immediately appreciated about the NXTPAPER 14 is how TCL provides you with everything you need right in the box. You get a folio-style case with a magnetic cover, a lengthy charging cable and more surprisingly, a pressure-sensitive, active stylus with a USB-C port on the side for charging.</p><p>Even with many of the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a>, you often find yourself hunting for accessories like a case or screen protector after the fact. TCL takes the guesswork out of protecting and making full use of its NXTPAPER tablets, so you can instantly go from unboxing to enjoying them. And while there isn’t a screen protector in the box, I wouldn’t recommend using one since that would mean missing out on the paper-like feel of the NXTPAPER 14’s matte display.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4caKnqvmwpxm2BsxmTsFtZ" name="TCL NXTPAPER 14--2" alt="The TCL NXTPAPER 14 in its case open on a desk" src="https://cdn.mos.cms.futurecdn.net/4caKnqvmwpxm2BsxmTsFtZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I’m no digital artist but I like having a stylus on hand for scrolling and signing the occasional document. TCL’s T-Pen is quite capable too with 4,096 levels of pressure sensitivity and around 100 hours of battery life on a single charge. What I like most about using it though is how the combination of its active tip and the matte texture of the NXTPAPER 14’s display feels. You don’t get that same drag when using a stylus like the <a href="https://www.tomsguide.com/opinion/apple-pencil-usb-c-3-things-i-like-and-3-i-dont">Apple Pencil</a> or the <a href="https://www.tomsguide.com/opinion/i-finally-got-the-right-stylus-for-my-chromebook-and-its-a-game-changer">Surface Pen</a> on a glass tablet.</p><p>Another thing I really enjoy about the NXTPAPER 14 is how it feels under my arm when carrying it from room to room around my house. With a screen slightly larger than your standard sheet of printer paper and an aluminum back, it really feels like I’m holding a clipboard folio that’s ready for any task.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OozPqW"></div>                            </div>                            <script src="https://kwizly.com/embed/OozPqW.js" async></script><h2 id="made-to-scroll">Made to scroll</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="57BBCRqWe5DV8ujUzX6Psc" name="TCL NXTPAPER 14--6" alt="A person scrolling through Google Discover on the TCL NXTPAPER 14" src="https://cdn.mos.cms.futurecdn.net/57BBCRqWe5DV8ujUzX6Psc-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As someone who’s constantly checking the news, it almost feels like I scroll for a living when I’m not hammering away on my keyboard. With 7.9 inches from top to bottom horizontally or an even larger 11.9 inches vertically, the NXTPAPER 14 just feels great for scrolling. It’s almost like going from a budget laptop to one of the <a href="https://www.tomsguide.com/computing/laptops/best-laptops">best laptops</a> with a much larger trackpad.</p><p>TCL doesn’t let the NXTPAPER 14’s extra screen real estate go to waste either. Not only can you have two apps running side by side, but you can also have one app in floating window mode while another runs full-size behind it—great for having a calculator or a quick chat window just a tap away.</p><p>Going all the way back to your app drawer can be a hassle on a massive tablet like this one, which is why TCL added its Edge Bar feature. By swiping in from the edge and briefly holding, you bring up a customizable mini dock with useful shortcuts and tools, but you can also add your own apps to the mix.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Qf3XfDFcds6E99j7VFBByf" name="TCL NXTPAPER 14--5" alt="A person scrolling through the redesigned Tom's Guide home page on the TCL NXTPAPER 14" src="https://cdn.mos.cms.futurecdn.net/Qf3XfDFcds6E99j7VFBByf-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As an avid reader, using the NXTPAPER 14 in portrait mode feels even better, at least for me. Whether I’m scrolling through a Google Doc or even the recently redesigned <a href="https://www.tomsguide.com/" target="_blank">Tom’s Guide home page</a>, I still can’t get over how much I can see at a time on this tablet’s larger display.</p><p>Though I covered this in more depth with the NXTPAPER 11 Plus, don’t forget that you aren’t limited to your standard reading modes here either. With a push of its namesake NXTPAPER Key, you can switch from the default Regular Mode to either Color Paper Mode or Ink Paper Mode. Both have their upsides, but I particularly like how using Ink Paper Mode on the NXTPAPER 14 extends its battery life significantly. There’s just something about seeing your remaining battery estimate jump from double to triple-digit hours with the push of a button.</p><p>If reading isn’t your thing, you’re still in luck because at 14.3 inches, the NXTPAPER 14 is around the same size as a <a href="https://www.tomsguide.com/computing/peripherals/i-added-a-portable-monitor-next-to-my-main-display-and-this-inexpensive-upgrade-is-a-game-changer">portable monitor</a>.</p><h2 id="a-smarter-portable-monitor">A smarter portable monitor</h2><p>You won’t have any trouble running the respective apps for any of the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">best streaming services</a> on the NXTPAPER 14. However, when I first used it to stream video content, I did so a bit differently. I was wrapping Christmas presents in the sitting room where we don’t have a TV and wanted to put on something in the background. Instead of Netflix, I opened the app for the Ugreen NAS I <a href="https://www.tomsguide.com/computing/peripherals/i-finally-added-a-nas-to-my-home-network-and-i-cant-believe-i-waited-this-long">recently added to my home network</a> and watched one of my favorite holiday movies to help deal with the fact that I’m terrible at wrapping presents. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HoiUwJn9LeuBSYcH9jqsw6" name="TCL NXTPAPER 14--7" alt="A Nintendo Switch 2 connected to a TCL NXTPAPER 14 using the Genki Covert Dock 3 and Genki ShadowCast 3 Pro" src="https://cdn.mos.cms.futurecdn.net/HoiUwJn9LeuBSYcH9jqsw6-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As I recently had a chance to test out Genki’s new <a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-tried-genkis-covert-dock-3-with-the-nintendo-switch-2-and-it-beats-the-official-dock-for-one-key-reason">Covert Dock 3</a> with my Switch 2, I wanted to see if I could get some more demanding games running on the NXTPAPER 14. With its octa-core MediaTek MT8781 processor, you can play some simple games, but you won’t be playing the mobile version of Red Dead Redemption anytime soon. That’s where Genki’s ShadowCast 3 Pro comes in.</p><p>I hooked up the Covert Dock 3 under my desk, but instead of plugging in an HDMI cable to go out to my TV, I used the ShadowCast 3 Pro to get the video feed from my Switch 2 on the NXTPAPER 14. I did have to buy and download the <a href="https://play.google.com/store/apps/details?id=me.dt2dev.uvcpreview.free&hl=en_US">Noir Pro: USB Camera</a> app for $9, but that’s a small price to pay to play my Switch 2 on a tablet. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HuAJ3fVA9pCvcPgxMbdjYL" name="TCL NXTPAPER 14--8" alt="A person playing Super Mario Galaxy on the Nintendo Switch 2 on the TCL NXTPAPER 14 using the Genki Covert Dock 3 and the Genki ShadowCast 3 Pro" src="https://cdn.mos.cms.futurecdn.net/HuAJ3fVA9pCvcPgxMbdjYL-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As I recently had a chance to test out Genki’s new <a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-tried-genkis-covert-dock-3-with-the-nintendo-switch-2-and-it-beats-the-official-dock-for-one-key-reason">Covert Dock 3</a> with my Switch 2, I wanted to see if I could get some more demanding games running on the NXTPAPER 14. With its octa-core MediaTek MT8781 processor, you can play some simple games, but you won’t be playing the mobile version of Red Dead Redemption anytime soon. That’s where Genki’s ShadowCast 3 Pro comes in.</p><p>I hooked up the Covert Dock 3 under my desk, but instead of plugging in an HDMI cable to go out to my TV, I used the ShadowCast 3 Pro to get the video feed from my Switch 2 on the NXTPAPER 14. I did have to buy and download the <a href="https://play.google.com/store/apps/details?id=me.dt2dev.uvcpreview.free&hl=en_US">Noir Pro: USB Camera</a> app for $9, but that’s a small price to pay to play my Switch 2 on a tablet. </p><h2 id="not-quite-prime-real-estate">Not quite prime real estate</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="av7XxersZaSBrCp6MjmkLQ" name="TCL NXTPAPER 14--4" alt="A person carrying the TCL NXTPAPER 14 under their arm at a restauarant" src="https://cdn.mos.cms.futurecdn.net/av7XxersZaSBrCp6MjmkLQ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The NXTPAPER 14 remains just as impressive after using it for several months now as it did when it literally stopped me in my tracks while walking through that mall in Taiwan. I always thought smaller was best when it comes to tablets, but after spending some quality time with its massive display, I now appreciate all that extra screen real estate.</p><p>Compared to more premium tablets like the <a href="https://www.tomsguide.com/computing/android-tablets/i-ditched-my-laptop-for-the-samsung-galaxy-tab-s11-ultra-heres-what-happened">Samsung Galaxy Tab S11 Ultra</a> or the <a href="https://www.tomsguide.com/computing/i-switched-from-my-laptop-to-the-ipad-pro-m5-and-its-now-a-tablet-i-can-finally-work-on">iPad Pro</a>, the NXTPAPER 14 does struggle at times with more demanding tasks. However, not only are you paying half or even a third less than those flagship prices, but you also don’t have to budget for the extra cost of accessories like a case or a stylus — TCL gives you the whole "clipboard folio" kit right in the box.</p><p>Given that TCL was kind enough to send over both the NXTPAPER 14 and the 11 Plus, I’m going to use the latter when I need portable power and the former when sheer screen size is most important. Still, you can’t go wrong with either of these more affordable tablets, especially as they pack in plenty of unique features you just won’t find anywhere else.</p><p>Who knows? Maybe TCL will go even larger with its next NXTPAPER tablet. Even if it doesn’t, though, I’d love to see a second-generation NXTPAPER 14 with just a bit more power under the hood to match its massive potential.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/opinion/i-use-these-3-tricks-with-all-my-tablets-so-they-dont-just-feel-like-a-bigger-phone">I use these 3 tricks with all my tablets so they don’t just feel like a bigger phone</a></li><li><a href="https://www.tomsguide.com/best-picks/best-tablets-under-dollar500">These are the best budget tablets under $500</a></li><li><a href="https://www.tomsguide.com/computing/tablets/samsung-galaxy-tab-s11-ultra-vs-ipad-pro-m5-which-tablet-should-you-buy">Samsung Galaxy Tab S11 Ultra vs. iPad Pro M5 — which tablet should you buy?</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Multiple Android devices found to have dangerous built-in backdoor: how to know if yours is safe ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Most Android malware is spread through <a href="https://www.tomsguide.com/computing/malware-adware/nearly-100-malicious-apps-with-55-million-installs-spreading-malware-on-play-store-protect-yourself-now">dodgy apps</a> and sideloaded programs, meaning that you can slightly control what gets on your device. However, researchers at Kaspersky have discovered a new Android backdoor, dubbed Keenadu, that is embedded in the firmware of tablets from several manufacturers. </p><p>The <a href="https://securelist.com/keenadu-android-backdoor/118913/" target="_blank">new report</a> indicates that Keenadu can be distributed via compromised firmware images, other backdoors, embedded in system apps or modified from third-party sources or even the <a href="https://www.tomsguide.com/news/google-play-store-is-making-a-big-upgrade-to-fight-malware-what-you-need-to-know">Google Play Store</a>.</p><p>The firmware version is the most potent and has infected more than 13,000 devices mostly in Russia, Japan, Germany, Brazil and the Netherlands. Keenadu apparently does not activate if the language or time zone is associated with China, which indicates a potential clue as to its origin.</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:5451px;"><p class="vanilla-image-block" style="padding-top:57.24%;"><img id="vLvwDcmL4mXhep5vxCdjGH" name="Android robot.jpg" alt="An image of a Google Android robot" src="https://cdn.mos.cms.futurecdn.net/vLvwDcmL4mXhep5vxCdjGH-1920-80.jpg" mos="" align="middle" fullscreen="" width="5451" height="3120" 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>Kaspersky researchers noted that it's mostly being used for fraudulent ads, but that it's capabilities go far beyond that. It can inject itself into the Android "Zygote" process, a core system process that launches every app on your device. </p><p>This means it can give bad actors broad control and visibility over your system. </p><p>“Keenadu is a fully functional backdoor that provides the attackers with unlimited control over the victim’s device,” Kaspersky told <a href="https://www.bleepingcomputer.com/news/security/new-keenadu-backdoor-found-in-android-firmware-google-play-apps/" target="_blank">BleepingComputer</a>. "It can infect every app installed on the device, install any apps from APK files, and give them any available permissions.”</p><p>The researchers also found the malware in several apps that were available on the Google Play Store, including a smart home camera app that had over 300,000 downloads.</p><p>In a confirmed example, firmware images on the Alldocube iPlay 50 mini Pro tablet were compromised, including in tablets released after the vendor was informed of the malware. The firmware has valid signatures, meaning that it's a supply-chain issue where malicious code was injected during software development or even the manufacturing process.</p><p>Here's the silver lining: if you have one of the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a> from a flagship brand like OnePlus or Samsung, you likely won't be affected by this malware. However, lesser-known Android manufacturers or knock-off ones seem to be more dangerous, and affected vendors haven't been totally named. This is quite similar to how malware was found on <a href="https://www.tomsguide.com/news/millions-of-cheap-android-tv-boxes-come-pre-infected-with-botnet-malware">millions of budget Android TV boxes</a> last year.</p><h2 id="how-to-stay-safe">How to stay safe</h2><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:42.85%;"><img id="3z8zoqArEPDcAmipKQ4pJg" name="RedMagic Astra" alt="The RedMagic Astra Android gaming tablet" src="https://cdn.mos.cms.futurecdn.net/3z8zoqArEPDcAmipKQ4pJg-1920-80.jpg" mos="" align="middle" fullscreen="" width="6000" height="2571" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you have a budget Android tablet, especially from a smaller or knock-off brand, it's worth checking for software updates. You can also try installing fresh firmware from a reliable third-party. Kaspersky did say that vendors have been notified and hopefully are working on clean firmware updates.</p><p>Beyond that, it may be safer to invest in a tablet from a trusted manufacturer. We can help you with choices of the <a href="https://www.tomsguide.com/best-picks/best-tablets-under-dollar500">best tablets under $500</a> and the <a href="https://www.tomsguide.com/best-picks/best-android-tablets">best Android tablets</a> overall.</p><p>A Google spokesperson told Android Authority that "Android users are automatically protected from known versions of this malware by Google Play Protect." The spokesperson added that <a href="https://www.tomsguide.com/reviews/google-play-protect">Play Protect</a> will warn you and disable apps known to exhibit Keenadu behavior. </p><p>Google Play Protect is on by default, but if you want an extra layer of protection, you can run one of the <a href="https://www.tomsguide.com/best-picks/best-android-antivirus">best Android antivirus apps</a> alongside it for scanning and defending your tablet or phone.</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/300-000-chrome-users-installed-these-malicious-extensions-posing-as-ai-assistants-delete-them-right-now">300,000+ Chrome users installed these malicious extensions posing as AI assistants — delete them right now</a></li><li><a href="https://www.tomsguide.com/computing/online-security/how-did-the-fbi-get-nancy-guthries-google-nest-camera-footage-if-it-was-disabled-and-what-does-it-mean-for-your-privacy">How did the FBI get Nancy Guthrie's Google Nest camera footage if it was disabled — and what does it mean for your privacy?</a></li><li><a href="https://www.tomsguide.com/computing/vpns/i-visited-a-vpn-data-center-heres-what-i-learned">I visited a VPN data center – here's what I learned</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/malware-adware/dangerous-new-keenadu-malware-found-pre-installed-on-cheap-android-phones-and-tablets-how-to-stay-safe</link>
                                                                            <description>
                            <![CDATA[ A new Android malware was found to be pre-installed on some budget Android phones and tablets by security researchers. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">VK7RU3JGPK5ZqTyiUWFpng</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/v6Ro3B6LfmJmFroAuNUBf8-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 17 Feb 2026 23:22:16 +0000</pubDate>                                                                                                                                <updated>Wed, 18 Feb 2026 17:00:33 +0000</updated>
                                                                                                                                            <category><![CDATA[Malware & Adware]]></category>
                                                    <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Internet]]></category>
                                                    <category><![CDATA[Online Security]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;br&gt;Send secure tips on Signal: scyo1.55.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/v6Ro3B6LfmJmFroAuNUBf8-1920-80.jpg">
                                                            <media:credit><![CDATA[Getty Images]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Android logo on phone next to Malware sign]]></media:description>                                                            <media:text><![CDATA[Android logo on phone next to Malware sign]]></media:text>
                                <media:title type="plain"><![CDATA[Android logo on phone next to Malware sign]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/v6Ro3B6LfmJmFroAuNUBf8-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Most Android malware is spread through <a href="https://www.tomsguide.com/computing/malware-adware/nearly-100-malicious-apps-with-55-million-installs-spreading-malware-on-play-store-protect-yourself-now">dodgy apps</a> and sideloaded programs, meaning that you can slightly control what gets on your device. However, researchers at Kaspersky have discovered a new Android backdoor, dubbed Keenadu, that is embedded in the firmware of tablets from several manufacturers. </p><p>The <a href="https://securelist.com/keenadu-android-backdoor/118913/" target="_blank">new report</a> indicates that Keenadu can be distributed via compromised firmware images, other backdoors, embedded in system apps or modified from third-party sources or even the <a href="https://www.tomsguide.com/news/google-play-store-is-making-a-big-upgrade-to-fight-malware-what-you-need-to-know">Google Play Store</a>.</p><p>The firmware version is the most potent and has infected more than 13,000 devices mostly in Russia, Japan, Germany, Brazil and the Netherlands. Keenadu apparently does not activate if the language or time zone is associated with China, which indicates a potential clue as to its origin.</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:5451px;"><p class="vanilla-image-block" style="padding-top:57.24%;"><img id="vLvwDcmL4mXhep5vxCdjGH" name="Android robot.jpg" alt="An image of a Google Android robot" src="https://cdn.mos.cms.futurecdn.net/vLvwDcmL4mXhep5vxCdjGH-1920-80.jpg" mos="" align="middle" fullscreen="" width="5451" height="3120" 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>Kaspersky researchers noted that it's mostly being used for fraudulent ads, but that it's capabilities go far beyond that. It can inject itself into the Android "Zygote" process, a core system process that launches every app on your device. </p><p>This means it can give bad actors broad control and visibility over your system. </p><p>“Keenadu is a fully functional backdoor that provides the attackers with unlimited control over the victim’s device,” Kaspersky told <a href="https://www.bleepingcomputer.com/news/security/new-keenadu-backdoor-found-in-android-firmware-google-play-apps/" target="_blank">BleepingComputer</a>. "It can infect every app installed on the device, install any apps from APK files, and give them any available permissions.”</p><p>The researchers also found the malware in several apps that were available on the Google Play Store, including a smart home camera app that had over 300,000 downloads.</p><p>In a confirmed example, firmware images on the Alldocube iPlay 50 mini Pro tablet were compromised, including in tablets released after the vendor was informed of the malware. The firmware has valid signatures, meaning that it's a supply-chain issue where malicious code was injected during software development or even the manufacturing process.</p><p>Here's the silver lining: if you have one of the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a> from a flagship brand like OnePlus or Samsung, you likely won't be affected by this malware. However, lesser-known Android manufacturers or knock-off ones seem to be more dangerous, and affected vendors haven't been totally named. This is quite similar to how malware was found on <a href="https://www.tomsguide.com/news/millions-of-cheap-android-tv-boxes-come-pre-infected-with-botnet-malware">millions of budget Android TV boxes</a> last year.</p><h2 id="how-to-stay-safe">How to stay safe</h2><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:42.85%;"><img id="3z8zoqArEPDcAmipKQ4pJg" name="RedMagic Astra" alt="The RedMagic Astra Android gaming tablet" src="https://cdn.mos.cms.futurecdn.net/3z8zoqArEPDcAmipKQ4pJg-1920-80.jpg" mos="" align="middle" fullscreen="" width="6000" height="2571" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you have a budget Android tablet, especially from a smaller or knock-off brand, it's worth checking for software updates. You can also try installing fresh firmware from a reliable third-party. Kaspersky did say that vendors have been notified and hopefully are working on clean firmware updates.</p><p>Beyond that, it may be safer to invest in a tablet from a trusted manufacturer. We can help you with choices of the <a href="https://www.tomsguide.com/best-picks/best-tablets-under-dollar500">best tablets under $500</a> and the <a href="https://www.tomsguide.com/best-picks/best-android-tablets">best Android tablets</a> overall.</p><p>A Google spokesperson told Android Authority that "Android users are automatically protected from known versions of this malware by Google Play Protect." The spokesperson added that <a href="https://www.tomsguide.com/reviews/google-play-protect">Play Protect</a> will warn you and disable apps known to exhibit Keenadu behavior. </p><p>Google Play Protect is on by default, but if you want an extra layer of protection, you can run one of the <a href="https://www.tomsguide.com/best-picks/best-android-antivirus">best Android antivirus apps</a> alongside it for scanning and defending your tablet or phone.</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/300-000-chrome-users-installed-these-malicious-extensions-posing-as-ai-assistants-delete-them-right-now">300,000+ Chrome users installed these malicious extensions posing as AI assistants — delete them right now</a></li><li><a href="https://www.tomsguide.com/computing/online-security/how-did-the-fbi-get-nancy-guthries-google-nest-camera-footage-if-it-was-disabled-and-what-does-it-mean-for-your-privacy">How did the FBI get Nancy Guthrie's Google Nest camera footage if it was disabled — and what does it mean for your privacy?</a></li><li><a href="https://www.tomsguide.com/computing/vpns/i-visited-a-vpn-data-center-heres-what-i-learned">I visited a VPN data center – here's what I learned</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I ditched my iPad for the OnePlus Pad Go 2 for 2 weeks, and this is a great, affordable Android tablet replacement ]]></title>
                                                                                                <dc:content><![CDATA[ <div data-model-name="OnePlus Pad Go 2" data-widget-type="review"></div><p>I didn’t expect to love the OnePlus Pad Go 2 ($399) this much. Sure, I’m a fan of the company’s tablets, but none of the units I’ve tested or reviewed would make me consider them over one of the <a href="https://www.tomsguide.com/best-picks/best-ipad">best iPads</a>. And while Apple continues to have a stranglehold over the tablet industry, I wouldn’t mind using the OnePlus Pad Go 2 as my daily driver.</p><p>What’s so great about this mid-range slate? For starters, its vivid 12.1-inch display does a phenomenal job of delivering sharp and clear images when you’re browsing the web, playing games, or reading comics. Though an OLED option would have been nice, everything looks quite nice on this screen.</p><p>The snappy and user-friendly OxygenOS is arguably the Pad Go 2’s secret weapon, since it makes finding and launching apps so seamless. Open Canvas provides one of the best multi-tasking experiences for tablets, as it lets you have up to three apps in a flexible interface. The user experience here is virtually identical to the <a href="https://www.tomsguide.com/computing/android-tablets/oneplus-pad-3">OnePlus Pad 3</a>, only for $200 less.</p><p>While the OnePlus Pad Go 2 doesn’t have a distinctive design like its sibling slates and its fast-charging isn’t all that fast, its virtues more than make up for any shortcomings. If you’re looking for one of the <a href="https://www.tomsguide.com/best-picks/best-android-tablets">best Android tablets</a>, this is the one to get. Find out more in my full review.</p><h3 class="article-body__section" id="section-oneplus-pad-go-2-review-cheat-sheet"><span>OnePlus Pad Go 2 review: Cheat sheet</span></h3><ul><li><strong>What is it?</strong> The OnePlus Pad 2 is a 12.1-inch mid-range tablet that runs on OxygenOS.</li><li><strong>Who is it for?</strong> This is a tablet for anyone who wants a reliable productivity and gaming machine at an affordable price.</li><li><strong>What does it cost?</strong> The OnePlus Pad 2 costs <a href="https://www.oneplus.com/us/buy-oneplus-pad-go-2" target="_blank" rel="nofollow"><u>$399 on OnePlus’ website</u></a>. Right now, you can select either the OnePlus Pad Go 2 Folio Case or Pad Go 2 Stylo as a free gift. Separately, the former costs $44 while the latter sells for $79. However, at time of writing, these add-ons cost $31and $59 (respectively).</li><li><strong>What do we like?</strong> We like the bright and colorful display, snappy, user-friendly operating system, and easy portability.</li><li><strong>What don’t we like?</strong> The somewhat boring design compared to other OnePlus Pads and slow charging.</li></ul><h3 class="article-body__section" id="section-oneplus-pad-go-2-review-specs"><span>OnePlus Pad Go 2 review: Specs</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>OnePlus Pad 2 Go</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$399</p></td></tr><tr><td class="firstcol " ><p><strong>OS</strong></p></td><td  ><p>OxygenOS 16</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>12.1-inches (2800 x 1980) LCD, 7:5 aspect ratio | 120Hz adaptive refresh rate</p></td></tr><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>MediaTek Dimensity 7300-Ultra</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>8GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>128GB</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>1x USB-C</p></td></tr><tr><td class="firstcol " ><p><strong>Camera</strong></p></td><td  ><p>8MP rear, 8MP back</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Wi-Fi 6, 5G</p></td></tr><tr><td class="firstcol " ><p><strong>Battery life</strong></p></td><td  ><p>16 hours 39 minutes (tested)</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>10.47 x 7.59 x 0.27 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>1.32 pounds</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-oneplus-pad-go-2-review-the-ups"><span>OnePlus Pad Go 2 review: The ups</span></h3><p>The OnePlus Pad Go 2 is a fantastic mid-range Android tablet thanks to its bright and colorful display, fast performance, and fluid operating system. Its long battery life is another major bonus.</p><h2 id="vivid-display-3">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="4xqEP7e3DUuLuWpB7Xo6JM" name="OnePlus-Pad-Go-2--06" alt="OnePlus Pad Go 2 display" src="https://cdn.mos.cms.futurecdn.net/4xqEP7e3DUuLuWpB7Xo6JM-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The 12.1-inch 2800 x 1980 LCD panel delivers a fine viewing and reading experience. The oversaturated colors help comics pop off the screen, while the sharp resolution makes it easier to read text.</p><p>Watching videos like the X-Men-focused Avengers: Doomsday trailer is just as enjoyable, as I’m able to see all the different shades of red in Cyclops’ optic blast. Everything runs buttery smooth thanks to the variable 120Hz refresh rate.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>OnePlus Pad Go 2</strong></p></td><td  ><p><strong>iPad 11</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Nits (brightness)</strong></p></td><td  ><p>544 (SDR) | 554 (HDR)</p></td><td  ><p>485 (SDR) | 476%</p></td></tr><tr><td class="firstcol " ><p><strong>sRGB</strong></p></td><td  ><p>159.6%</p></td><td  ><p>117.6%</p></td></tr><tr><td class="firstcol " ><p><strong>DCI-P3</strong></p></td><td  ><p>113.1%</p></td><td  ><p>83.3%</p></td></tr><tr><td class="firstcol " ><p><strong>Delta-E</strong></p></td><td  ><p>0.29</p></td><td  ><p>0.22</p></td></tr></tbody></table></div><p>Our lab tests confirm my anecdotal experience. As you can see in the table below, the OnePlus Pad Go 2 does indeed have oversaturated color representation (sRGB and DCI-P3), along with good color accuracy (Delta-E). While the brightness doesn’t exactly hit the advertised 900 nits in high brightness mode, the average 554 nits of HDR brightness is more than enough for outdoor watching.</p><p>How does the OnePlus Pad Go 2 compare to the <a href="https://www.tomsguide.com/computing/ipads/ipad-11-2025-review"><u>iPad 11</u></a>? The display on OnePlus’ slate can get brighter and has more vivid hues. While the numbers might favor the Pad Go 2, the iPad offers more naturalistic tones. Color accuracy is also just slightly better on the iPad.</p><h2 id="lightweight-design">Lightweight 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="vtWHkrUiaWqSCdAPP8M4AT" name="OnePlus-Pad-Go-2--16" alt="OnePlus Pad Go 2" src="https://cdn.mos.cms.futurecdn.net/vtWHkrUiaWqSCdAPP8M4AT-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>You’d be forgiven for mistaking the OnePlus Pad Go 2 for an iPad. The design isn’t identical, but it’s very close. Though some folks aren’t fond of the large rear cameras on OnePlus’ tablets, no one can deny they give the slates a distinctive look. Losing that aspect is a bit of a bummer.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="AaM7K8et6FRCw5rt5XYAsY" name="OnePlus-Pad-Go-2--14" alt="OnePlus Pad Go 2" src="https://cdn.mos.cms.futurecdn.net/AaM7K8et6FRCw5rt5XYAsY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Even if the Pad Go 2 has a fairly basic shape, it’s a design that makes it easy to use and carry around. At 10.47 x 7.59 x 0.27 inches and 1.32 pounds, you can comfortably hold this slate for extended periods. It’s also lightweight and thin enough to slip into your backpack and forget it’s there.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="oiYSXjSyZMsSEZPefz34kf" name="OnePlus-Pad-Go-2--09" alt="OnePlus Pad Go 2" src="https://cdn.mos.cms.futurecdn.net/oiYSXjSyZMsSEZPefz34kf-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>One unique aspect that the Pad Go 2 retains is the display’s 7:5 aspect ratio, which makes it taller and wider than many tablets. The display’s proportions are closer to a laptop’s. This aspect ratio is perfect for novels and comics, so I’m glad OnePlus didn’t change that.</p><p>Even if the OnePlus Pad Go 2’s design isn’t that distinct, it’s still functional, portable and comfortable to use — exactly what you want in a tablet.</p><h2 id="good-performance">Good 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="8XsLgVYSvbRQStVnUEwU6m" name="OnePlus-Pad-Go-2--07" alt="OnePlus Pad Go 2" src="https://cdn.mos.cms.futurecdn.net/8XsLgVYSvbRQStVnUEwU6m-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The OnePlus Pad Go 2 runs on the MediaTek Dimensity 7300-Ultra processor and packs 8GB of RAM. While these aren’t high-end components, they provide this slate with enough power for smooth multitasking and running relatively demanding apps.</p><p>Playing a YouTube video while multitasking across various apps didn’t present a problem for the OnePlus Pad Go 2, as everything ran smoothly and without slowing down. I saw some stuttering and frame rate drops in Genshin Impact, but it wasn’t enough to kill the experience.</p><div ><table><caption>Performance tests</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>OnePlus Pad Go 2</strong></p></td><td  ><p><strong>iPad 11</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong></p></td><td  ><p>MediaTek Dimensity 7300-Ultra</p></td><td  ><p>Apple A16</p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6 score (single-core / multi-core)</strong></p></td><td  ><p>1013 / 3081</p></td><td  ><p>3042 / 11804</p></td></tr><tr><td class="firstcol " ><p><strong>3DMark Wild Life Extreme Unlimited (score/fps)</strong></p></td><td  ><p>863 / 5.17</p></td><td  ><p>5806 / 34.8</p></td></tr></tbody></table></div><p>On the Geekbench 6 CPU test, the OnePlus Pad Go 2 performed decently, though it’s clearly outmatched by the iPad 11 with its more powerful A16 chip. Apple’s tablet also lapped the Pad Go 2 on the 3D Mark graphics test.</p><p>Though the iPad 11 outclasses the OnePlus Pad Go 2 in our performance tests, you’ll find it performs surprisingly well under real-world conditions. This is impressive for a mid-range Android tablet.</p><h2 id="epic-battery-life-2">Epic battery life</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="96NaEY5hHx5uRbARrK7raC" name="OnePlus-Pad-Go-2--13" alt="OnePlus Pad Go 2" src="https://cdn.mos.cms.futurecdn.net/96NaEY5hHx5uRbARrK7raC-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The OnePlus Pad Go 2 is one of the longest-lasting Android tablets we’ve tested. In our battery life test, which involves continuous web surfing over Wi-Fi with the display set to 150 nits of brightness, the OnePlus Pad Go 2 lasted for an epic 16 hours and 39 minutes. As you can see below, that’s basically seven hours longer than the iPad 11.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Time (hours:mins)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>OnePlus Pad Go 2</strong></p></td><td  ><p>16:39</p></td></tr><tr><td class="firstcol " ><p><strong>iPad 11</strong></p></td><td  ><p>9:41</p></td></tr></tbody></table></div><p>During my own testing, I watched YouTube videos, browsed the web, and played games for about two hours, and the battery dropped to 80%. If you forget the tablet’s charger at home, you won’t be worried at all.</p><h2 id="snappy-oxygen-os">Snappy Oxygen OS</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="5WNPzYLQrWPTdr5UgTtzU4" name="OnePlus-Pad-Go-2--03" alt="OnePlus Pad Go 2" src="https://cdn.mos.cms.futurecdn.net/5WNPzYLQrWPTdr5UgTtzU4-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>OnePlus’ OxygenOS 16 is one of my favorite things about the Pad Go 2. There’s a taskbar with your most recently used files, a built-in app drawer that helps with navigation, and a two-pane view that also facilitates navigation. Features like this make using the tablet feel very intuitive.</p><p>Speaking of productivity, Open Canvas is a fantastic multitasking tool for those who want to use this tablet for work. You can have up to three apps in an interface that allows you to keep said apps at your preferred size. Like with Open Canvas on the OnePlus Pad 3, the Pad Go 2 makes suggested pairings if you frequently switch between apps. I find these suggestions pretty handy. Performing the gestures required for this sort of splitview is pretty seamless.</p><p>As expected from a modern computing device, the OnePlus Pad Go 2 has built-in AI features. This includes summaries, text generation, and translation — all of which you can access by swiping the side of the screen whenever you need these features. You’ll also find dedicated buttons for them in relevant apps. I didn’t find much use for these features, but they could be useful to you.</p><p>Though I still prefer iPadOS 26 over OxygenOS 16, the latter is an excellent skin for Android that functions wonderfully.</p><h3 class="article-body__section" id="section-oneplus-pad-go-2-review-the-downs"><span>OnePlus Pad Go 2 review: The downs</span></h3><p>The OnePlus Pad Go 2 is an almost perfect Android tablet. Unfortunately, it has one flaw that can be frustrating if you’re in a hurry.</p><h2 id="slow-charging">Slow charging</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HyF5Ds9HSxgtaU64f5zGcJ" name="OnePlus-Pad-Go-2--15" alt="OnePlus Pad Go 2 camera" src="https://cdn.mos.cms.futurecdn.net/HyF5Ds9HSxgtaU64f5zGcJ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>While the OnePlus Pad Go 2 offers incredible endurance, charging its 10050 mAh battery takes an inordinate amount of time. The tablet is supposed to have “fast” 33W charging, but in my experience, charging is anything but fast. It took me a little over two hours to fully charge the slate from zero percent battery, which can feel like an eternity.</p><p>I bring up slow charging because I know this could be a point of contention for some. While I wish charging didn’t take as long, the trade-off is that you get exceptional battery life. Because of that, you won’t always have to keep charging this tablet. It comes down to whether you want a long-lasting battery or fast charging.</p><h3 class="article-body__section" id="section-oneplus-pad-go-2-review-verdict"><span>OnePlus Pad Go 2 review: Verdict</span></h3><p>The OnePlus Pad Go 2 proves that Android tablets can be just as enjoyable and functional to use as Apple’s iPads. Granted, those already deep in the Apple ecosystem likely won’t be swayed to buy this slate, but if you’re platform agnostic, OnePlus’ tablet is a fantastic alternative.</p><p>If you need a mid-range tablet that delivers better overall performance, offers greater app compatibility, and has an OS that will be supported for many years, then the iPad 11 is your best bet. However, if you’re into Android tablets or want a slate that plays nice with your OnePlus phone, you should give the OnePlus Pad Go 2 a shot. I promise you won’t be disappointed.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/android-tablets/oneplus-pad-go-2-review</link>
                                                                            <description>
                            <![CDATA[ The OnePlus Go 2 is a fantastic iPad alternative thanks to its vivid display, phenomenal battery life, and user-friendly interface. For $399, it makes a compelling purchase. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">kD8y8Sv3C8LPQt9fAmP3vf</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/gav4Q6XtV8dFnPrdt2BUU-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 10 Feb 2026 22:12:59 +0000</pubDate>                                                                                                                                <updated>Thu, 04 Jun 2026 12:51:32 +0000</updated>
                                                                                                                                            <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                <author><![CDATA[ tony.polanco@futurenet.com (Tony Polanco) ]]></author>                    <dc:creator><![CDATA[ Tony Polanco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/atzRNqFt5wYgEUPBDahWsD-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/gav4Q6XtV8dFnPrdt2BUU-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[OnePlus Pad Go 2]]></media:description>                                                            <media:text><![CDATA[OnePlus Pad Go 2]]></media:text>
                                <media:title type="plain"><![CDATA[OnePlus Pad Go 2]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/gav4Q6XtV8dFnPrdt2BUU-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div data-model-name="OnePlus Pad Go 2" data-widget-type="review"></div><p>I didn’t expect to love the OnePlus Pad Go 2 ($399) this much. Sure, I’m a fan of the company’s tablets, but none of the units I’ve tested or reviewed would make me consider them over one of the <a href="https://www.tomsguide.com/best-picks/best-ipad">best iPads</a>. And while Apple continues to have a stranglehold over the tablet industry, I wouldn’t mind using the OnePlus Pad Go 2 as my daily driver.</p><p>What’s so great about this mid-range slate? For starters, its vivid 12.1-inch display does a phenomenal job of delivering sharp and clear images when you’re browsing the web, playing games, or reading comics. Though an OLED option would have been nice, everything looks quite nice on this screen.</p><p>The snappy and user-friendly OxygenOS is arguably the Pad Go 2’s secret weapon, since it makes finding and launching apps so seamless. Open Canvas provides one of the best multi-tasking experiences for tablets, as it lets you have up to three apps in a flexible interface. The user experience here is virtually identical to the <a href="https://www.tomsguide.com/computing/android-tablets/oneplus-pad-3">OnePlus Pad 3</a>, only for $200 less.</p><p>While the OnePlus Pad Go 2 doesn’t have a distinctive design like its sibling slates and its fast-charging isn’t all that fast, its virtues more than make up for any shortcomings. If you’re looking for one of the <a href="https://www.tomsguide.com/best-picks/best-android-tablets">best Android tablets</a>, this is the one to get. Find out more in my full review.</p><h3 class="article-body__section" id="section-oneplus-pad-go-2-review-cheat-sheet"><span>OnePlus Pad Go 2 review: Cheat sheet</span></h3><ul><li><strong>What is it?</strong> The OnePlus Pad 2 is a 12.1-inch mid-range tablet that runs on OxygenOS.</li><li><strong>Who is it for?</strong> This is a tablet for anyone who wants a reliable productivity and gaming machine at an affordable price.</li><li><strong>What does it cost?</strong> The OnePlus Pad 2 costs <a href="https://www.oneplus.com/us/buy-oneplus-pad-go-2" target="_blank" rel="nofollow"><u>$399 on OnePlus’ website</u></a>. Right now, you can select either the OnePlus Pad Go 2 Folio Case or Pad Go 2 Stylo as a free gift. Separately, the former costs $44 while the latter sells for $79. However, at time of writing, these add-ons cost $31and $59 (respectively).</li><li><strong>What do we like?</strong> We like the bright and colorful display, snappy, user-friendly operating system, and easy portability.</li><li><strong>What don’t we like?</strong> The somewhat boring design compared to other OnePlus Pads and slow charging.</li></ul><h3 class="article-body__section" id="section-oneplus-pad-go-2-review-specs"><span>OnePlus Pad Go 2 review: Specs</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>OnePlus Pad 2 Go</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$399</p></td></tr><tr><td class="firstcol " ><p><strong>OS</strong></p></td><td  ><p>OxygenOS 16</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>12.1-inches (2800 x 1980) LCD, 7:5 aspect ratio | 120Hz adaptive refresh rate</p></td></tr><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>MediaTek Dimensity 7300-Ultra</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>8GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>128GB</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>1x USB-C</p></td></tr><tr><td class="firstcol " ><p><strong>Camera</strong></p></td><td  ><p>8MP rear, 8MP back</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Wi-Fi 6, 5G</p></td></tr><tr><td class="firstcol " ><p><strong>Battery life</strong></p></td><td  ><p>16 hours 39 minutes (tested)</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>10.47 x 7.59 x 0.27 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>1.32 pounds</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-oneplus-pad-go-2-review-the-ups"><span>OnePlus Pad Go 2 review: The ups</span></h3><p>The OnePlus Pad Go 2 is a fantastic mid-range Android tablet thanks to its bright and colorful display, fast performance, and fluid operating system. Its long battery life is another major bonus.</p><h2 id="vivid-display-3">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="4xqEP7e3DUuLuWpB7Xo6JM" name="OnePlus-Pad-Go-2--06" alt="OnePlus Pad Go 2 display" src="https://cdn.mos.cms.futurecdn.net/4xqEP7e3DUuLuWpB7Xo6JM-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The 12.1-inch 2800 x 1980 LCD panel delivers a fine viewing and reading experience. The oversaturated colors help comics pop off the screen, while the sharp resolution makes it easier to read text.</p><p>Watching videos like the X-Men-focused Avengers: Doomsday trailer is just as enjoyable, as I’m able to see all the different shades of red in Cyclops’ optic blast. Everything runs buttery smooth thanks to the variable 120Hz refresh rate.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>OnePlus Pad Go 2</strong></p></td><td  ><p><strong>iPad 11</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Nits (brightness)</strong></p></td><td  ><p>544 (SDR) | 554 (HDR)</p></td><td  ><p>485 (SDR) | 476%</p></td></tr><tr><td class="firstcol " ><p><strong>sRGB</strong></p></td><td  ><p>159.6%</p></td><td  ><p>117.6%</p></td></tr><tr><td class="firstcol " ><p><strong>DCI-P3</strong></p></td><td  ><p>113.1%</p></td><td  ><p>83.3%</p></td></tr><tr><td class="firstcol " ><p><strong>Delta-E</strong></p></td><td  ><p>0.29</p></td><td  ><p>0.22</p></td></tr></tbody></table></div><p>Our lab tests confirm my anecdotal experience. As you can see in the table below, the OnePlus Pad Go 2 does indeed have oversaturated color representation (sRGB and DCI-P3), along with good color accuracy (Delta-E). While the brightness doesn’t exactly hit the advertised 900 nits in high brightness mode, the average 554 nits of HDR brightness is more than enough for outdoor watching.</p><p>How does the OnePlus Pad Go 2 compare to the <a href="https://www.tomsguide.com/computing/ipads/ipad-11-2025-review"><u>iPad 11</u></a>? The display on OnePlus’ slate can get brighter and has more vivid hues. While the numbers might favor the Pad Go 2, the iPad offers more naturalistic tones. Color accuracy is also just slightly better on the iPad.</p><h2 id="lightweight-design">Lightweight 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="vtWHkrUiaWqSCdAPP8M4AT" name="OnePlus-Pad-Go-2--16" alt="OnePlus Pad Go 2" src="https://cdn.mos.cms.futurecdn.net/vtWHkrUiaWqSCdAPP8M4AT-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>You’d be forgiven for mistaking the OnePlus Pad Go 2 for an iPad. The design isn’t identical, but it’s very close. Though some folks aren’t fond of the large rear cameras on OnePlus’ tablets, no one can deny they give the slates a distinctive look. Losing that aspect is a bit of a bummer.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="AaM7K8et6FRCw5rt5XYAsY" name="OnePlus-Pad-Go-2--14" alt="OnePlus Pad Go 2" src="https://cdn.mos.cms.futurecdn.net/AaM7K8et6FRCw5rt5XYAsY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Even if the Pad Go 2 has a fairly basic shape, it’s a design that makes it easy to use and carry around. At 10.47 x 7.59 x 0.27 inches and 1.32 pounds, you can comfortably hold this slate for extended periods. It’s also lightweight and thin enough to slip into your backpack and forget it’s there.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="oiYSXjSyZMsSEZPefz34kf" name="OnePlus-Pad-Go-2--09" alt="OnePlus Pad Go 2" src="https://cdn.mos.cms.futurecdn.net/oiYSXjSyZMsSEZPefz34kf-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>One unique aspect that the Pad Go 2 retains is the display’s 7:5 aspect ratio, which makes it taller and wider than many tablets. The display’s proportions are closer to a laptop’s. This aspect ratio is perfect for novels and comics, so I’m glad OnePlus didn’t change that.</p><p>Even if the OnePlus Pad Go 2’s design isn’t that distinct, it’s still functional, portable and comfortable to use — exactly what you want in a tablet.</p><h2 id="good-performance">Good 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="8XsLgVYSvbRQStVnUEwU6m" name="OnePlus-Pad-Go-2--07" alt="OnePlus Pad Go 2" src="https://cdn.mos.cms.futurecdn.net/8XsLgVYSvbRQStVnUEwU6m-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The OnePlus Pad Go 2 runs on the MediaTek Dimensity 7300-Ultra processor and packs 8GB of RAM. While these aren’t high-end components, they provide this slate with enough power for smooth multitasking and running relatively demanding apps.</p><p>Playing a YouTube video while multitasking across various apps didn’t present a problem for the OnePlus Pad Go 2, as everything ran smoothly and without slowing down. I saw some stuttering and frame rate drops in Genshin Impact, but it wasn’t enough to kill the experience.</p><div ><table><caption>Performance tests</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>OnePlus Pad Go 2</strong></p></td><td  ><p><strong>iPad 11</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong></p></td><td  ><p>MediaTek Dimensity 7300-Ultra</p></td><td  ><p>Apple A16</p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6 score (single-core / multi-core)</strong></p></td><td  ><p>1013 / 3081</p></td><td  ><p>3042 / 11804</p></td></tr><tr><td class="firstcol " ><p><strong>3DMark Wild Life Extreme Unlimited (score/fps)</strong></p></td><td  ><p>863 / 5.17</p></td><td  ><p>5806 / 34.8</p></td></tr></tbody></table></div><p>On the Geekbench 6 CPU test, the OnePlus Pad Go 2 performed decently, though it’s clearly outmatched by the iPad 11 with its more powerful A16 chip. Apple’s tablet also lapped the Pad Go 2 on the 3D Mark graphics test.</p><p>Though the iPad 11 outclasses the OnePlus Pad Go 2 in our performance tests, you’ll find it performs surprisingly well under real-world conditions. This is impressive for a mid-range Android tablet.</p><h2 id="epic-battery-life-2">Epic battery life</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="96NaEY5hHx5uRbARrK7raC" name="OnePlus-Pad-Go-2--13" alt="OnePlus Pad Go 2" src="https://cdn.mos.cms.futurecdn.net/96NaEY5hHx5uRbARrK7raC-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The OnePlus Pad Go 2 is one of the longest-lasting Android tablets we’ve tested. In our battery life test, which involves continuous web surfing over Wi-Fi with the display set to 150 nits of brightness, the OnePlus Pad Go 2 lasted for an epic 16 hours and 39 minutes. As you can see below, that’s basically seven hours longer than the iPad 11.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Time (hours:mins)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>OnePlus Pad Go 2</strong></p></td><td  ><p>16:39</p></td></tr><tr><td class="firstcol " ><p><strong>iPad 11</strong></p></td><td  ><p>9:41</p></td></tr></tbody></table></div><p>During my own testing, I watched YouTube videos, browsed the web, and played games for about two hours, and the battery dropped to 80%. If you forget the tablet’s charger at home, you won’t be worried at all.</p><h2 id="snappy-oxygen-os">Snappy Oxygen OS</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="5WNPzYLQrWPTdr5UgTtzU4" name="OnePlus-Pad-Go-2--03" alt="OnePlus Pad Go 2" src="https://cdn.mos.cms.futurecdn.net/5WNPzYLQrWPTdr5UgTtzU4-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>OnePlus’ OxygenOS 16 is one of my favorite things about the Pad Go 2. There’s a taskbar with your most recently used files, a built-in app drawer that helps with navigation, and a two-pane view that also facilitates navigation. Features like this make using the tablet feel very intuitive.</p><p>Speaking of productivity, Open Canvas is a fantastic multitasking tool for those who want to use this tablet for work. You can have up to three apps in an interface that allows you to keep said apps at your preferred size. Like with Open Canvas on the OnePlus Pad 3, the Pad Go 2 makes suggested pairings if you frequently switch between apps. I find these suggestions pretty handy. Performing the gestures required for this sort of splitview is pretty seamless.</p><p>As expected from a modern computing device, the OnePlus Pad Go 2 has built-in AI features. This includes summaries, text generation, and translation — all of which you can access by swiping the side of the screen whenever you need these features. You’ll also find dedicated buttons for them in relevant apps. I didn’t find much use for these features, but they could be useful to you.</p><p>Though I still prefer iPadOS 26 over OxygenOS 16, the latter is an excellent skin for Android that functions wonderfully.</p><h3 class="article-body__section" id="section-oneplus-pad-go-2-review-the-downs"><span>OnePlus Pad Go 2 review: The downs</span></h3><p>The OnePlus Pad Go 2 is an almost perfect Android tablet. Unfortunately, it has one flaw that can be frustrating if you’re in a hurry.</p><h2 id="slow-charging">Slow charging</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HyF5Ds9HSxgtaU64f5zGcJ" name="OnePlus-Pad-Go-2--15" alt="OnePlus Pad Go 2 camera" src="https://cdn.mos.cms.futurecdn.net/HyF5Ds9HSxgtaU64f5zGcJ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>While the OnePlus Pad Go 2 offers incredible endurance, charging its 10050 mAh battery takes an inordinate amount of time. The tablet is supposed to have “fast” 33W charging, but in my experience, charging is anything but fast. It took me a little over two hours to fully charge the slate from zero percent battery, which can feel like an eternity.</p><p>I bring up slow charging because I know this could be a point of contention for some. While I wish charging didn’t take as long, the trade-off is that you get exceptional battery life. Because of that, you won’t always have to keep charging this tablet. It comes down to whether you want a long-lasting battery or fast charging.</p><h3 class="article-body__section" id="section-oneplus-pad-go-2-review-verdict"><span>OnePlus Pad Go 2 review: Verdict</span></h3><p>The OnePlus Pad Go 2 proves that Android tablets can be just as enjoyable and functional to use as Apple’s iPads. Granted, those already deep in the Apple ecosystem likely won’t be swayed to buy this slate, but if you’re platform agnostic, OnePlus’ tablet is a fantastic alternative.</p><p>If you need a mid-range tablet that delivers better overall performance, offers greater app compatibility, and has an OS that will be supported for many years, then the iPad 11 is your best bet. However, if you’re into Android tablets or want a slate that plays nice with your OnePlus phone, you should give the OnePlus Pad Go 2 a shot. I promise you won’t be disappointed.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung's Tech Upgrade sale lets you nab epic bonus savings on already-discounted devices by trading in your old ones — up to AU$2,800 off ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Is your TV, smartphone, tablet, or even washing machine starting to show its age? Don’t stress, because Samsung Australia's <a href="https://www.samsung.com/au/offer/tech-upgrade/" target="_blank">Tech Upgrade</a> sale is still going strong! </p><p>The sale, which started earlier this month, lets you pair huge discounts with Samsung's Trade-Up program, making it easy to replace your worn-out gadgets for shiny new ones, all while saving you a nice chunk of change.</p><p>I'm not talking small discounts, either — depending on the device you're trading in and the product you're looking to upgrade to, you could save thousands of dollars.</p><p>For instance, <a href="https://www.samsung.com/au/tvs/oled-tv/s85f-83-inch-oled-4k-vision-ai-smart-tv-qa83s85faexxy/" target="_blank">Samsung's 83-inch OLED S85F 4K TV </a>currently has an initial discount of AU$2,200, bringing its price down to <del>AU$6,999</del> AU$4,799, which is already a mammoth saving. However, you can get up to an additional AU$325 off by trading in your old television — that's a potential saving of AU$2,525 on the RRP!</p><div class="product"><a data-dimension112="0f757904-45c6-4ef7-b11f-f26bb6e98127" data-action="Deal Block" data-label="OLED S85F 4K TV (85-inch)" data-dimension48="OLED S85F 4K TV (85-inch)" data-dimension25="$4799" href="https://www.samsung.com/au/tvs/oled-tv/s85f-83-inch-oled-4k-vision-ai-smart-tv-qa83s85faexxy/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="yzwZJQo8srHr7cbq9xMjaG" name="Samsung-S85F-OLED-TV" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yzwZJQo8srHr7cbq9xMjaG-1920-80.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.samsung.com/au/tvs/oled-tv/s85f-83-inch-oled-4k-vision-ai-smart-tv-qa83s85faexxy/" target="_blank" rel="nofollow" data-dimension112="0f757904-45c6-4ef7-b11f-f26bb6e98127" data-action="Deal Block" data-label="OLED S85F 4K TV (85-inch)" data-dimension48="OLED S85F 4K TV (85-inch)" data-dimension25="$4799">OLED S85F 4K TV (85-inch): was $6999 now $4799</a></strong><br><strong>Get up to an extra AU$325 off with trade in</strong></p><p>Samsung’s 83-inch OLED S85F 4K TV is currently going for AU$4,799 after a hefty AU$2,200 discount, which is already a massive saving. On top of that, you can score up to an extra AU$325 off by trading in your old TV — meaning you could save as much as AU$2,525. Simply select 'Yes, please' on the 'Recycle your old TV to get up to $325.00 off' option on the S85F's listing page and then choose the size and brand of your trade-in TV.<a class="view-deal button" href="https://www.samsung.com/au/tvs/oled-tv/s85f-83-inch-oled-4k-vision-ai-smart-tv-qa83s85faexxy/" target="_blank" rel="nofollow" data-dimension112="0f757904-45c6-4ef7-b11f-f26bb6e98127" data-action="Deal Block" data-label="OLED S85F 4K TV (85-inch)" data-dimension48="OLED S85F 4K TV (85-inch)" data-dimension25="$4799">View Deal</a></p></div><p>Alternatively, you could opt for the 77-inch model of Samsung's flagship 4K OLED TV of last year, the S95F, which sports a huge AU$1,200 discount up front, bringing its price down to just <del>AU$7,999</del> <a href="https://www.samsung.com/au/tvs/oled-tv/s95f-77-inch-oled-4k-vision-ai-smart-tv-qa77s95fawxxy/">AU$6,799</a>. On top of that discount, you can also get up to AU$375 of trade-in value for your old TV, meaning you can nab this stunning television for only AU$6,424.</p><p>In my 4.5-star <a href="https://www.tomsguide.com/tvs/4k-tvs/samsung-s95f-oled-tv-review">Samsung S95F OLED TV review</a>, I praised its "game-changing anti-glare display" and "exceptional picture quality", calling it "Samsung's greatest OLED television to date," and I still stand by all of that.</p><div class="product"><a data-dimension112="8821fb3b-b435-4517-a44e-8f59285e8b72" data-action="Deal Block" data-label="OLED S95F 4K TV (77-inch)" data-dimension48="OLED S95F 4K TV (77-inch)" data-dimension25="$6799" href="https://www.samsung.com/au/tvs/oled-tv/s95f-77-inch-oled-4k-vision-ai-smart-tv-qa77s95fawxxy/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="8TasePr6eYqVGT6m6YMxPe" name="samsung-s95f-1-by-1-block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/8TasePr6eYqVGT6m6YMxPe-1920-80.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.samsung.com/au/tvs/oled-tv/s95f-77-inch-oled-4k-vision-ai-smart-tv-qa77s95fawxxy/" target="_blank" rel="nofollow" data-dimension112="8821fb3b-b435-4517-a44e-8f59285e8b72" data-action="Deal Block" data-label="OLED S95F 4K TV (77-inch)" data-dimension48="OLED S95F 4K TV (77-inch)" data-dimension25="$6799">OLED S95F 4K TV (77-inch): was $7999 now $6799</a></strong><br><strong>Get up to an extra AU$375 off with trade in</strong></p><p>Thanks to the Tech Upgrade sale, you can snag a fantastic AU$1,200 discount on the 77-inch model of Samsung's flagship OLED TV of 2025, the S95F, plus get up to AU$375 in trade-in credit for your old telly. That means you could grab this incredible OLED for just AU$6,424 — an absolute bargain! All you have to do is select the 77-inch size option, click on <strong>'Yes, please'</strong> in the '<strong>Recycle your old TV to get up to $375.00 off'</strong> section of the TV's listing page, then follow the instructions.<a class="view-deal button" href="https://www.samsung.com/au/tvs/oled-tv/s95f-77-inch-oled-4k-vision-ai-smart-tv-qa77s95fawxxy/" target="_blank" rel="nofollow" data-dimension112="8821fb3b-b435-4517-a44e-8f59285e8b72" data-action="Deal Block" data-label="OLED S95F 4K TV (77-inch)" data-dimension48="OLED S95F 4K TV (77-inch)" data-dimension25="$6799">View Deal</a></p></div><p>If a new tablet is what you're after, you're in luck — Samsung is also offering some big savings on its <a href="https://www.samsung.com/au/tablets/galaxy-tab-s10/buy/" target="_blank">Galaxy Tab S10 </a>and <a href="https://www.samsung.com/au/tablets/galaxy-tab-s11/buy/">Tab S11</a> slates, with select models reduced by AU$300 right off the bat, with up to AU$940 of additional trade-in value up for grabs. Best of all, your old tablet will fetch at least AU$400 in trade-in, no matter how old or damaged it is.</p><div class="product"><a data-dimension112="05e0cf0f-76b1-4d58-bdb2-7588f0efdddc" data-action="Deal Block" data-label="Galaxy Tab S11 Ultra" data-dimension48="Galaxy Tab S11 Ultra" data-dimension25="$1799" href="https://www.samsung.com/au/tablets/galaxy-tab-s11/buy/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1309px;"><p class="vanilla-image-block" style="padding-top:100.08%;"><img id="V83SZAMqBids4kXBadCPdY" name="Samsung-Galaxy-Tab-S11" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/V83SZAMqBids4kXBadCPdY-1920-80.jpg" mos="" align="middle" fullscreen="" width="1309" height="1310" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Get up to an extra AU$720 off with trade in (guaranteed AU$400 minimum trade-in value)</strong></p><p>This one's a little confusing, so bear with us — right now, you'll get AU$300 off at checkout on any Samsung Galaxy Tab S11 Ultra model, along with a minimum of AU$400 in trade-in value for your old tablet, even if it's old and damaged. However, if your trade-in tablet is in good nick, you can get up to AU$720 in trade-in value, meaning it's possible to get the 256GB / 12GB Galaxy Tab S11 for only <del>AU$2,099</del> AU$1,079. That's insanely good value! Offer ends February 25, 2026.<a class="view-deal button" href="https://www.samsung.com/au/tablets/galaxy-tab-s11/buy/" target="_blank" rel="nofollow" data-dimension112="05e0cf0f-76b1-4d58-bdb2-7588f0efdddc" data-action="Deal Block" data-label="Galaxy Tab S11 Ultra" data-dimension48="Galaxy Tab S11 Ultra" data-dimension25="$1799">View Deal</a></p></div><p>These are just our top device picks from Samsung's Tech Upgrade sale, which will keep adding and removing deals until March 4, 2026. </p><p>Be sure to check out the Tech Upgrade sale <a href="https://www.samsung.com/au/offer/tech-upgrade/" target="_blank">landing page</a> to see everything on offer, including an <a href="https://www.samsung.com/au/washers-and-dryers/washer-dryer-combo/wd8000dk-combo-all-in-one-combo-super-speed-18-5kg-gray-wd18db8995bzsa/" target="_blank">18.5kg/10kg Bespoke AI washer and dryer combo</a> that’s been discounted by AU$2,000, plus up to AU$800 trade-in value for your old machine. That's a potential saving of AU$2,800 on the RRP!</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/sales-events/samsungs-tech-upgrade-sale-lets-you-nab-epic-bonus-savings-on-already-discounted-devices-by-trading-in-your-old-ones-up-to-au2-900-off</link>
                                                                            <description>
                            <![CDATA[ Now's the time to upgrade your tired tech, with huge discounts up for grabs on Samsung's top phones, TVs, tablets and more. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Wo5M3dAzG8Lcoe8hq9cDia</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/eQKTKfWTUM3NcCyPrsCVLE-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 06 Feb 2026 04:57:30 +0000</pubDate>                                                                                                                                <updated>Fri, 20 Feb 2026 01:41:06 +0000</updated>
                                                                                                                                            <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[TVs]]></category>
                                                    <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                                    <dc:creator><![CDATA[ Stephen Lambrechts ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/JN3jEQpqyyt32as8AJJqXe-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Stephen Lambrechts is the Managing Editor of Tom&#039;s Guide AU and has written professionally across the categories of tech, film, television and gaming for the last 15 years. Before Tom&#039;s Guide, he spent several years as a Senior Journalist at TechRadar, had a brief stint as Editor in Chief at Official Xbox Magazine Australia, and worked at IGN. He&#039;s also written for such mags and sites as APC, TechLife Australia, T3, FilmInk, Daily Telegraph and AskMen. Additionally, he&#039;s a Tomatometer-approved critic on Rotten Tomatoes, and has offered his tech advice on radio and television.&lt;/p&gt;&lt;p&gt;He&#039;s an expert when it comes to smartphones, TVs, gaming and streaming, having contributed many reviews in each of those categories over the years. Despite his many articles on streaming, he&#039;s a passionate collector of physical media who enjoys listening to vinyl records and acquiring obscure horror movies from the &#039;60s, &#039;70s and 80s. He can usually be seen rocking the latest retro sneaker releases, particularly Air Jordans and Reebok Pumps. Occasionally, he also indulges in other non-hipster stuff, like hiking.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/eQKTKfWTUM3NcCyPrsCVLE-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Various Samsung products against a pink gradient background with &#039;Killer Deal&#039; badge overlaid]]></media:description>                                                            <media:text><![CDATA[Various Samsung products against a pink gradient background with &#039;Killer Deal&#039; badge overlaid]]></media:text>
                                <media:title type="plain"><![CDATA[Various Samsung products against a pink gradient background with &#039;Killer Deal&#039; badge overlaid]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/eQKTKfWTUM3NcCyPrsCVLE-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Is your TV, smartphone, tablet, or even washing machine starting to show its age? Don’t stress, because Samsung Australia's <a href="https://www.samsung.com/au/offer/tech-upgrade/" target="_blank">Tech Upgrade</a> sale is still going strong! </p><p>The sale, which started earlier this month, lets you pair huge discounts with Samsung's Trade-Up program, making it easy to replace your worn-out gadgets for shiny new ones, all while saving you a nice chunk of change.</p><p>I'm not talking small discounts, either — depending on the device you're trading in and the product you're looking to upgrade to, you could save thousands of dollars.</p><p>For instance, <a href="https://www.samsung.com/au/tvs/oled-tv/s85f-83-inch-oled-4k-vision-ai-smart-tv-qa83s85faexxy/" target="_blank">Samsung's 83-inch OLED S85F 4K TV </a>currently has an initial discount of AU$2,200, bringing its price down to <del>AU$6,999</del> AU$4,799, which is already a mammoth saving. However, you can get up to an additional AU$325 off by trading in your old television — that's a potential saving of AU$2,525 on the RRP!</p><div class="product"><a data-dimension112="0f757904-45c6-4ef7-b11f-f26bb6e98127" data-action="Deal Block" data-label="OLED S85F 4K TV (85-inch)" data-dimension48="OLED S85F 4K TV (85-inch)" data-dimension25="$4799" href="https://www.samsung.com/au/tvs/oled-tv/s85f-83-inch-oled-4k-vision-ai-smart-tv-qa83s85faexxy/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="yzwZJQo8srHr7cbq9xMjaG" name="Samsung-S85F-OLED-TV" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yzwZJQo8srHr7cbq9xMjaG-1920-80.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.samsung.com/au/tvs/oled-tv/s85f-83-inch-oled-4k-vision-ai-smart-tv-qa83s85faexxy/" target="_blank" rel="nofollow" data-dimension112="0f757904-45c6-4ef7-b11f-f26bb6e98127" data-action="Deal Block" data-label="OLED S85F 4K TV (85-inch)" data-dimension48="OLED S85F 4K TV (85-inch)" data-dimension25="$4799">OLED S85F 4K TV (85-inch): was $6999 now $4799</a></strong><br><strong>Get up to an extra AU$325 off with trade in</strong></p><p>Samsung’s 83-inch OLED S85F 4K TV is currently going for AU$4,799 after a hefty AU$2,200 discount, which is already a massive saving. On top of that, you can score up to an extra AU$325 off by trading in your old TV — meaning you could save as much as AU$2,525. Simply select 'Yes, please' on the 'Recycle your old TV to get up to $325.00 off' option on the S85F's listing page and then choose the size and brand of your trade-in TV.<a class="view-deal button" href="https://www.samsung.com/au/tvs/oled-tv/s85f-83-inch-oled-4k-vision-ai-smart-tv-qa83s85faexxy/" target="_blank" rel="nofollow" data-dimension112="0f757904-45c6-4ef7-b11f-f26bb6e98127" data-action="Deal Block" data-label="OLED S85F 4K TV (85-inch)" data-dimension48="OLED S85F 4K TV (85-inch)" data-dimension25="$4799">View Deal</a></p></div><p>Alternatively, you could opt for the 77-inch model of Samsung's flagship 4K OLED TV of last year, the S95F, which sports a huge AU$1,200 discount up front, bringing its price down to just <del>AU$7,999</del> <a href="https://www.samsung.com/au/tvs/oled-tv/s95f-77-inch-oled-4k-vision-ai-smart-tv-qa77s95fawxxy/">AU$6,799</a>. On top of that discount, you can also get up to AU$375 of trade-in value for your old TV, meaning you can nab this stunning television for only AU$6,424.</p><p>In my 4.5-star <a href="https://www.tomsguide.com/tvs/4k-tvs/samsung-s95f-oled-tv-review">Samsung S95F OLED TV review</a>, I praised its "game-changing anti-glare display" and "exceptional picture quality", calling it "Samsung's greatest OLED television to date," and I still stand by all of that.</p><div class="product"><a data-dimension112="8821fb3b-b435-4517-a44e-8f59285e8b72" data-action="Deal Block" data-label="OLED S95F 4K TV (77-inch)" data-dimension48="OLED S95F 4K TV (77-inch)" data-dimension25="$6799" href="https://www.samsung.com/au/tvs/oled-tv/s95f-77-inch-oled-4k-vision-ai-smart-tv-qa77s95fawxxy/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="8TasePr6eYqVGT6m6YMxPe" name="samsung-s95f-1-by-1-block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/8TasePr6eYqVGT6m6YMxPe-1920-80.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.samsung.com/au/tvs/oled-tv/s95f-77-inch-oled-4k-vision-ai-smart-tv-qa77s95fawxxy/" target="_blank" rel="nofollow" data-dimension112="8821fb3b-b435-4517-a44e-8f59285e8b72" data-action="Deal Block" data-label="OLED S95F 4K TV (77-inch)" data-dimension48="OLED S95F 4K TV (77-inch)" data-dimension25="$6799">OLED S95F 4K TV (77-inch): was $7999 now $6799</a></strong><br><strong>Get up to an extra AU$375 off with trade in</strong></p><p>Thanks to the Tech Upgrade sale, you can snag a fantastic AU$1,200 discount on the 77-inch model of Samsung's flagship OLED TV of 2025, the S95F, plus get up to AU$375 in trade-in credit for your old telly. That means you could grab this incredible OLED for just AU$6,424 — an absolute bargain! All you have to do is select the 77-inch size option, click on <strong>'Yes, please'</strong> in the '<strong>Recycle your old TV to get up to $375.00 off'</strong> section of the TV's listing page, then follow the instructions.<a class="view-deal button" href="https://www.samsung.com/au/tvs/oled-tv/s95f-77-inch-oled-4k-vision-ai-smart-tv-qa77s95fawxxy/" target="_blank" rel="nofollow" data-dimension112="8821fb3b-b435-4517-a44e-8f59285e8b72" data-action="Deal Block" data-label="OLED S95F 4K TV (77-inch)" data-dimension48="OLED S95F 4K TV (77-inch)" data-dimension25="$6799">View Deal</a></p></div><p>If a new tablet is what you're after, you're in luck — Samsung is also offering some big savings on its <a href="https://www.samsung.com/au/tablets/galaxy-tab-s10/buy/" target="_blank">Galaxy Tab S10 </a>and <a href="https://www.samsung.com/au/tablets/galaxy-tab-s11/buy/">Tab S11</a> slates, with select models reduced by AU$300 right off the bat, with up to AU$940 of additional trade-in value up for grabs. Best of all, your old tablet will fetch at least AU$400 in trade-in, no matter how old or damaged it is.</p><div class="product"><a data-dimension112="05e0cf0f-76b1-4d58-bdb2-7588f0efdddc" data-action="Deal Block" data-label="Galaxy Tab S11 Ultra" data-dimension48="Galaxy Tab S11 Ultra" data-dimension25="$1799" href="https://www.samsung.com/au/tablets/galaxy-tab-s11/buy/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1309px;"><p class="vanilla-image-block" style="padding-top:100.08%;"><img id="V83SZAMqBids4kXBadCPdY" name="Samsung-Galaxy-Tab-S11" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/V83SZAMqBids4kXBadCPdY-1920-80.jpg" mos="" align="middle" fullscreen="" width="1309" height="1310" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Get up to an extra AU$720 off with trade in (guaranteed AU$400 minimum trade-in value)</strong></p><p>This one's a little confusing, so bear with us — right now, you'll get AU$300 off at checkout on any Samsung Galaxy Tab S11 Ultra model, along with a minimum of AU$400 in trade-in value for your old tablet, even if it's old and damaged. However, if your trade-in tablet is in good nick, you can get up to AU$720 in trade-in value, meaning it's possible to get the 256GB / 12GB Galaxy Tab S11 for only <del>AU$2,099</del> AU$1,079. That's insanely good value! Offer ends February 25, 2026.<a class="view-deal button" href="https://www.samsung.com/au/tablets/galaxy-tab-s11/buy/" target="_blank" rel="nofollow" data-dimension112="05e0cf0f-76b1-4d58-bdb2-7588f0efdddc" data-action="Deal Block" data-label="Galaxy Tab S11 Ultra" data-dimension48="Galaxy Tab S11 Ultra" data-dimension25="$1799">View Deal</a></p></div><p>These are just our top device picks from Samsung's Tech Upgrade sale, which will keep adding and removing deals until March 4, 2026. </p><p>Be sure to check out the Tech Upgrade sale <a href="https://www.samsung.com/au/offer/tech-upgrade/" target="_blank">landing page</a> to see everything on offer, including an <a href="https://www.samsung.com/au/washers-and-dryers/washer-dryer-combo/wd8000dk-combo-all-in-one-combo-super-speed-18-5kg-gray-wd18db8995bzsa/" target="_blank">18.5kg/10kg Bespoke AI washer and dryer combo</a> that’s been discounted by AU$2,000, plus up to AU$800 trade-in value for your old machine. That's a potential saving of AU$2,800 on the RRP!</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tried the TCL NXTPAPER 11 Plus and this budget tablet is easily my iPad killer — here’s why ]]></title>
                                                                                                <dc:content><![CDATA[ <p>It’s not every day I’m walking through a mall and end up stopping in my tracks to play with a tablet, but that’s exactly what happened last summer in Taiwan.</p><p>After a week of checking out the latest gadgets at <a href="https://www.tomsguide.com/computing/best-of-computex-2025-the-top-15-gadgets-of-the-worlds-biggest-computing-show">Computex</a>, I headed to Taipei’s legendary electronics market, <a href="https://www.tomsguide.com/video/OgRcRb3T/what-can-50-buy-at-taiwan-039-s-craziest-tech-mall">Guang Hua Digital Plaza</a> for some last-minute sightseeing. While I usually prefer smaller tablets like the <a href="https://www.tomsguide.com/tablets/i-spent-two-weeks-with-the-ipad-mini-7-and-it-reignited-my-love-for-smaller-tablets">iPad mini</a> or the <a href="https://www.tomsguide.com/computing/tablets/i-thought-the-ipad-mini-was-the-perfect-small-tablet-until-i-tried-the-lenovo-legion-tab-3-heres-why">Lenovo Legion Tab 3</a>, the TCL NXTPAPER 14 immediately stood out. Maybe it was the massive 14.3-inch screen or the chance to finally see and feel TCL’s innovative <a href="https://www.tomsguide.com/phones/android-phones/im-fascinated-by-tcls-new-e-reader-style-screen-for-smartphones">NXTPAPER</a> tech in person, but I was hooked.</p><p>Late last year, TCL sent over that same tablet along with its smaller, more powerful NXTPAPER 11 Plus and even a smartphone with the same paper-like display for me to test out at home. While its larger sibling hooked me initially, the NXTPAPER 11 Plus quickly became my go-to device. Its 11.5-inch screen makes it easy to slip into a bag and it’s also the perfect size for reading.</p><p>Unlike with other tablets I’ve tried in the past, I didn’t feel compelled to put a screen protector on this one and I’m glad I didn’t, as doing so would ruin my favorite thing about it: the paper-like feel of its matte display. I also didn’t have to worry about finding a case for the NXTPAPER 11 Plus since TCL includes one in the box along with a fully equipped stylus.</p><p>Here’s what it’s been like using TCL’s NXTPAPER tech for the past two months and why the NXTPAPER 11 Plus is easily one of the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a> on a budget, especially if you’ve flirted with the idea of picking up a <a href="https://www.tomsguide.com/tablets/remarkable-paper-pro">reMarkable Paper Pro</a> over a standard Android tablet.</p><div class="product"><a data-dimension112="4c28c854-7067-4a1b-b1ec-e0eeee043c54" data-action="Deal Block" data-label="NXTPAPER 11 Plus" data-dimension48="NXTPAPER 11 Plus" data-dimension25="$269.00" href="https://www.amazon.com/TCL-NXTPAPER-Android-Notebook-Included/dp/B0FLJMFNR7" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1376px;"><p class="vanilla-image-block" style="padding-top:86.70%;"><img id="2rmQkEzhXCeVzcYeLEFNn9" name="NXTPAPER 11 Plus" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/2rmQkEzhXCeVzcYeLEFNn9-1920-80.jpg" mos="" align="middle" fullscreen="" width="1376" height="1193" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This 11.5-inch Android tablet boasts a 120Hz, 2.2K display with an 8,000 mAh battery but its TCL's NXTPAPER 4.0 tech that really makes it stand out. You get a paper-like feel when scrolling with your finger or taking notes with the included stylus. The NXTPAPER 11 Plus also comes with a carrying case.<a class="view-deal button" href="https://www.amazon.com/TCL-NXTPAPER-Android-Notebook-Included/dp/B0FLJMFNR7" target="_blank" rel="nofollow" data-dimension112="4c28c854-7067-4a1b-b1ec-e0eeee043c54" data-action="Deal Block" data-label="NXTPAPER 11 Plus" data-dimension48="NXTPAPER 11 Plus" data-dimension25="$269.00">View Deal</a></p></div><h2 id="surprisingly-equipped-right-out-of-the-box">Surprisingly equipped right out of the box</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="BDUq3Ybc4UMPhmiTwtgLEn" name="TCL NXTPAPER 11 Plus-8" alt="The TCL NXTPAPER 11 Plus unboxed on a desk" src="https://cdn.mos.cms.futurecdn.net/BDUq3Ybc4UMPhmiTwtgLEn-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>At a time when you’re lucky to get a USB-C cable in the box, I was instantly impressed by everything TCL manages to cram into the box with both the NXTPAPER 14 and the NXTPAPER 14 Plus. </p><p>Unlike with one of the <a href="https://www.tomsguide.com/best-picks/best-ipad">best iPads</a>, it can be hard finding a case or other accessories for some Android tablets. TCL takes the guesswork out with its tablets so instead of shopping for the right case, you can get right to using your new device.</p><p>I really like the included folio case for a couple of reasons. For starters, it’s magnetic and instantly turns off your tablet’s screen when closed. However, there are also plastic feet on the bottom side that, in addition to turning the case into a very sturdy stand, provide you with a place to store the included stylus.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cbwTk6SN3SzVTCRFYKXCP6" name="TCL NXTPAPER 11 Plus-5" alt="A person using the included stylus to scroll through stories in Google Discover on the TCL NXTPAPER 11 Plus" src="https://cdn.mos.cms.futurecdn.net/cbwTk6SN3SzVTCRFYKXCP6-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I’m no digital artist by any means but I’m quite partial to having a stylus for each of my tablets. I find <a href="https://www.tomsguide.com/opinion/i-finally-got-the-right-stylus-for-my-chromebook-and-its-a-game-changer">using a stylus</a> makes it a lot easier to scroll through the news each morning without accidentally opening stories I wasn’t planning on reading. The same goes for poking around a device’s settings menu and quickly making changes like not having new apps added to my home screen for instance.</p><p>I also really like how this is an active stylus that’s pre-paired with the NXTPAPER 11 Plus. After powering it on, I was able to start using it right away and surprisingly, I haven’t even had to charge it yet, though it does get up to 100 hours of use on a single charge. There are also two up and down keys on the stylus that you can program to do things like instantly take you back to the home screen or open TCL’s Sidebar. </p><p>Speaking of which, the Sidebar is a collection of customizable shortcuts that you can access by swiping with your finger (or the stylus) to go back and holding it there for an extra second or so. You can add actions like taking a screenshot as well as shortcuts to your favorite apps. I found this feature to be both pretty clever and well implemented.</p><p>The included case and stylus are useful extras but it’s the display itself and TCL’s proprietary screen technology that kept me going back to the NXTPAPER 11 Plus again and again.</p><h2 id="an-almost-instant-transformation">An almost instant transformation</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="P5NBEn6vUrPhkjceJqzK9B" name="TCL NXTPAPER 11 Plus-7" alt="A close up shot of the NXTPAPER Key on the TCL NXTPAPER 11 Plus" src="https://cdn.mos.cms.futurecdn.net/P5NBEn6vUrPhkjceJqzK9B-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The NXTPAPER 11 Plus has your standard USB-C port on the side as well as a power button and volume rocker up top. However, across from those two buttons is the device's namesake NXTPAPER Key. This is where the device’s magic happens and on this newer tablet, it’s also equipped with a backlight that you can turn on or off. When enabled, the light “breathes,” perhaps to help you remember that a total display transformation is just a button press away.</p><p>The NXTPAPER Key is also customizable and you can choose what a single press, double press and long press does. By default, a single press lets you switch between its three different modes: <strong>Regular Mode</strong>, <strong>Color Paper Mode</strong> and <strong>Ink Paper Mode</strong>. The animation that accompanies this switch is pretty neat too, especially when going from the black and white Ink Paper Mode back to the full color Regular Mode and vice versa.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LWctSqyEtM7KRX7aiBferE" name="TCL NXTPAPER 11 Plus-6" alt="The TCL NXTPAPER 11 Plus in Ink Paper Mode on a desk" src="https://cdn.mos.cms.futurecdn.net/LWctSqyEtM7KRX7aiBferE-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>After <a href="https://www.tomsguide.com/us/best-e-readers,review-2766.html">owning a Kindle</a> for years now to read ebooks, I was really taken aback by how closely TCL’s NXTPAPER is able to mimic ePaper even though it uses an LCD display. This gives you the best of both worlds since you have that easier to read black and white look but with the much faster refresh rates of LCD over ePaper.</p><p>My favorite part of using either of the non-standard NXTPAPER modes though is that your entire device along with all of the apps you use are instantly transformed. Whether I was scrolling through Google News or browsing Reddit, everything – including pictures – was either in black and white Ink Paper or Color Paper. </p><p>There are plenty of health benefits like reduced eye strain and less blue light when using a tablet equipped with TCL’s NXTPAPER, but I found the matte display — technically nano-matrix lithography etching — was the most useful for me day to day as someone that can’t stand the glare of a glossy display, especially when taking pictures.</p><h2 id="glare-free-versatility">Glare-free versatility</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6cxTjqkqUxpJzh3kD8guML" name="TCL NXTPAPER 11 Plus-3" alt="The TCL NXTPAPER 11 Plus on a table outside on a sunny day showing off how capable its matte display is" src="https://cdn.mos.cms.futurecdn.net/6cxTjqkqUxpJzh3kD8guML-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Although most of my time testing the NXTPAPER 11 Plus was spent in the comfort of my own home, I decided to bring the tablet with me to a doctor’s appointment followed by <a href="https://www.tomsguide.com/home/home-office/5-ikea-accessories-id-pick-up-for-my-home-office-and-theyre-all-under-usd30">a trip to IKEA</a> to see how it handled the real world. </p><p>Right from the get-go, I was impressed by how usable it remained even in direct sunlight. Most tablets struggle in this situation, but thanks to that matte display, I wasn’t squinting just to make out what was on the screen.</p><p>Even outside on a table, the NXTPAPER 11 Plus was just as functional in the great outdoors as it was at home. This is the kind of device you can comfortably use while sitting in the grass — say, on a college campus — and since the case has a built-in stand, you really don't need to pack anything else.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="raSM43X3VGi2Z9k6dixAxQ" name="TCL NXTPAPER 11 Plus-2" alt="A person reading an eBook on the TCL NXTPAPER 11 Plus at IKEA" src="https://cdn.mos.cms.futurecdn.net/raSM43X3VGi2Z9k6dixAxQ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Once my appointment was over, I headed to IKEA and, after polishing off some Swedish meatballs, I spent a few minutes using the tablet in the food court. At first glance, you might think I was just reading an ebook on a normal tablet. However, I actually had Ink Paper Mode enabled, which really made the text pop. Since the display isn’t working as hard to render a full spectrum of colors in this mode, switching to black and white is a clever way to stretch its already impressive 8,000 mAh battery even further during long days out.</p><p>Then, when it was time to check out IKEA’s new smart home accessories — namely its <a href="https://www.tomsguide.com/home/smart-home/ikea-just-announced-21-smart-home-gadgets-heres-the-ones-im-buying">Matter-equipped buttons</a> — I just closed the folio case and slid the tablet back into my backpack, knowing it would be perfectly safe without an extra sleeve.</p><p>Although the NXTPAPER 14 wowed me initially, I’ve found that 11.5 inches is the perfect middle ground for both portability and screen real estate. It’s a large enough screen to multitask with two apps side-by-side, yet in portrait mode, it’s ideal for reading both books and news articles.</p><p>Since this tablet is only $370 full price and is often found for under $300 on sale, it’s the kind of device you can take everywhere without constant worry. If I were using an <a href="https://www.tomsguide.com/tablets/ipads/ill-only-read-comics-on-an-ipad-pro-oled-from-now-on-heres-why">iPad Pro</a> or a premium Samsung tablet, I might be tempted to leave it at home to keep it safe. With the NXTPAPER 11 Plus, however, I wouldn’t think twice before throwing it in my bag for a weekend trip or a long flight.</p><h2 id="consider-me-in-matte-uated">Consider me in-matte-uated</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8ub6waqHVABVdMPSrbbDhZ" name="TCL NXTPAPER 11 Plus-4" alt="The TCL NXTPAPER 50 XE, the TCL NXTPAPER 11 Plus and the TCL NXTPAPER 14 side by side on a desk with each device showing a different display mode of TCL's NXTPAPER tech" src="https://cdn.mos.cms.futurecdn.net/8ub6waqHVABVdMPSrbbDhZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I have to admit, what initially enticed me about TCL’s NXTPAPER was how photogenic this display tech is. As part of my job, I often have to snap pics of a particular app or service running on a smartphone or tablet. While direct sunlight pretty much always looks great in photos, glare absolutely doesn’t. Back at that mall in Taipei, I wondered what it would be like having a device I could easily photograph even in less than ideal conditions and those few quick pics I took in IKEA prove that TCL’s NXTPAPER is perfect for this.</p><p>Glare-free photos did draw me in at first, but I wasn’t expecting to love the way a matte touchscreen felt on my fingertips. That little bit of resistance you get from a non-glossy screen really makes simple actions like swiping or scrolling feel a whole lot more premium. Add to this how I can instantly switch between full color or black and white system-wide while still running what is essentially stock Android, and I couldn’t be happier with both of the tablets and the smartphone TCL sent over.</p><p>After getting a taste of the all-matte life with these devices, I found myself wondering if TCL would ever bring its NXTPAPER tech to one of the <a href="https://www.tomsguide.com/best-picks/best-monitors">best monitors</a> or even one of the company’s TVs. Swiping my finger up and down or even using the included stylus felt entirely different than it normally does. Not because TCL is also partial to matte screens, but because a display like that is required for the company's NXTPAPER to work its magic.</p><p>I don’t plan on putting down the NXTPAPER 11 Plus anytime soon, but the jury is still out on whether or not I’d be willing to switch to one of TCL’s smartphones to have this same premium-feeling sensation whenever I take my phone out of my pocket. I guess only time will tell.</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/tablets/android-tablets/i-replaced-my-work-laptop-with-the-biggest-android-tablet-you-can-get-3-lessons-i-learned">I replaced my work laptop with the biggest Android tablet you can get — here's what happened</a></li><li><a href="https://www.tomsguide.com/opinion/i-tried-3-different-styluses-with-the-pixel-tablet-and-this-is-the-one-id-buy">The Pixel Tablet is even better with a stylus and I found the best one</a></li><li><a href="https://www.tomsguide.com/gaming/i-built-the-ultimate-remote-play-setup-with-wi-fi-7-to-say-goodbye-to-stuttery-gameplay-for-good-heres-how">I got tired of having a bad remote play experience so I used Wi-Fi 7 and this powerful gaming tablet to fix it for good</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/tablets/i-tried-the-tcl-nxtpaper-11-plus-and-this-budget-tablet-is-easily-my-ipad-killer-heres-why</link>
                                                                            <description>
                            <![CDATA[ The TCL NXTPAPER 11 Plus may have a budget price but its matte screen and included stylus and case give this eye-friendly tablet a premium feel. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Y7pCe9oV4jttTFdKbKG5Ck</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/EdSGZrcAASZCrzbMZdaWYi-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 25 Jan 2026 10:15:00 +0000</pubDate>                                                                                                                                <updated>Mon, 26 Jan 2026 15:35:28 +0000</updated>
                                                                                                                                            <category><![CDATA[Tablets]]></category>
                                                    <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                                                                <author><![CDATA[ anthony.spadafora@futurenet.com (Anthony Spadafora) ]]></author>                    <dc:creator><![CDATA[ Anthony Spadafora ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/z73LEoj7FkUjNG85GcWHtH-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Anthony Spadafora is the managing editor for security and home office furniture at Tom’s Guide where he covers everything from data breaches and malware to password managers and the best way to cover your whole home or business with a strong Wi-Fi signal.&lt;/p&gt;&lt;p&gt;Before joining the team, he spent three years covering cybersecurity and B2B tech for ITProPortal while living in South Korea. After moving back to the US. Anthony joined the TechRadar Pro team where he covered these topics along with VPNs, web hosting, online collaboration software and video conferencing for four years. Anthony also has his ears to the ground and is on the lookout for the next major cyberattack or data breach.&lt;/p&gt;&lt;p&gt;Based in Houston, Texas, Anthony also handles VPN testing for both Tom’s Guide and TechRadar. As someone who has worked from home exclusively since 2018, he has reviewed dozens of standing desks as well as office chairs and has taken a closer look at other essential remote working accessories. As part of these reviews, Anthony frequently builds intricate desk setups which is why he’s such a big advocate for cable management and keeping things organized. When he’s not writing, he can be found tinkering with PCs and game consoles, managing cables and making upgrades to his smart home.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/EdSGZrcAASZCrzbMZdaWYi-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A person using the TCL NXTPAPER 11 Plus inside IKEA on a bright sunny day]]></media:description>                                                            <media:text><![CDATA[A person using the TCL NXTPAPER 11 Plus inside IKEA on a bright sunny day]]></media:text>
                                <media:title type="plain"><![CDATA[A person using the TCL NXTPAPER 11 Plus inside IKEA on a bright sunny day]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/EdSGZrcAASZCrzbMZdaWYi-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>It’s not every day I’m walking through a mall and end up stopping in my tracks to play with a tablet, but that’s exactly what happened last summer in Taiwan.</p><p>After a week of checking out the latest gadgets at <a href="https://www.tomsguide.com/computing/best-of-computex-2025-the-top-15-gadgets-of-the-worlds-biggest-computing-show">Computex</a>, I headed to Taipei’s legendary electronics market, <a href="https://www.tomsguide.com/video/OgRcRb3T/what-can-50-buy-at-taiwan-039-s-craziest-tech-mall">Guang Hua Digital Plaza</a> for some last-minute sightseeing. While I usually prefer smaller tablets like the <a href="https://www.tomsguide.com/tablets/i-spent-two-weeks-with-the-ipad-mini-7-and-it-reignited-my-love-for-smaller-tablets">iPad mini</a> or the <a href="https://www.tomsguide.com/computing/tablets/i-thought-the-ipad-mini-was-the-perfect-small-tablet-until-i-tried-the-lenovo-legion-tab-3-heres-why">Lenovo Legion Tab 3</a>, the TCL NXTPAPER 14 immediately stood out. Maybe it was the massive 14.3-inch screen or the chance to finally see and feel TCL’s innovative <a href="https://www.tomsguide.com/phones/android-phones/im-fascinated-by-tcls-new-e-reader-style-screen-for-smartphones">NXTPAPER</a> tech in person, but I was hooked.</p><p>Late last year, TCL sent over that same tablet along with its smaller, more powerful NXTPAPER 11 Plus and even a smartphone with the same paper-like display for me to test out at home. While its larger sibling hooked me initially, the NXTPAPER 11 Plus quickly became my go-to device. Its 11.5-inch screen makes it easy to slip into a bag and it’s also the perfect size for reading.</p><p>Unlike with other tablets I’ve tried in the past, I didn’t feel compelled to put a screen protector on this one and I’m glad I didn’t, as doing so would ruin my favorite thing about it: the paper-like feel of its matte display. I also didn’t have to worry about finding a case for the NXTPAPER 11 Plus since TCL includes one in the box along with a fully equipped stylus.</p><p>Here’s what it’s been like using TCL’s NXTPAPER tech for the past two months and why the NXTPAPER 11 Plus is easily one of the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a> on a budget, especially if you’ve flirted with the idea of picking up a <a href="https://www.tomsguide.com/tablets/remarkable-paper-pro">reMarkable Paper Pro</a> over a standard Android tablet.</p><div class="product"><a data-dimension112="4c28c854-7067-4a1b-b1ec-e0eeee043c54" data-action="Deal Block" data-label="NXTPAPER 11 Plus" data-dimension48="NXTPAPER 11 Plus" data-dimension25="$269.00" href="https://www.amazon.com/TCL-NXTPAPER-Android-Notebook-Included/dp/B0FLJMFNR7" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1376px;"><p class="vanilla-image-block" style="padding-top:86.70%;"><img id="2rmQkEzhXCeVzcYeLEFNn9" name="NXTPAPER 11 Plus" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/2rmQkEzhXCeVzcYeLEFNn9-1920-80.jpg" mos="" align="middle" fullscreen="" width="1376" height="1193" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This 11.5-inch Android tablet boasts a 120Hz, 2.2K display with an 8,000 mAh battery but its TCL's NXTPAPER 4.0 tech that really makes it stand out. You get a paper-like feel when scrolling with your finger or taking notes with the included stylus. The NXTPAPER 11 Plus also comes with a carrying case.<a class="view-deal button" href="https://www.amazon.com/TCL-NXTPAPER-Android-Notebook-Included/dp/B0FLJMFNR7" target="_blank" rel="nofollow" data-dimension112="4c28c854-7067-4a1b-b1ec-e0eeee043c54" data-action="Deal Block" data-label="NXTPAPER 11 Plus" data-dimension48="NXTPAPER 11 Plus" data-dimension25="$269.00">View Deal</a></p></div><h2 id="surprisingly-equipped-right-out-of-the-box">Surprisingly equipped right out of the box</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="BDUq3Ybc4UMPhmiTwtgLEn" name="TCL NXTPAPER 11 Plus-8" alt="The TCL NXTPAPER 11 Plus unboxed on a desk" src="https://cdn.mos.cms.futurecdn.net/BDUq3Ybc4UMPhmiTwtgLEn-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>At a time when you’re lucky to get a USB-C cable in the box, I was instantly impressed by everything TCL manages to cram into the box with both the NXTPAPER 14 and the NXTPAPER 14 Plus. </p><p>Unlike with one of the <a href="https://www.tomsguide.com/best-picks/best-ipad">best iPads</a>, it can be hard finding a case or other accessories for some Android tablets. TCL takes the guesswork out with its tablets so instead of shopping for the right case, you can get right to using your new device.</p><p>I really like the included folio case for a couple of reasons. For starters, it’s magnetic and instantly turns off your tablet’s screen when closed. However, there are also plastic feet on the bottom side that, in addition to turning the case into a very sturdy stand, provide you with a place to store the included stylus.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cbwTk6SN3SzVTCRFYKXCP6" name="TCL NXTPAPER 11 Plus-5" alt="A person using the included stylus to scroll through stories in Google Discover on the TCL NXTPAPER 11 Plus" src="https://cdn.mos.cms.futurecdn.net/cbwTk6SN3SzVTCRFYKXCP6-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I’m no digital artist by any means but I’m quite partial to having a stylus for each of my tablets. I find <a href="https://www.tomsguide.com/opinion/i-finally-got-the-right-stylus-for-my-chromebook-and-its-a-game-changer">using a stylus</a> makes it a lot easier to scroll through the news each morning without accidentally opening stories I wasn’t planning on reading. The same goes for poking around a device’s settings menu and quickly making changes like not having new apps added to my home screen for instance.</p><p>I also really like how this is an active stylus that’s pre-paired with the NXTPAPER 11 Plus. After powering it on, I was able to start using it right away and surprisingly, I haven’t even had to charge it yet, though it does get up to 100 hours of use on a single charge. There are also two up and down keys on the stylus that you can program to do things like instantly take you back to the home screen or open TCL’s Sidebar. </p><p>Speaking of which, the Sidebar is a collection of customizable shortcuts that you can access by swiping with your finger (or the stylus) to go back and holding it there for an extra second or so. You can add actions like taking a screenshot as well as shortcuts to your favorite apps. I found this feature to be both pretty clever and well implemented.</p><p>The included case and stylus are useful extras but it’s the display itself and TCL’s proprietary screen technology that kept me going back to the NXTPAPER 11 Plus again and again.</p><h2 id="an-almost-instant-transformation">An almost instant transformation</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="P5NBEn6vUrPhkjceJqzK9B" name="TCL NXTPAPER 11 Plus-7" alt="A close up shot of the NXTPAPER Key on the TCL NXTPAPER 11 Plus" src="https://cdn.mos.cms.futurecdn.net/P5NBEn6vUrPhkjceJqzK9B-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The NXTPAPER 11 Plus has your standard USB-C port on the side as well as a power button and volume rocker up top. However, across from those two buttons is the device's namesake NXTPAPER Key. This is where the device’s magic happens and on this newer tablet, it’s also equipped with a backlight that you can turn on or off. When enabled, the light “breathes,” perhaps to help you remember that a total display transformation is just a button press away.</p><p>The NXTPAPER Key is also customizable and you can choose what a single press, double press and long press does. By default, a single press lets you switch between its three different modes: <strong>Regular Mode</strong>, <strong>Color Paper Mode</strong> and <strong>Ink Paper Mode</strong>. The animation that accompanies this switch is pretty neat too, especially when going from the black and white Ink Paper Mode back to the full color Regular Mode and vice versa.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LWctSqyEtM7KRX7aiBferE" name="TCL NXTPAPER 11 Plus-6" alt="The TCL NXTPAPER 11 Plus in Ink Paper Mode on a desk" src="https://cdn.mos.cms.futurecdn.net/LWctSqyEtM7KRX7aiBferE-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>After <a href="https://www.tomsguide.com/us/best-e-readers,review-2766.html">owning a Kindle</a> for years now to read ebooks, I was really taken aback by how closely TCL’s NXTPAPER is able to mimic ePaper even though it uses an LCD display. This gives you the best of both worlds since you have that easier to read black and white look but with the much faster refresh rates of LCD over ePaper.</p><p>My favorite part of using either of the non-standard NXTPAPER modes though is that your entire device along with all of the apps you use are instantly transformed. Whether I was scrolling through Google News or browsing Reddit, everything – including pictures – was either in black and white Ink Paper or Color Paper. </p><p>There are plenty of health benefits like reduced eye strain and less blue light when using a tablet equipped with TCL’s NXTPAPER, but I found the matte display — technically nano-matrix lithography etching — was the most useful for me day to day as someone that can’t stand the glare of a glossy display, especially when taking pictures.</p><h2 id="glare-free-versatility">Glare-free versatility</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6cxTjqkqUxpJzh3kD8guML" name="TCL NXTPAPER 11 Plus-3" alt="The TCL NXTPAPER 11 Plus on a table outside on a sunny day showing off how capable its matte display is" src="https://cdn.mos.cms.futurecdn.net/6cxTjqkqUxpJzh3kD8guML-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Although most of my time testing the NXTPAPER 11 Plus was spent in the comfort of my own home, I decided to bring the tablet with me to a doctor’s appointment followed by <a href="https://www.tomsguide.com/home/home-office/5-ikea-accessories-id-pick-up-for-my-home-office-and-theyre-all-under-usd30">a trip to IKEA</a> to see how it handled the real world. </p><p>Right from the get-go, I was impressed by how usable it remained even in direct sunlight. Most tablets struggle in this situation, but thanks to that matte display, I wasn’t squinting just to make out what was on the screen.</p><p>Even outside on a table, the NXTPAPER 11 Plus was just as functional in the great outdoors as it was at home. This is the kind of device you can comfortably use while sitting in the grass — say, on a college campus — and since the case has a built-in stand, you really don't need to pack anything else.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="raSM43X3VGi2Z9k6dixAxQ" name="TCL NXTPAPER 11 Plus-2" alt="A person reading an eBook on the TCL NXTPAPER 11 Plus at IKEA" src="https://cdn.mos.cms.futurecdn.net/raSM43X3VGi2Z9k6dixAxQ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Once my appointment was over, I headed to IKEA and, after polishing off some Swedish meatballs, I spent a few minutes using the tablet in the food court. At first glance, you might think I was just reading an ebook on a normal tablet. However, I actually had Ink Paper Mode enabled, which really made the text pop. Since the display isn’t working as hard to render a full spectrum of colors in this mode, switching to black and white is a clever way to stretch its already impressive 8,000 mAh battery even further during long days out.</p><p>Then, when it was time to check out IKEA’s new smart home accessories — namely its <a href="https://www.tomsguide.com/home/smart-home/ikea-just-announced-21-smart-home-gadgets-heres-the-ones-im-buying">Matter-equipped buttons</a> — I just closed the folio case and slid the tablet back into my backpack, knowing it would be perfectly safe without an extra sleeve.</p><p>Although the NXTPAPER 14 wowed me initially, I’ve found that 11.5 inches is the perfect middle ground for both portability and screen real estate. It’s a large enough screen to multitask with two apps side-by-side, yet in portrait mode, it’s ideal for reading both books and news articles.</p><p>Since this tablet is only $370 full price and is often found for under $300 on sale, it’s the kind of device you can take everywhere without constant worry. If I were using an <a href="https://www.tomsguide.com/tablets/ipads/ill-only-read-comics-on-an-ipad-pro-oled-from-now-on-heres-why">iPad Pro</a> or a premium Samsung tablet, I might be tempted to leave it at home to keep it safe. With the NXTPAPER 11 Plus, however, I wouldn’t think twice before throwing it in my bag for a weekend trip or a long flight.</p><h2 id="consider-me-in-matte-uated">Consider me in-matte-uated</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8ub6waqHVABVdMPSrbbDhZ" name="TCL NXTPAPER 11 Plus-4" alt="The TCL NXTPAPER 50 XE, the TCL NXTPAPER 11 Plus and the TCL NXTPAPER 14 side by side on a desk with each device showing a different display mode of TCL's NXTPAPER tech" src="https://cdn.mos.cms.futurecdn.net/8ub6waqHVABVdMPSrbbDhZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I have to admit, what initially enticed me about TCL’s NXTPAPER was how photogenic this display tech is. As part of my job, I often have to snap pics of a particular app or service running on a smartphone or tablet. While direct sunlight pretty much always looks great in photos, glare absolutely doesn’t. Back at that mall in Taipei, I wondered what it would be like having a device I could easily photograph even in less than ideal conditions and those few quick pics I took in IKEA prove that TCL’s NXTPAPER is perfect for this.</p><p>Glare-free photos did draw me in at first, but I wasn’t expecting to love the way a matte touchscreen felt on my fingertips. That little bit of resistance you get from a non-glossy screen really makes simple actions like swiping or scrolling feel a whole lot more premium. Add to this how I can instantly switch between full color or black and white system-wide while still running what is essentially stock Android, and I couldn’t be happier with both of the tablets and the smartphone TCL sent over.</p><p>After getting a taste of the all-matte life with these devices, I found myself wondering if TCL would ever bring its NXTPAPER tech to one of the <a href="https://www.tomsguide.com/best-picks/best-monitors">best monitors</a> or even one of the company’s TVs. Swiping my finger up and down or even using the included stylus felt entirely different than it normally does. Not because TCL is also partial to matte screens, but because a display like that is required for the company's NXTPAPER to work its magic.</p><p>I don’t plan on putting down the NXTPAPER 11 Plus anytime soon, but the jury is still out on whether or not I’d be willing to switch to one of TCL’s smartphones to have this same premium-feeling sensation whenever I take my phone out of my pocket. I guess only time will tell.</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/tablets/android-tablets/i-replaced-my-work-laptop-with-the-biggest-android-tablet-you-can-get-3-lessons-i-learned">I replaced my work laptop with the biggest Android tablet you can get — here's what happened</a></li><li><a href="https://www.tomsguide.com/opinion/i-tried-3-different-styluses-with-the-pixel-tablet-and-this-is-the-one-id-buy">The Pixel Tablet is even better with a stylus and I found the best one</a></li><li><a href="https://www.tomsguide.com/gaming/i-built-the-ultimate-remote-play-setup-with-wi-fi-7-to-say-goodbye-to-stuttery-gameplay-for-good-heres-how">I got tired of having a bad remote play experience so I used Wi-Fi 7 and this powerful gaming tablet to fix it for good</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ CES 2026 day 1 — Top 10 new gadgets you need to see ]]></title>
                                                                                                <dc:content><![CDATA[ <p><strong>Update: </strong>See our <a href="https://www.tomsguide.com/tech-events/ces-2026-day-2-9-biggest-tech-and-gadget-announcements-direct-from-the-show-floor">top 11 gadgets of CES 2026 from day 2! </a></p><p>There’s nothing quite like <a href="https://www.tomsguide.com/uk/tag/ces">CES</a>, and the huge consumer tech showcase is off to a flyer with some fantastic products already on display across the show floor.</p><div  class="fancy-box"><div class="fancy_box-title">Tom's Guide at CES</div><div class="fancy_box_body"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' ><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ta3dXY62nkc8pUxn65nRLY" name="CES 2025" caption="" alt="CES 2025" src="https://cdn.mos.cms.futurecdn.net/ta3dXY62nkc8pUxn65nRLY-1920-80.jpg" mos="" link="" align="" fullscreen="" width="" height="" attribution="" endorsement="" class="pinterest-pin-exclude"></p></div></div><figcaption itemprop="caption description" class=""><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p class="fancy-box__body-text">Follow all of our <a data-analytics-id="inline-link" href="https://www.tomsguide.com/news/live/ces-2026-live-latest-news">CES 2026 live coverage </a>for the biggest gadget news straight from Las Vegas. And be sure to follow <a data-analytics-id="inline-link" href="https://www.tiktok.com/@tomsguide" target="_blank">Tom's Guide on TikTok</a> for the coolest videos from the show.</p></div></div><p>Tom's Guide has been on the ground in Vegas for the first day of the event and we've rounded up our 10 favorite products. These examples of upcoming tech are worth a look for enthusiasts or anyone curious about wallpaper TVs, wild lighting, or even having a robot at home, all from the likes of Samsung, LG, and more.</p><p>Here are our picks of the best new products at CES 26 on day one, with more to come in <a href="https://www.tomsguide.com/news/live/ces-2026-live-latest-news">our ongoing CES 2026 live blog</a>.</p><h2 id="lg-wallpaper-tv">LG Wallpaper TV</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rUtWRhengUu6j9BMsAz2mQ" name="IMG_0052.JPG" alt="The LG Wallpaper OLED at CES 2026" src="https://cdn.mos.cms.futurecdn.net/rUtWRhengUu6j9BMsAz2mQ-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>LG is no stranger to TVs, <a href="https://www.tomsguide.com/tvs/oled-tvs/lg-is-bringing-back-an-iconic-oled-tv-design-from-2017-meet-the-lg-oled-evo-w6">but this one is particularly incredible</a>. It’s a panel so thin that you literally can’t see it from the side, with no physical inputs.</p><p>It’s a glimpse at the future, but it’s more practical than previous models, too. It’s an improved panel from the <a href="https://www.tomsguide.com/tvs/lgs-2025-oled-tvs-revealed-at-ces-165hz-refresh-rates-the-g5-and-more">prior version</a>, using a handy breakout box to wirelessly beam your set-top box or game console, and it’s slated to launch at a price comparable to LG’s more standard OLED models.</p><p>The usual caveats about input lag will no doubt apply, but if LG can minimize that potential downside, it could be a great showpiece for your home. </p>                    <div class= "tiktok-wrapper" style="min-height: 750px;"><blockquote class="tiktok-embed" cite="https://www.tiktok.com/@tomsguide/video/7591710436211363127" data-video-id="7591710436211363127" style="max-width: 605px; min-width: 325px;">                        <section>                            <a target="_blank" title="@tomsguide" href="https://www.tiktok.com/@tomsguide">@tomsguide</a>                            <p></p><a target="_blank" title="♬ original sound - Tom’s Guide" href="https://www.tiktok.com/music/original-sound-7591710455115811639">♬ original sound - Tom’s Guide</a></section>                    </blockquote></div>                <h2 id="dreame-x60-range">Dreame X60 Range</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jkH5R6MuoNfjwZNfCbDqqR" name="Dreame Cyber X" alt="Dreame Cyber X robot vacuum" src="https://cdn.mos.cms.futurecdn.net/jkH5R6MuoNfjwZNfCbDqqR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Dreame already has a great range of <a href="https://www.tomsguide.com/us/best-robot-vacuums,review-2000.html">robot vacuum</a> products, but the new X60 Series will kick things up a notch.</p><p>This is the new flagship robot vacuum from the company and boasts 35,000 pa of suction and an AI-enhanced "Omnisight" system. Which, we hope, means it'll be even better at navigating past obstacles in your home. </p><p>Elsewhere, the clever Cyber X vacuum (pictured above) has a base station with four legs that means it'll be able to clamber up stairs like some kind of robot pet to continue its cleaning. It's also got a carry-on water tank, so it doesn’t need to keep revisiting its base station to fill up. Which will probably help prolong the battery life too.</p><h2 id="paper-android-tablet">Paper Android tablet</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uzgp98n5V3fTM2r85UU2dV" name="toall tablet thinness" alt="Toall Technology Tablet" src="https://cdn.mos.cms.futurecdn.net/uzgp98n5V3fTM2r85UU2dV-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Global Editor in Chief Mark Spoonauer said that the world’s thinnest tablet, from China-based Haining Toall Technology, <a href="https://www.tomsguide.com/computing/android-tablets/i-just-held-the-worlds-thinnest-tablet-at-ces-2026-and-it-makes-the-ipad-pro-look-bloated">doesn’t feel real</a> — and he’s not wrong. It’s called ‘Paper’, and it really does earn that name.</p><p>It’s somehow a whole 2mm thinner than the <a href="https://www.tomsguide.com/computing/ipads/ipad-pro-m5-review">iPad Pro M5</a>, measuring at just 3.1mm, but still sporting a 13-inch AMOLED display, two USB-C ports, and a mini-HDMI. It’ll start at $1,500, though, and come in 256GB and 512GB versions with specs to be revealed at a later date.</p><p>It’ll run Android, but the battery life is just three hours, so it might be more of a gimmick than something you’d use day-to-day, at least for now.</p>                    <div class= "tiktok-wrapper" style="min-height: 750px;"><blockquote class="tiktok-embed" cite="https://www.tiktok.com/@tomsguide/video/7591757369688788238" data-video-id="7591757369688788238" style="max-width: 605px; min-width: 325px;">                        <section>                            <a target="_blank" title="@tomsguide" href="https://www.tiktok.com/@tomsguide">@tomsguide</a>                            <p></p><a target="_blank" title="♬ Technology, inorganic cool, techno 10 minutes(998935) - 8.864" href="https://www.tiktok.com/music/Technology-inorganic-cool-techno-10-minutes-998935-6954440359111821313">♬ Technology, inorganic cool, techno 10 minutes(998935) - 8.864</a></section>                    </blockquote></div>                <h2 id="govee-ceiling-light-ultra">Govee Ceiling Light Ultra</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bhvQJLsLrsSDsHhoHJ4eGY" name="Govee CES lights" alt="Govee smart lights CES 2026" src="https://cdn.mos.cms.futurecdn.net/bhvQJLsLrsSDsHhoHJ4eGY-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Govee)</span></figcaption></figure><p>Govee is going big on AI with its new lineup of Ultra lighting for your ceiling, with the company letting users sync their lighting to sun cycles.</p><p>You’ll also be able to use more natural language to shift the lighting, which will use a LuminBlend+ technology to allow for no fewer than 281 trillion color options and a wide color temperature range that runs from 1000K to 10,000K.</p><p>Not only can the ceiling option produce slick patterns when you look up, but there’s a new Floor Lamp 3 model that takes advantage of these new features, too.</p><h2 id="switchbot-ai-mindclip">SwitchBot AI MindClip</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hrAupnGZrQwxE4ZB57LjmX" name="SwitchBot AI MindClip" alt="SwitchBot AI MindClip" src="https://cdn.mos.cms.futurecdn.net/hrAupnGZrQwxE4ZB57LjmX-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: SwitchBot)</span></figcaption></figure><p>The AI wearable trend is continuing with smart home company SwitchBot revealing the AI MindClip wearable that will help you keep track of your conversations.</p><p>It’ll record your spoken conversations, summarise work calls, or save personal audio to a database, and supports more than 100 languages. It’s intended to work as a “second brain”, but many of its features will be tied to a cloud service which is, as yet, unannounced.</p><p>If that ends up being reasonably priced and easy to access, we can definitely see the potential here.</p><h2 id="samsung-s95h-oled">Samsung S95H OLED</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="y6DghwqCSuqhqatgAPXeCW" name="IMG_0048" alt="The S95H OLED and Samsung R85H Micro RGB TV" src="https://cdn.mos.cms.futurecdn.net/y6DghwqCSuqhqatgAPXeCW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Samsung was at CES to show off its new range of screens that run from 55-inch to 95-inch models. The lineup included the Samsung S95H, the brand's newest flagship OLED and the successor to the <a href="https://www.tomsguide.com/tvs/4k-tvs/samsung-s95f-oled-tv-review">Samsung S95F</a>, one of the <a href="https://www.tomsguide.com/tvs/oled-tvs/best-oled-tvs">best OLED TVs</a> we reviewed in 2025. </p><p>Meanwhile, the all-new Samsung S90H replaces the <a href="https://www.tomsguide.com/tvs/samsung-s90d-oled-tv-review">Samsung S90D</a> at the mid-range level. Unlike last year's S90D, the S90H features Samsung's glare-free display, so you don't need to spring for Samsung's flagship for glare-free display on a mid-range OLED TV.</p><p>Elsewhere, Samsung’s QLED models will now go to a 115-inch screen size, which at some point must be close to being cinema-sized.</p><p>Finally, the company's latest Micro RGB TV will arrive in 55-, 65-, 75-, 85- and 100-inch screen sizes. They won't be cheap, but anyone looking to upgrade to this cutting-edge TV tech will have several size options to choose from in 2026.</p>                    <div class= "tiktok-wrapper" style="min-height: 750px;"><blockquote class="tiktok-embed" cite="https://www.tiktok.com/@tomsguide/video/7591711812236643597" data-video-id="7591711812236643597" style="max-width: 605px; min-width: 325px;">                        <section>                            <a target="_blank" title="@tomsguide" href="https://www.tiktok.com/@tomsguide">@tomsguide</a>                            <p></p><a target="_blank" title="♬ Ariana Grande / Doja cat / Megan Thee Stallion Type Beat(969753) - RYOTA KATO" href="https://www.tiktok.com/music/Ariana-Grande-Doja-cat-Megan-Thee-Stallion-Type-Beat-969753-6941440005063575553">♬ Ariana Grande / Doja cat / Megan Thee Stallion Type Beat(969753) - RYOTA KATO</a></section>                    </blockquote></div>                <h2 id="xreal-1s-smart-glasses">Xreal 1S smart glasses</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:6000px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="ZQpHwSSqvEiBEViktgUpPW" name="DSC02282.JPG" alt="Xreal Air 2 Ultra" src="https://cdn.mos.cms.futurecdn.net/ZQpHwSSqvEiBEViktgUpPW-1920-80.jpg" mos="" align="middle" fullscreen="" width="6000" height="3376" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Our Computing Editor Jason England found <a href="https://www.tomsguide.com/computing/smart-glasses/xreal-1s-neo-review">a lot to like with these nifty AR glasses</a>, saying they’re ideal for gamers on the go.</p><p>They’re $50 cheaper than the previous model, with improved build quality and a new Real 3D feature that makes 2D content feel three-dimensional via a sort of upscaling technique that truly does work better than you’d expect.</p><p>Hook ‘em up to your Nintendo Switch 2, and you can be playing on a massive virtual screen wherever you go.</p><h2 id="lg-cloid-robot">LG CLOiD robot</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2451px;"><p class="vanilla-image-block" style="padding-top:56.30%;"><img id="ZWvUaKgwqmQjMsNfuarqMY" name="[5] LG CLOiD" alt="LG CLOiD robot" src="https://cdn.mos.cms.futurecdn.net/ZWvUaKgwqmQjMsNfuarqMY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2451" height="1380" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: LG)</span></figcaption></figure><p>Fancy a robot to help out at home? LG’s CLOiD could be your new best friend. It’s a head unit and torso with two arms and a wheeled base that you can ask to tackle chores around the house.</p><p>The base is devised from LG’s robot vacuums, so it’s ideal for avoiding collisions, and each arm has independently actuated fingers. That allows the CLOiD to fold laundry, operate in a kitchen, and more.</p><p>Will it get around the inherent sci-fi spookiness of having a robot in the home? We’ll see, but it’s impressive nonetheless.</p><h2 id="glyde-smart-hair-clippers">Glyde Smart Hair Clippers</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PDiDHjML2f6swZBsgngyS9" name="Glyde smart hair clippers" alt="Glyde smart hair clippers" src="https://cdn.mos.cms.futurecdn.net/PDiDHjML2f6swZBsgngyS9-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>A new set of clippers from Glyde will let you trim your hair and even give you a skin fade if you want it to.</p><p>It works through a bizarre-looking headband, and will definitely require some trust on the part of the user — would you want AI to wield a blade close to your head? It’s hard to see it taking off, but if you’re super against visiting the barber for some reason, we’d imagine this is the next best thing.</p><h2 id="fraimic-smart-e-ink-canvas">Fraimic Smart E Ink Canvas</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:985px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="hP4ssSREHtSP5CJqp9d6TT" name="Fraimic" alt="Fraimic smart canvas" src="https://cdn.mos.cms.futurecdn.net/hP4ssSREHtSP5CJqp9d6TT-1920-80.jpg" mos="" align="middle" fullscreen="" width="985" height="554" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Fraimic)</span></figcaption></figure><p>This innovative piece of tech from Fraimic lets you instantly change up the art on your wall just by speaking to it. The on-board AI will listen to your description of what you want to see and render the image on its state-of-the-art E Ink Spectra display. </p><p>Because it's E Ink, you get accurate color and natural tones without any glare or backlighting — as if you were looking at an actual picture. It boasts a multi-year battery life and comes with a black wood frame. The large canvas (24x36”x1" frame) comes in at $999 while the standard (14x18x1” frame) canvas is priced at $399. Both are due to ship in the spring.</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/smart-home/govee-announces-3-new-smart-lights-at-ces-including-a-ceiling-light-for-windowless-spaces">Govee announces 3 new smart lights at CES, including a ceiling light for windowless spaces</a></li><li><a href="https://www.tomsguide.com/tvs/oled-tvs/lg-is-bringing-back-an-iconic-oled-tv-design-from-2017-meet-the-lg-oled-evo-w6">LG Wallpaper OLED TV is back, and now it’s completely wireless (and actually affordable)</a></li><li><a href="https://www.tomsguide.com/tvs/samsung-tv-lineup-2026-new-oleds-micro-rgb-tvs-and-neo-qleds-announced-at-ces">Samsung TV lineup 2026: new OLEDs, Micro RGB TVs and Neo QLEDs announced at CES</a></li></ul><div data-widget-type="review" data-model-name="Samsung S95F"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/ces-2026-day-1-top-10-new-gadgets-you-need-to-see</link>
                                                                            <description>
                            <![CDATA[ CES 2026 is here, and it’s filled with some fantastic new products — here are our favorites from the first day on the show floor ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">5FDmbiw8Mvz6uLHcMeC7RE</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/jnGk7o6373hsH7MgWPGbBW-1920-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Mon, 05 Jan 2026 17:21:08 +0000</pubDate>                                                                                                                                <updated>Tue, 06 Jan 2026 16:59:59 +0000</updated>
                                                                                                                                            <category><![CDATA[Computing]]></category>
                                                                                                                    <dc:creator><![CDATA[ Lloyd Coombes ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xcWocVTwa9yiwXRs559XNA-320-70.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/png" url="https://cdn.mos.cms.futurecdn.net/jnGk7o6373hsH7MgWPGbBW-1920-80.png">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[CES Day 1 round-up]]></media:description>                                                            <media:text><![CDATA[CES Day 1 round-up]]></media:text>
                                <media:title type="plain"><![CDATA[CES Day 1 round-up]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/jnGk7o6373hsH7MgWPGbBW-1920-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p><strong>Update: </strong>See our <a href="https://www.tomsguide.com/tech-events/ces-2026-day-2-9-biggest-tech-and-gadget-announcements-direct-from-the-show-floor">top 11 gadgets of CES 2026 from day 2! </a></p><p>There’s nothing quite like <a href="https://www.tomsguide.com/uk/tag/ces">CES</a>, and the huge consumer tech showcase is off to a flyer with some fantastic products already on display across the show floor.</p><div  class="fancy-box"><div class="fancy_box-title">Tom's Guide at CES</div><div class="fancy_box_body"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' ><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ta3dXY62nkc8pUxn65nRLY" name="CES 2025" caption="" alt="CES 2025" src="https://cdn.mos.cms.futurecdn.net/ta3dXY62nkc8pUxn65nRLY-1920-80.jpg" mos="" link="" align="" fullscreen="" width="" height="" attribution="" endorsement="" class="pinterest-pin-exclude"></p></div></div><figcaption itemprop="caption description" class=""><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p class="fancy-box__body-text">Follow all of our <a data-analytics-id="inline-link" href="https://www.tomsguide.com/news/live/ces-2026-live-latest-news">CES 2026 live coverage </a>for the biggest gadget news straight from Las Vegas. And be sure to follow <a data-analytics-id="inline-link" href="https://www.tiktok.com/@tomsguide" target="_blank">Tom's Guide on TikTok</a> for the coolest videos from the show.</p></div></div><p>Tom's Guide has been on the ground in Vegas for the first day of the event and we've rounded up our 10 favorite products. These examples of upcoming tech are worth a look for enthusiasts or anyone curious about wallpaper TVs, wild lighting, or even having a robot at home, all from the likes of Samsung, LG, and more.</p><p>Here are our picks of the best new products at CES 26 on day one, with more to come in <a href="https://www.tomsguide.com/news/live/ces-2026-live-latest-news">our ongoing CES 2026 live blog</a>.</p><h2 id="lg-wallpaper-tv">LG Wallpaper TV</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rUtWRhengUu6j9BMsAz2mQ" name="IMG_0052.JPG" alt="The LG Wallpaper OLED at CES 2026" src="https://cdn.mos.cms.futurecdn.net/rUtWRhengUu6j9BMsAz2mQ-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>LG is no stranger to TVs, <a href="https://www.tomsguide.com/tvs/oled-tvs/lg-is-bringing-back-an-iconic-oled-tv-design-from-2017-meet-the-lg-oled-evo-w6">but this one is particularly incredible</a>. It’s a panel so thin that you literally can’t see it from the side, with no physical inputs.</p><p>It’s a glimpse at the future, but it’s more practical than previous models, too. It’s an improved panel from the <a href="https://www.tomsguide.com/tvs/lgs-2025-oled-tvs-revealed-at-ces-165hz-refresh-rates-the-g5-and-more">prior version</a>, using a handy breakout box to wirelessly beam your set-top box or game console, and it’s slated to launch at a price comparable to LG’s more standard OLED models.</p><p>The usual caveats about input lag will no doubt apply, but if LG can minimize that potential downside, it could be a great showpiece for your home. </p>                    <div class= "tiktok-wrapper" style="min-height: 750px;"><blockquote class="tiktok-embed" cite="https://www.tiktok.com/@tomsguide/video/7591710436211363127" data-video-id="7591710436211363127" style="max-width: 605px; min-width: 325px;">                        <section>                            <a target="_blank" title="@tomsguide" href="https://www.tiktok.com/@tomsguide">@tomsguide</a>                            <p></p><a target="_blank" title="♬ original sound - Tom’s Guide" href="https://www.tiktok.com/music/original-sound-7591710455115811639">♬ original sound - Tom’s Guide</a></section>                    </blockquote></div>                <h2 id="dreame-x60-range">Dreame X60 Range</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jkH5R6MuoNfjwZNfCbDqqR" name="Dreame Cyber X" alt="Dreame Cyber X robot vacuum" src="https://cdn.mos.cms.futurecdn.net/jkH5R6MuoNfjwZNfCbDqqR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Dreame already has a great range of <a href="https://www.tomsguide.com/us/best-robot-vacuums,review-2000.html">robot vacuum</a> products, but the new X60 Series will kick things up a notch.</p><p>This is the new flagship robot vacuum from the company and boasts 35,000 pa of suction and an AI-enhanced "Omnisight" system. Which, we hope, means it'll be even better at navigating past obstacles in your home. </p><p>Elsewhere, the clever Cyber X vacuum (pictured above) has a base station with four legs that means it'll be able to clamber up stairs like some kind of robot pet to continue its cleaning. It's also got a carry-on water tank, so it doesn’t need to keep revisiting its base station to fill up. Which will probably help prolong the battery life too.</p><h2 id="paper-android-tablet">Paper Android tablet</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uzgp98n5V3fTM2r85UU2dV" name="toall tablet thinness" alt="Toall Technology Tablet" src="https://cdn.mos.cms.futurecdn.net/uzgp98n5V3fTM2r85UU2dV-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Global Editor in Chief Mark Spoonauer said that the world’s thinnest tablet, from China-based Haining Toall Technology, <a href="https://www.tomsguide.com/computing/android-tablets/i-just-held-the-worlds-thinnest-tablet-at-ces-2026-and-it-makes-the-ipad-pro-look-bloated">doesn’t feel real</a> — and he’s not wrong. It’s called ‘Paper’, and it really does earn that name.</p><p>It’s somehow a whole 2mm thinner than the <a href="https://www.tomsguide.com/computing/ipads/ipad-pro-m5-review">iPad Pro M5</a>, measuring at just 3.1mm, but still sporting a 13-inch AMOLED display, two USB-C ports, and a mini-HDMI. It’ll start at $1,500, though, and come in 256GB and 512GB versions with specs to be revealed at a later date.</p><p>It’ll run Android, but the battery life is just three hours, so it might be more of a gimmick than something you’d use day-to-day, at least for now.</p>                    <div class= "tiktok-wrapper" style="min-height: 750px;"><blockquote class="tiktok-embed" cite="https://www.tiktok.com/@tomsguide/video/7591757369688788238" data-video-id="7591757369688788238" style="max-width: 605px; min-width: 325px;">                        <section>                            <a target="_blank" title="@tomsguide" href="https://www.tiktok.com/@tomsguide">@tomsguide</a>                            <p></p><a target="_blank" title="♬ Technology, inorganic cool, techno 10 minutes(998935) - 8.864" href="https://www.tiktok.com/music/Technology-inorganic-cool-techno-10-minutes-998935-6954440359111821313">♬ Technology, inorganic cool, techno 10 minutes(998935) - 8.864</a></section>                    </blockquote></div>                <h2 id="govee-ceiling-light-ultra">Govee Ceiling Light Ultra</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bhvQJLsLrsSDsHhoHJ4eGY" name="Govee CES lights" alt="Govee smart lights CES 2026" src="https://cdn.mos.cms.futurecdn.net/bhvQJLsLrsSDsHhoHJ4eGY-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Govee)</span></figcaption></figure><p>Govee is going big on AI with its new lineup of Ultra lighting for your ceiling, with the company letting users sync their lighting to sun cycles.</p><p>You’ll also be able to use more natural language to shift the lighting, which will use a LuminBlend+ technology to allow for no fewer than 281 trillion color options and a wide color temperature range that runs from 1000K to 10,000K.</p><p>Not only can the ceiling option produce slick patterns when you look up, but there’s a new Floor Lamp 3 model that takes advantage of these new features, too.</p><h2 id="switchbot-ai-mindclip">SwitchBot AI MindClip</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hrAupnGZrQwxE4ZB57LjmX" name="SwitchBot AI MindClip" alt="SwitchBot AI MindClip" src="https://cdn.mos.cms.futurecdn.net/hrAupnGZrQwxE4ZB57LjmX-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: SwitchBot)</span></figcaption></figure><p>The AI wearable trend is continuing with smart home company SwitchBot revealing the AI MindClip wearable that will help you keep track of your conversations.</p><p>It’ll record your spoken conversations, summarise work calls, or save personal audio to a database, and supports more than 100 languages. It’s intended to work as a “second brain”, but many of its features will be tied to a cloud service which is, as yet, unannounced.</p><p>If that ends up being reasonably priced and easy to access, we can definitely see the potential here.</p><h2 id="samsung-s95h-oled">Samsung S95H OLED</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="y6DghwqCSuqhqatgAPXeCW" name="IMG_0048" alt="The S95H OLED and Samsung R85H Micro RGB TV" src="https://cdn.mos.cms.futurecdn.net/y6DghwqCSuqhqatgAPXeCW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Samsung was at CES to show off its new range of screens that run from 55-inch to 95-inch models. The lineup included the Samsung S95H, the brand's newest flagship OLED and the successor to the <a href="https://www.tomsguide.com/tvs/4k-tvs/samsung-s95f-oled-tv-review">Samsung S95F</a>, one of the <a href="https://www.tomsguide.com/tvs/oled-tvs/best-oled-tvs">best OLED TVs</a> we reviewed in 2025. </p><p>Meanwhile, the all-new Samsung S90H replaces the <a href="https://www.tomsguide.com/tvs/samsung-s90d-oled-tv-review">Samsung S90D</a> at the mid-range level. Unlike last year's S90D, the S90H features Samsung's glare-free display, so you don't need to spring for Samsung's flagship for glare-free display on a mid-range OLED TV.</p><p>Elsewhere, Samsung’s QLED models will now go to a 115-inch screen size, which at some point must be close to being cinema-sized.</p><p>Finally, the company's latest Micro RGB TV will arrive in 55-, 65-, 75-, 85- and 100-inch screen sizes. They won't be cheap, but anyone looking to upgrade to this cutting-edge TV tech will have several size options to choose from in 2026.</p>                    <div class= "tiktok-wrapper" style="min-height: 750px;"><blockquote class="tiktok-embed" cite="https://www.tiktok.com/@tomsguide/video/7591711812236643597" data-video-id="7591711812236643597" style="max-width: 605px; min-width: 325px;">                        <section>                            <a target="_blank" title="@tomsguide" href="https://www.tiktok.com/@tomsguide">@tomsguide</a>                            <p></p><a target="_blank" title="♬ Ariana Grande / Doja cat / Megan Thee Stallion Type Beat(969753) - RYOTA KATO" href="https://www.tiktok.com/music/Ariana-Grande-Doja-cat-Megan-Thee-Stallion-Type-Beat-969753-6941440005063575553">♬ Ariana Grande / Doja cat / Megan Thee Stallion Type Beat(969753) - RYOTA KATO</a></section>                    </blockquote></div>                <h2 id="xreal-1s-smart-glasses">Xreal 1S smart glasses</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:6000px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="ZQpHwSSqvEiBEViktgUpPW" name="DSC02282.JPG" alt="Xreal Air 2 Ultra" src="https://cdn.mos.cms.futurecdn.net/ZQpHwSSqvEiBEViktgUpPW-1920-80.jpg" mos="" align="middle" fullscreen="" width="6000" height="3376" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Our Computing Editor Jason England found <a href="https://www.tomsguide.com/computing/smart-glasses/xreal-1s-neo-review">a lot to like with these nifty AR glasses</a>, saying they’re ideal for gamers on the go.</p><p>They’re $50 cheaper than the previous model, with improved build quality and a new Real 3D feature that makes 2D content feel three-dimensional via a sort of upscaling technique that truly does work better than you’d expect.</p><p>Hook ‘em up to your Nintendo Switch 2, and you can be playing on a massive virtual screen wherever you go.</p><h2 id="lg-cloid-robot">LG CLOiD robot</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2451px;"><p class="vanilla-image-block" style="padding-top:56.30%;"><img id="ZWvUaKgwqmQjMsNfuarqMY" name="[5] LG CLOiD" alt="LG CLOiD robot" src="https://cdn.mos.cms.futurecdn.net/ZWvUaKgwqmQjMsNfuarqMY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2451" height="1380" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: LG)</span></figcaption></figure><p>Fancy a robot to help out at home? LG’s CLOiD could be your new best friend. It’s a head unit and torso with two arms and a wheeled base that you can ask to tackle chores around the house.</p><p>The base is devised from LG’s robot vacuums, so it’s ideal for avoiding collisions, and each arm has independently actuated fingers. That allows the CLOiD to fold laundry, operate in a kitchen, and more.</p><p>Will it get around the inherent sci-fi spookiness of having a robot in the home? We’ll see, but it’s impressive nonetheless.</p><h2 id="glyde-smart-hair-clippers">Glyde Smart Hair Clippers</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PDiDHjML2f6swZBsgngyS9" name="Glyde smart hair clippers" alt="Glyde smart hair clippers" src="https://cdn.mos.cms.futurecdn.net/PDiDHjML2f6swZBsgngyS9-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>A new set of clippers from Glyde will let you trim your hair and even give you a skin fade if you want it to.</p><p>It works through a bizarre-looking headband, and will definitely require some trust on the part of the user — would you want AI to wield a blade close to your head? It’s hard to see it taking off, but if you’re super against visiting the barber for some reason, we’d imagine this is the next best thing.</p><h2 id="fraimic-smart-e-ink-canvas">Fraimic Smart E Ink Canvas</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:985px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="hP4ssSREHtSP5CJqp9d6TT" name="Fraimic" alt="Fraimic smart canvas" src="https://cdn.mos.cms.futurecdn.net/hP4ssSREHtSP5CJqp9d6TT-1920-80.jpg" mos="" align="middle" fullscreen="" width="985" height="554" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Fraimic)</span></figcaption></figure><p>This innovative piece of tech from Fraimic lets you instantly change up the art on your wall just by speaking to it. The on-board AI will listen to your description of what you want to see and render the image on its state-of-the-art E Ink Spectra display. </p><p>Because it's E Ink, you get accurate color and natural tones without any glare or backlighting — as if you were looking at an actual picture. It boasts a multi-year battery life and comes with a black wood frame. The large canvas (24x36”x1" frame) comes in at $999 while the standard (14x18x1” frame) canvas is priced at $399. Both are due to ship in the spring.</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/smart-home/govee-announces-3-new-smart-lights-at-ces-including-a-ceiling-light-for-windowless-spaces">Govee announces 3 new smart lights at CES, including a ceiling light for windowless spaces</a></li><li><a href="https://www.tomsguide.com/tvs/oled-tvs/lg-is-bringing-back-an-iconic-oled-tv-design-from-2017-meet-the-lg-oled-evo-w6">LG Wallpaper OLED TV is back, and now it’s completely wireless (and actually affordable)</a></li><li><a href="https://www.tomsguide.com/tvs/samsung-tv-lineup-2026-new-oleds-micro-rgb-tvs-and-neo-qleds-announced-at-ces">Samsung TV lineup 2026: new OLEDs, Micro RGB TVs and Neo QLEDs announced at CES</a></li></ul><div data-widget-type="review" data-model-name="Samsung S95F"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I just held the world's thinnest tablet at CES 2026 — and it makes the iPad Pro look bloated ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Have you ever held a piece of tech so thin and light you were almost giddy? That's the experience I just had with a tablet called (appropriately enough) Paper here at <a href="https://www.tomsguide.com/tag/ces">CES 2026</a></p><p>Made by the Chinese company Haining Toall Technology, this Android device measures just 3.1mm thick. For those scoring at home, the <a href="https://www.tomsguide.com/computing/ipads/ipad-pro-m5-review">iPad Pro M5</a> is 5.1mm thin.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GxMe6nmm85G6BvmKceBgqW" name="Toall tablet 3" alt="Toall Technology Tablet" src="https://cdn.mos.cms.futurecdn.net/GxMe6nmm85G6BvmKceBgqW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Paper tablet features a 13-inch AMOLED display, and it's so thin that the ports are stored in a raised area that's slightly thicker. You get two USB-C ports and a mini HDMI port. This bump also makes the slate a bit easier to hold.</p><p>We don't know much about the specs, but the company told us it will be available in 256GB and 512GB versions, and the starting price is $1,500.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xxcBjGWC8TCr3NcdpKjPeV" name="Toall tablet edit display" alt="Toall Technology Tablet" src="https://cdn.mos.cms.futurecdn.net/xxcBjGWC8TCr3NcdpKjPeV-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>When I asked about the CPU, I was just told by a company rep that Paper will be powered by a Chinese processor. So maybe that's MediaTek?</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DxGvYXTqqiDyYrMuwwqCYV" name="Toall tablet 1" alt="Toall Technology Tablet" src="https://cdn.mos.cms.futurecdn.net/DxGvYXTqqiDyYrMuwwqCYV-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The other major trade-off, other than price? Battery life. The Paper is rated for just 3 hours of runtime, but you'll be able to get several more hours with the case.</p><p>There's no firm release date for Paper in the U.S., but if it does come stateside, we will definitely test it out and see if it can truly compete against the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a>. Let us know what you think in the comments.</p><p>For more coverage, see our <a href="https://www.tomsguide.com/news/live/ces-2026-live-latest-news">CES 2026 live blog</a> right 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/tvs/oled-tvs/lg-is-bringing-back-an-iconic-oled-tv-design-from-2017-meet-the-lg-oled-evo-w6">LG's crazy thin Wallpaper OLED TV is back and now completely wireless (and affordable)</a></li><li><a href="https://www.tomsguide.com/phones/the-coolest-gadget-of-2025-doesnt-just-give-me-night-vision-it-makes-me-feel-like-im-looking-through-a-telescope">The coolest gadget of 2025 doesn’t just give me night vision, it makes me feel like I’m looking through a telescope</a></li><li><a href="https://www.tomsguide.com/tech/apple-in-2026">Apple's biggest 5 new products for 2026</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/android-tablets/i-just-held-the-worlds-thinnest-tablet-at-ces-2026-and-it-makes-the-ipad-pro-look-bloated</link>
                                                                            <description>
                            <![CDATA[ We just went hands-on with the Paper tablet, and it's just as thin and light as its on-the-nose name implies. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">sMA6dPX8nDbKMfwwni3VGb</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/uzgp98n5V3fTM2r85UU2dV-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 05 Jan 2026 04:23:07 +0000</pubDate>                                                                                                                                <updated>Mon, 05 Jan 2026 04:34:10 +0000</updated>
                                                                                                                                            <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                                    <dc:creator><![CDATA[ Mark Spoonauer ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/wtAspSzVfcKLB4JEd39AMo-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Mark Spoonauer is the global editor in chief of Tom&#039;s Guide and has covered technology for over 20 years. He oversees the direction of Tom&#039;s Guide and leads a team of over 25 journalists to bring you our expert buying guides, reviews, news, how-to articles, deals and other coverage.&lt;/p&gt;&lt;p&gt;Mark has a passion for covering all things mobile, having reviewed dozens of smartphones and other gadgets. He enjoys testing the top mobile devices and putting them up against each other in our in-depth face-offs. He also works hand in hand with our editors and testing team to continually improve how we evaluate products. &lt;/p&gt;&lt;p&gt;Having led Tom&#039;s Guide since 2013, Mark has focused on growing the core tech coverage of the site while also expanding into new areas, such as entertainment, fitness and home, recruiting talented writers and editors to help our readers figure out what to buy and how to get the most out of the products and services they use every day. &lt;/p&gt;&lt;p&gt;Mark has spoken at key industry events and appears regularly on TV to discuss the latest trends, including &lt;a href=&quot;https://cheddar.com/media/pixel-watch-gets-a-release-date-at-google-i-o-2022&quot;&gt;Cheddar&lt;/a&gt;, Fox 5, &lt;a href=&quot;https://www.foxbusiness.com/technology/apple-march-event-5g-iphone&quot;&gt;Fox Business&lt;/a&gt; and other outlets. Mark was previously editor in chief of Laptop Mag, and his work has appeared in Wired, Popular Science and Inc. Follow him on Twitter at @mspoonauer.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/uzgp98n5V3fTM2r85UU2dV-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Toall Technology Tablet]]></media:description>                                                            <media:text><![CDATA[Toall Technology Tablet]]></media:text>
                                <media:title type="plain"><![CDATA[Toall Technology Tablet]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/uzgp98n5V3fTM2r85UU2dV-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Have you ever held a piece of tech so thin and light you were almost giddy? That's the experience I just had with a tablet called (appropriately enough) Paper here at <a href="https://www.tomsguide.com/tag/ces">CES 2026</a></p><p>Made by the Chinese company Haining Toall Technology, this Android device measures just 3.1mm thick. For those scoring at home, the <a href="https://www.tomsguide.com/computing/ipads/ipad-pro-m5-review">iPad Pro M5</a> is 5.1mm thin.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GxMe6nmm85G6BvmKceBgqW" name="Toall tablet 3" alt="Toall Technology Tablet" src="https://cdn.mos.cms.futurecdn.net/GxMe6nmm85G6BvmKceBgqW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Paper tablet features a 13-inch AMOLED display, and it's so thin that the ports are stored in a raised area that's slightly thicker. You get two USB-C ports and a mini HDMI port. This bump also makes the slate a bit easier to hold.</p><p>We don't know much about the specs, but the company told us it will be available in 256GB and 512GB versions, and the starting price is $1,500.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xxcBjGWC8TCr3NcdpKjPeV" name="Toall tablet edit display" alt="Toall Technology Tablet" src="https://cdn.mos.cms.futurecdn.net/xxcBjGWC8TCr3NcdpKjPeV-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>When I asked about the CPU, I was just told by a company rep that Paper will be powered by a Chinese processor. So maybe that's MediaTek?</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DxGvYXTqqiDyYrMuwwqCYV" name="Toall tablet 1" alt="Toall Technology Tablet" src="https://cdn.mos.cms.futurecdn.net/DxGvYXTqqiDyYrMuwwqCYV-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The other major trade-off, other than price? Battery life. The Paper is rated for just 3 hours of runtime, but you'll be able to get several more hours with the case.</p><p>There's no firm release date for Paper in the U.S., but if it does come stateside, we will definitely test it out and see if it can truly compete against the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a>. Let us know what you think in the comments.</p><p>For more coverage, see our <a href="https://www.tomsguide.com/news/live/ces-2026-live-latest-news">CES 2026 live blog</a> right 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/tvs/oled-tvs/lg-is-bringing-back-an-iconic-oled-tv-design-from-2017-meet-the-lg-oled-evo-w6">LG's crazy thin Wallpaper OLED TV is back and now completely wireless (and affordable)</a></li><li><a href="https://www.tomsguide.com/phones/the-coolest-gadget-of-2025-doesnt-just-give-me-night-vision-it-makes-me-feel-like-im-looking-through-a-telescope">The coolest gadget of 2025 doesn’t just give me night vision, it makes me feel like I’m looking through a telescope</a></li><li><a href="https://www.tomsguide.com/tech/apple-in-2026">Apple's biggest 5 new products for 2026</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Apple TV's latest app update makes Casting on Android devices a reality ]]></title>
                                                                                                <dc:content><![CDATA[ <p><a href="https://www.tomsguide.com/entertainment/apple-tv-plus/apple-tv-finally-arrives-on-android-heres-everything-you-need-to-know">Apple TV’s arrival on Android devices</a> earlier this year was a long time coming, but the app still had some limitations. Thankfully, a new update to the Apple TV app has fixed one of the biggest issues preventing the best viewing experience. </p><p>Originally, it wasn’t possible to use the Google Cast feature on Android phones and tablets while watching programs in the <a href="https://www.tomsguide.com/reviews/apple-tv-plus">Apple TV</a> app. However, the newly released version 2.2 of Apple's app finally gives Android users the option to cast their shows, thanks to a new button in the top right corner of the screen.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wyPGuYg4qFyGbHzaZWhfu9" name="Google cast on Apple.JPEG" alt="Apple TV app cast option" src="https://cdn.mos.cms.futurecdn.net/wyPGuYg4qFyGbHzaZWhfu9-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: 9to5 Google)</span></figcaption></figure><p>When you’re casting to your Android TV or <a href="https://www.tomsguide.com/us/what-is-google-chromecast,news-17637.html">Google Chromecast</a>, the Apple TV app will show a miniplayer that offers users playback information, the device the content is being streamed to and a timeline. </p><p>However, this version doesn’t offer many controls, as you can only play, pause, or rewind the program by 10-second increments.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="T5trczhpyBQz9sQaHmG4b" name="Google cast on Apple 2.JPEG" alt="Apple TV app while casting" src="https://cdn.mos.cms.futurecdn.net/T5trczhpyBQz9sQaHmG4b-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: 9to5 Google )</span></figcaption></figure><p>If you’re looking for a bit more control, then you can tap the miniplayer to enter a full-screen mode. In this version, you'll see the specific movie or TV show's cover art, a timeline scrubber, and two buttons for Audio and subtitles. You’ll also be able to pause/play the video from this screen and fast-forward or rewind by 10 seconds. </p><h2 id="what-to-watch-on-apple-tv">What to watch on Apple TV</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mPujTeACHxcJaNUMHU5CMY" name="Apple TV app.shutterstock_2246538411" alt="Apple TV app on iPhone" src="https://cdn.mos.cms.futurecdn.net/mPujTeACHxcJaNUMHU5CMY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>With this new addition, it is easier to catch up with all the great programs currently available on Apple TV. While it might not have the quantity of streaming sites like <a href="https://www.tomsguide.com/entertainment/streaming/netflix">Netflix </a>or <a href="https://www.tomsguide.com/uk/entertainment/streaming/disney-plus">Disney Plus</a>, it certainly doesn’t struggle when it comes to quality. </p><p>If you’re not sure about where to start, then we have a breakdown of the <a href="https://www.tomsguide.com/best-picks/best-apple-tv-plus-shows-and-movies">31 best shows to watch on Apple TV Plus</a>. These include hit programs like Murderbot, Presumed Innocent and Disclaimer. We also have a breakdown for some of the <a href="https://www.tomsguide.com/best-picks/best-vpn">best VPNs</a> to help you get the most out of your streaming experience, while also keeping you safe from any malicious actors.</p><p>Let us know what you’ve been dying to watch on the big screen with Apple TV, or do you have another preferred streaming site that you've been watching?</p><div data-widget-type="review" data-model-name="Sony Bravia XR A95L QD-OLED TV"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv-plus/you-can-finally-cast-your-favorite-apple-tv-shows-on-android-heres-how</link>
                                                                            <description>
                            <![CDATA[ Apple recently updated its Android Apple TV app to support Google Cast, making it easier than ever to stream content to your TV. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">q68T6ifEU9RY9Cb8eSZfdn</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/AzKLXZ9wxFVgviW4YemKYE-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 16 Dec 2025 19:49:13 +0000</pubDate>                                                                                                                                <updated>Wed, 17 Dec 2025 17:03:24 +0000</updated>
                                                                                                                                            <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ josh.render@futurenet.com (Josh Render) ]]></author>                    <dc:creator><![CDATA[ Josh Render ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/KC66jeFVj9pkfXKGSojaoW-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Josh Render is a UK-based staff writer at Tom&#039;s Guides covering news and features focusing primarily on mobile phones and their workings. Josh has been around phones for many years, having worked in a few different second-hand retailers. He knows the ins and outs of most phones, including how to repair many of them. Meanwhile, he has worked as a freelance journalist for several publications which range over a bunch of different tech aspects. Josh is also a fan of pairing people with the right tech and helping people understand the more nuanced aspects of their latest purchases. Outside of phones Josh is a fan of video games, novels, and Warhammer and has worked around all three to some degree.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Josh has a degree in Film Production from the University of Central Lancashire and has worked for publications such as GameGrin and CBR as well as a few smaller independent outfits. He is often found trying to paint models, completing levels, reading books, or figuring out the next best gaming app to invest his time in.&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/AzKLXZ9wxFVgviW4YemKYE-1920-80.jpg">
                                                            <media:credit><![CDATA[MacFormat Magazine/Getty]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple TV]]></media:description>                                                            <media:text><![CDATA[Apple TV]]></media:text>
                                <media:title type="plain"><![CDATA[Apple TV]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/AzKLXZ9wxFVgviW4YemKYE-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p><a href="https://www.tomsguide.com/entertainment/apple-tv-plus/apple-tv-finally-arrives-on-android-heres-everything-you-need-to-know">Apple TV’s arrival on Android devices</a> earlier this year was a long time coming, but the app still had some limitations. Thankfully, a new update to the Apple TV app has fixed one of the biggest issues preventing the best viewing experience. </p><p>Originally, it wasn’t possible to use the Google Cast feature on Android phones and tablets while watching programs in the <a href="https://www.tomsguide.com/reviews/apple-tv-plus">Apple TV</a> app. However, the newly released version 2.2 of Apple's app finally gives Android users the option to cast their shows, thanks to a new button in the top right corner of the screen.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wyPGuYg4qFyGbHzaZWhfu9" name="Google cast on Apple.JPEG" alt="Apple TV app cast option" src="https://cdn.mos.cms.futurecdn.net/wyPGuYg4qFyGbHzaZWhfu9-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: 9to5 Google)</span></figcaption></figure><p>When you’re casting to your Android TV or <a href="https://www.tomsguide.com/us/what-is-google-chromecast,news-17637.html">Google Chromecast</a>, the Apple TV app will show a miniplayer that offers users playback information, the device the content is being streamed to and a timeline. </p><p>However, this version doesn’t offer many controls, as you can only play, pause, or rewind the program by 10-second increments.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="T5trczhpyBQz9sQaHmG4b" name="Google cast on Apple 2.JPEG" alt="Apple TV app while casting" src="https://cdn.mos.cms.futurecdn.net/T5trczhpyBQz9sQaHmG4b-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: 9to5 Google )</span></figcaption></figure><p>If you’re looking for a bit more control, then you can tap the miniplayer to enter a full-screen mode. In this version, you'll see the specific movie or TV show's cover art, a timeline scrubber, and two buttons for Audio and subtitles. You’ll also be able to pause/play the video from this screen and fast-forward or rewind by 10 seconds. </p><h2 id="what-to-watch-on-apple-tv">What to watch on Apple TV</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mPujTeACHxcJaNUMHU5CMY" name="Apple TV app.shutterstock_2246538411" alt="Apple TV app on iPhone" src="https://cdn.mos.cms.futurecdn.net/mPujTeACHxcJaNUMHU5CMY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>With this new addition, it is easier to catch up with all the great programs currently available on Apple TV. While it might not have the quantity of streaming sites like <a href="https://www.tomsguide.com/entertainment/streaming/netflix">Netflix </a>or <a href="https://www.tomsguide.com/uk/entertainment/streaming/disney-plus">Disney Plus</a>, it certainly doesn’t struggle when it comes to quality. </p><p>If you’re not sure about where to start, then we have a breakdown of the <a href="https://www.tomsguide.com/best-picks/best-apple-tv-plus-shows-and-movies">31 best shows to watch on Apple TV Plus</a>. These include hit programs like Murderbot, Presumed Innocent and Disclaimer. We also have a breakdown for some of the <a href="https://www.tomsguide.com/best-picks/best-vpn">best VPNs</a> to help you get the most out of your streaming experience, while also keeping you safe from any malicious actors.</p><p>Let us know what you’ve been dying to watch on the big screen with Apple TV, or do you have another preferred streaming site that you've been watching?</p><div data-widget-type="review" data-model-name="Sony Bravia XR A95L QD-OLED TV"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 7 best Cyber Monday tablet deals you can still get, from someone who reviews them for a living ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Thanksgiving has come and gone here in the States, but as everyone turns to focus on the winter holidays I've got good news for late shoppers: there are loads of <a href="https://www.tomsguide.com/live/news/cyber-monday-deals-still-available-live-2025">Cyber Monday deals still available</a> if you know where to look! </p><p>I know because I review tablets for a living here at Tom's Guide, so I've had my face glued to the prices at all the major retailers for weeks. As a resut, I can tell you from experience that Apple's iPads are still available at good discounts, most notably the <a href="https://www.amazon.com/Apple-11-inch-Intelligence-Display-All-Day/dp/B0DZ76BN5D?th=1" target="_blank" rel="nofollow">11" iPad Air M3</a> or the bigger, beefier <a href="https://www.amazon.com/dp/B0D3J9SMLK?th=1" target="_blank" rel="nofollow">13" iPad Air M4</a> for $100 off apiece.</p><p>There are fewer great Android tablet deals still available, but you can still score some killer savings like this <a href="https://www.amazon.com/Samsung-Processor-Note-Taking-Manufacturer-Warranty/dp/B0DVZSRJ8Q?th=1" target="_blank" rel="nofollow">Samsung Galaxy Tab S10 FE for 35% off</a> or the new <a href="https://www.amazon.com/OnePlus-3-4K-LCD-144-Hz-Snapdragon-8%E2%80%91Speaker-Aluminum/dp/B0FC2HCN1Q/ref=sr_1_24" target="_blank" rel="nofollow">OnePlus Pad 3 for nearly $100 off</a>. </p><p>However, if you're hoping to find an Amazon Fire tablet at a discount I'm afraid you'll have a hard time of it—the retail giant's tablets are either out of stock or back up to full price.</p><p>But honestly, Android and iPad tablets tend to outperform Amazon's best in most areas anyway. So if you're looking to score a last-minute deal on a new slate, have a scroll and see if any of these Cyber Week tablet deals strike your fancy!</p><h3 class="article-body__section" id="section-quick-links"><span>Quick links</span></h3><ul><li><strong>Apple iPad (Wi-Fi/128GB):</strong> <a href="https://target.georiot.com/Proxy.ashx?tsid=45724&GR_URL=https%3A%2F%2Famazon.com%2Fdp%2FB0DZ75TN5F%3Ftag%3Dhawk-future-20%26ascsubtag%3Dtomsguide-us-1109442591589040568-20" target="_blank" rel="nofollow"><strong>was $349 now $324</strong> @<strong> Amazon</strong></a></li><li><strong>Apple iPad Air 11"(Wi-Fi/128GB):</strong> <a href="https://target.georiot.com/Proxy.ashx?tsid=45724&GR_URL=https%3A%2F%2Famazon.com%2FApple-11-inch-Intelligence-Display-All-Day%2Fdp%2FB0DZ76BN5D%3Ftag%3Dhawk-future-20%26ascsubtag%3Dtomsguide-us-9813713268992008056-20" target="_blank" rel="nofollow"><strong>was $599 now $559</strong> @<strong> Amazon</strong></a></li><li><strong>Samsung Galaxy Tab S10 FE+ (Wi-Fi/128GB): </strong><a href="https://www.amazon.com/Samsung-Processor-Note-Taking-Manufacturer-Warranty/dp/B0DVZSB68P"><strong>was $649 now $579 @ Amazon</strong></a></li><li><strong>OnePlus Pad 3 (Wi-Fi/128GB): </strong><a href="https://www.amazon.com/OnePlus-3-4K-LCD-144-Hz-Snapdragon-8%E2%80%91Speaker-Aluminum/dp/B0FC2HCN1Q/ref=sr_1_24" target="_blank" rel="nofollow"><strong>was $699 now $629 @ Amazon</strong></a></li><li><strong>Apple iPad Air 13" (Wi-Fi/128GB):</strong> <a href="https://target.georiot.com/Proxy.ashx?tsid=45724&GR_URL=https%3A%2F%2Famazon.com%2Fdp%2FB0DZ76QBLQ%3Ftag%3Dhawk-future-20%26ascsubtag%3Dtomsguide-us-5253735488779008472-20" target="_blank" rel="nofollow"><strong>was $799 now $719</strong> @<strong> Amazon</strong></a></li><li><strong>Apple iPad Pro 11" (Wi-Fi/256GB):</strong> <a href="https://target.georiot.com/Proxy.ashx?tsid=45724&GR_URL=https%3A%2F%2Famazon.com%2FApple-iPad-Pro-11-Inch-Intelligence%2Fdp%2FB0D3J9XDMQ%3Fth%3D1%26tag%3Dhawk-future-20%26ascsubtag%3Dtomsguide-us-6878393495702529742-20" target="_blank" rel="nofollow"><strong>was $999 now $899</strong> @<strong> Amazon</strong></a></li><li><strong>Apple iPad Pro 13" (Wi-Fi/256GB):</strong> <a href="https://target.georiot.com/Proxy.ashx?tsid=45724&GR_URL=https%3A%2F%2Famazon.com%2Fdp%2FB0D3J9SMLK%3Fth%3D1%26tag%3Dhawk-future-20%26ascsubtag%3Dtomsguide-us-1433656105248441109-20" target="_blank" rel="nofollow"><strong>was $1,299 now $1,099</strong> @<strong> Amazon</strong></a></li></ul><h3 class="article-body__section" id="section-best-ipad-deals"><span>Best iPad deals</span></h3><div class="product"><a data-dimension112="8d77353e-391b-4c65-acf8-daf0e4ed8adf" data-action="Deal Block" data-label="11" iPad (WiFi/128GB)" data-dimension48="11" iPad (WiFi/128GB)" data-dimension25="$319" href="https://www.amazon.com/dp/B0DZ75TN5F" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1325px;"><p class="vanilla-image-block" style="padding-top:113.21%;"><img id="oi25obYHzoyNfMHoycGamh" name="iPad 2022 Blue.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/oi25obYHzoyNfMHoycGamh-1920-80.jpg" mos="" align="middle" fullscreen="" width="1325" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/dp/B0DZ75TN5F" target="_blank" rel="nofollow" data-dimension112="8d77353e-391b-4c65-acf8-daf0e4ed8adf" data-action="Deal Block" data-label='11" iPad (WiFi/128GB)' data-dimension48='11" iPad (WiFi/128GB)' data-dimension25="$319">11" iPad (WiFi/128GB): was $349 now $319</a></strong><br>This is a nice discount on the base iPad with 128GB of storage, and it's one of the best iPads yet. In our <a href="https://www.tomsguide.com/computing/ipads/ipad-11-2025-review">iPad 11 review</a>, we lauded this tablet for its improved speed, longer battery life and the fact Apple finally bumped it up to 128GB of storage by default. The pricedid drop as low as $274 around Black Friday, but that steep a discount may be off the table now.<a class="view-deal button" href="https://www.amazon.com/dp/B0DZ75TN5F" target="_blank" rel="nofollow" data-dimension112="8d77353e-391b-4c65-acf8-daf0e4ed8adf" data-action="Deal Block" data-label="11" iPad (WiFi/128GB)" data-dimension48="11" iPad (WiFi/128GB)" data-dimension25="$319">View Deal</a></p></div><div class="product"><a data-dimension112="7d252838-2150-47ed-94bb-8ff6aa3bdb1b" data-action="Deal Block" data-label="iPad mini 7 (Wi-Fi + Cellular/128GB)" data-dimension48="iPad mini 7 (Wi-Fi + Cellular/128GB)" data-dimension25="$632" href="https://www.amazon.com/New-Apple-iPad-Mini-A17/dp/B0DK3WJTNQ" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1203px;"><p class="vanilla-image-block" style="padding-top:124.69%;"><img id="G2PjHEjHsRfuddfWSzPBjd" name="iPad mini 2024 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/G2PjHEjHsRfuddfWSzPBjd-1920-80.jpg" mos="" align="middle" fullscreen="" width="1203" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/New-Apple-iPad-Mini-A17/dp/B0DK3WJTNQ" target="_blank" rel="nofollow" data-dimension112="7d252838-2150-47ed-94bb-8ff6aa3bdb1b" data-action="Deal Block" data-label="iPad mini 7 (Wi-Fi + Cellular/128GB)" data-dimension48="iPad mini 7 (Wi-Fi + Cellular/128GB)" data-dimension25="$632">iPad mini 7 (Wi-Fi + Cellular/128GB): was $649 now $632</a></strong><br>This is a nice savings on the iPad mini 7 with Wi-Fi + cellular radio, though you'll be limited to Wi-Fi unless you pay for a cell line. This is a remarkably fast little tablet thanks to Apple's A17 Pro chip, and movies and comics look gorgeous on the 8.3-inch (2,266 x 1,488) Liquid Retina display. You also get 12MP cameras on the front and back and Wi-Fi 6e support.<a class="view-deal button" href="https://www.amazon.com/New-Apple-iPad-Mini-A17/dp/B0DK3WJTNQ" target="_blank" rel="nofollow" data-dimension112="7d252838-2150-47ed-94bb-8ff6aa3bdb1b" data-action="Deal Block" data-label="iPad mini 7 (Wi-Fi + Cellular/128GB)" data-dimension48="iPad mini 7 (Wi-Fi + Cellular/128GB)" data-dimension25="$632">View Deal</a></p></div><div class="product"><a data-dimension112="1fcbd1d3-9e01-41f1-bea1-51c6ca3a060c" data-action="Deal Block" data-label="11" iPad Air (Wi-Fi/128GB)" data-dimension48="11" iPad Air (Wi-Fi/128GB)" data-dimension25="$499" href="https://www.amazon.com/Apple-11-inch-Intelligence-Display-All-Day/dp/B0DZ76BN5D" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1325px;"><p class="vanilla-image-block" style="padding-top:113.21%;"><img id="NVZkwX7FuVd3CYdiYHdsgm" name="iPad Air 11 2024 deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/NVZkwX7FuVd3CYdiYHdsgm-1920-80.jpg" mos="" align="middle" fullscreen="" width="1325" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Apple-11-inch-Intelligence-Display-All-Day/dp/B0DZ76BN5D" target="_blank" rel="nofollow" data-dimension112="1fcbd1d3-9e01-41f1-bea1-51c6ca3a060c" data-action="Deal Block" data-label='11" iPad Air (Wi-Fi/128GB)' data-dimension48='11" iPad Air (Wi-Fi/128GB)' data-dimension25="$499">11" iPad Air (Wi-Fi/128GB): was $599 now $499</a></strong><br>Here's a sweet discount on the latest 11" iPad Air packing Apple's M3 processor, an 11-inch LED (2360 x 1640) display and 128GB of storage. I think this is generally the best iPad for most people because it's better than the basic iPad and doesn't cost as much as the iPad Pro; yet, it still offers nearly all the same features as the Pro. Check out our <a href="https://www.tomsguide.com/tablets/ipads/ipad-air-m3-review">iPad Air M3 review</a> to see what I mean!<a class="view-deal button" href="https://www.amazon.com/Apple-11-inch-Intelligence-Display-All-Day/dp/B0DZ76BN5D" target="_blank" rel="nofollow" data-dimension112="1fcbd1d3-9e01-41f1-bea1-51c6ca3a060c" data-action="Deal Block" data-label="11" iPad Air (Wi-Fi/128GB)" data-dimension48="11" iPad Air (Wi-Fi/128GB)" data-dimension25="$499">View Deal</a></p></div><div class="product"><a data-dimension112="2bec2383-ede9-497b-940b-85d1c85bda70" data-action="Deal Block" data-label="13" iPad Air (Wi-Fi/128GB)" data-dimension48="13" iPad Air (Wi-Fi/128GB)" data-dimension25="$699" href="https://www.amazon.com/dp/B0DZ76QBLQ" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1368px;"><p class="vanilla-image-block" style="padding-top:109.65%;"><img id="5LtYHnqoh7QQJRLor82SEG" name="iPad Air 13 2024 deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/5LtYHnqoh7QQJRLor82SEG-1920-80.jpg" mos="" align="middle" fullscreen="" width="1368" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/dp/B0DZ76QBLQ" target="_blank" rel="nofollow" data-dimension112="2bec2383-ede9-497b-940b-85d1c85bda70" data-action="Deal Block" data-label='13" iPad Air (Wi-Fi/128GB)' data-dimension48='13" iPad Air (Wi-Fi/128GB)' data-dimension25="$699">13" iPad Air (Wi-Fi/128GB): was $799 now $699</a></strong><br>Here's a bigger discount on a larger version of the iPad Air M3 sporting a 13-inch LED (2732 x 2048) display. Otherwise, it packs the same 128GB of storage, 12MP rear camera, WiFi 6E support, and 12MP front camera. The larger screen is really worth it if you plan to watch a lot of videos, read a lot of comics or play a lot of games.<a class="view-deal button" href="https://www.amazon.com/dp/B0DZ76QBLQ" target="_blank" rel="nofollow" data-dimension112="2bec2383-ede9-497b-940b-85d1c85bda70" data-action="Deal Block" data-label="13" iPad Air (Wi-Fi/128GB)" data-dimension48="13" iPad Air (Wi-Fi/128GB)" data-dimension25="$699">View Deal</a></p></div><div class="product"><a data-dimension112="4f44c384-4b6a-4a2b-9f81-3c01af4713d6" data-action="Deal Block" data-label="11" iPad Pro M5 (Wi-Fi/256GB)" data-dimension48="11" iPad Pro M5 (Wi-Fi/256GB)" data-dimension25="$927" href="https://www.amazon.com/Apple-iPad-Pro-11-inch-Landscape/dp/B0FWCXJVHN" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1308px;"><p class="vanilla-image-block" style="padding-top:114.68%;"><img id="kVGdyTH2y4y4yS5Mwos2bg" name="iPad Pro M5 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/kVGdyTH2y4y4yS5Mwos2bg-1920-80.jpg" mos="" align="middle" fullscreen="" width="1308" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Apple-iPad-Pro-11-inch-Landscape/dp/B0FWCXJVHN" target="_blank" rel="nofollow" data-dimension112="4f44c384-4b6a-4a2b-9f81-3c01af4713d6" data-action="Deal Block" data-label='11" iPad Pro M5 (Wi-Fi/256GB)' data-dimension48='11" iPad Pro M5 (Wi-Fi/256GB)' data-dimension25="$927">11" iPad Pro M5 (Wi-Fi/256GB): was $999 now $927</a></strong><br>This isn't a huge discount, but it's amazing you can get one at all given the iPad Pro M5 just came out last month and is Apple's fasted tablet yet. Not only does this iPad have Apple's fastest chip inside and 256GB of storage, it sports a lovely 11-inch Ultra Retina XDR OLED Display that makes everything you do on it look amazing. Check out our recent <a href="https://www.tomsguide.com/computing/ipads/ipad-pro-m5-review">iPad Pro M5 review</a> to see it in action!<a class="view-deal button" href="https://www.amazon.com/Apple-iPad-Pro-11-inch-Landscape/dp/B0FWCXJVHN" target="_blank" rel="nofollow" data-dimension112="4f44c384-4b6a-4a2b-9f81-3c01af4713d6" data-action="Deal Block" data-label="11" iPad Pro M5 (Wi-Fi/256GB)" data-dimension48="11" iPad Pro M5 (Wi-Fi/256GB)" data-dimension25="$927">View Deal</a></p></div><div class="product"><a data-dimension112="17bbeb84-b125-4c0e-ba09-e59decf98c4f" data-action="Deal Block" data-label="13" iPad Pro M4 (Wi-Fi/256GB)" data-dimension48="13" iPad Pro M4 (Wi-Fi/256GB)" data-dimension25="$1199" href="https://www.amazon.com/dp/B0D3J9SMLK?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:954px;"><p class="vanilla-image-block" style="padding-top:109.96%;"><img id="mDVBPrQDtsBwRgt9E49kE" name="6533540cv11d.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/mDVBPrQDtsBwRgt9E49kE-1920-80.jpg" mos="" align="middle" fullscreen="" width="954" height="1049" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/dp/B0D3J9SMLK?th=1" target="_blank" rel="nofollow" data-dimension112="17bbeb84-b125-4c0e-ba09-e59decf98c4f" data-action="Deal Block" data-label='13" iPad Pro M4 (Wi-Fi/256GB)' data-dimension48='13" iPad Pro M4 (Wi-Fi/256GB)' data-dimension25="$1199">13" iPad Pro M4 (Wi-Fi/256GB): was $1299 now $1199</a></strong><br>Here's a heftier discount on the slightly older iPad Pro M4, which is still a killer tablet that runs circles around most thanks to its Apple M4 chip. The extra-large 13-inch Ultra Retina XDR display makes this the biggest and most powerful iPad you can buy, so if you want one, I'd buy while it's discounted!<a class="view-deal button" href="https://www.amazon.com/dp/B0D3J9SMLK?th=1" target="_blank" rel="nofollow" data-dimension112="17bbeb84-b125-4c0e-ba09-e59decf98c4f" data-action="Deal Block" data-label="13" iPad Pro M4 (Wi-Fi/256GB)" data-dimension48="13" iPad Pro M4 (Wi-Fi/256GB)" data-dimension25="$1199">View Deal</a></p></div><h3 class="article-body__section" id="section-best-android-tablet-deals"><span>Best Android tablet deals</span></h3><div class="product"><a data-dimension112="25117e7f-cd8f-4745-8216-a6a8f67a228d" data-action="Deal Block" data-label="Galaxy Tab A9+" data-dimension48="Galaxy Tab A9+" data-dimension25="$149" href="https://www.amazon.com/Samsung-Processor-Note-Taking-Manufacturer-Warranty/dp/B0DVZSRJ8Q" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2094px;"><p class="vanilla-image-block" style="padding-top:60.65%;"><img id="3mdmia3kU3uFNStE7MJYkV" name="Screenshot 2024-11-11 at 10.41.30.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/3mdmia3kU3uFNStE7MJYkV-1920-80.png" mos="" align="middle" fullscreen="" width="2094" height="1270" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Samsung-Processor-Note-Taking-Manufacturer-Warranty/dp/B0DVZSRJ8Q" target="_blank" rel="nofollow" data-dimension112="25117e7f-cd8f-4745-8216-a6a8f67a228d" data-action="Deal Block" data-label="Galaxy Tab A9+" data-dimension48="Galaxy Tab A9+" data-dimension25="$149">Galaxy Tab A9+: was $219 now $149</a></strong><br>This is a weaker tablet that's still great for streaming movies or giving to a kid to keep them entertained, especially at this price. You get the 11" 1200p touchscreen, the Snapdragon chip powering everything, 4GB of RAM and 128GB of storage for all your apps.<a class="view-deal button" href="https://www.amazon.com/Samsung-Processor-Note-Taking-Manufacturer-Warranty/dp/B0DVZSRJ8Q" target="_blank" rel="nofollow" data-dimension112="25117e7f-cd8f-4745-8216-a6a8f67a228d" data-action="Deal Block" data-label="Galaxy Tab A9+" data-dimension48="Galaxy Tab A9+" data-dimension25="$149">View Deal</a></p></div><div class="product"><a data-dimension112="fcdadfc3-398a-4430-906d-1184eaf53f8f" data-action="Deal Block" data-label="Galaxy Tab S10 FE+" data-dimension48="Galaxy Tab S10 FE+" data-dimension25="$324" href="https://www.amazon.com/Samsung-Processor-Note-Taking-Manufacturer-Warranty/dp/B0DVZSRJ8Q" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1080px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="SrCgxi7AvcPGqXWv24WMaM" name="Samsung Galaxy S10 FE Plus deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/SrCgxi7AvcPGqXWv24WMaM-1920-80.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Save a nice chunk of change on Samsung's Galaxy Tab S10 FE+, a mid-range tablet that just launched this year and offers a big, beautiful 13.1-inch LCD panel and a 15+ hours of tested battery life. Read all about it in our <a href="https://www.tomsguide.com/computing/android-tablets/samsung-galaxy-tab-s10-fe-plus-review" data-dimension112="fcdadfc3-398a-4430-906d-1184eaf53f8f" data-action="Deal Block" data-label="Galaxy Tab S10 FE+" data-dimension48="Galaxy Tab S10 FE+" data-dimension25="$324">Samsung Galaxy Tab S10 FE+ review</a>!<a class="view-deal button" href="https://www.amazon.com/Samsung-Processor-Note-Taking-Manufacturer-Warranty/dp/B0DVZSRJ8Q" target="_blank" rel="nofollow" data-dimension112="fcdadfc3-398a-4430-906d-1184eaf53f8f" data-action="Deal Block" data-label="Galaxy Tab S10 FE+" data-dimension48="Galaxy Tab S10 FE+" data-dimension25="$324">View Deal</a></p></div><div class="product"><a data-dimension112="4b4cce3e-ab09-424e-9f29-13f56adf33ac" data-action="Deal Block" data-label="Galaxy Tab S10 Lite" data-dimension48="Galaxy Tab S10 Lite" data-dimension25="$299" href="https://www.amazon.com/Samsung-Processor-Note-Taking-Manufacturer-Warranty/dp/B0DVZSRJ8Q" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1080px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="6MtzjCmXKf5yE6GBQhiVZK" name="Samsung Galaxy Tab S10 FE deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6MtzjCmXKf5yE6GBQhiVZK-1920-80.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Samsung-Processor-Note-Taking-Manufacturer-Warranty/dp/B0DVZSRJ8Q" target="_blank" rel="nofollow" data-dimension112="4b4cce3e-ab09-424e-9f29-13f56adf33ac" data-action="Deal Block" data-label="Galaxy Tab S10 Lite" data-dimension48="Galaxy Tab S10 Lite" data-dimension25="$299">Galaxy Tab S10 Lite: was $349 now $299</a></strong><br>This mid-range Samsung tablet is a great deal at this price since you get an 11" touchscreen, 6GB RAM, 128GB of storage for your apps and a free S Pen stylus packed in at no charge!<a class="view-deal button" href="https://www.amazon.com/Samsung-Processor-Note-Taking-Manufacturer-Warranty/dp/B0DVZSRJ8Q" target="_blank" rel="nofollow" data-dimension112="4b4cce3e-ab09-424e-9f29-13f56adf33ac" data-action="Deal Block" data-label="Galaxy Tab S10 Lite" data-dimension48="Galaxy Tab S10 Lite" data-dimension25="$299">View Deal</a></p></div><div class="product"><a data-dimension112="87cdee2e-0364-4768-babd-b0a523ea1fc2" data-action="Deal Block" data-label="Pad 3" data-dimension48="Pad 3" data-dimension25="$629" href="https://www.amazon.com/OnePlus-3-4K-LCD-144-Hz-Snapdragon-8%E2%80%91Speaker-Aluminum/dp/B0FC2HCN1Q/ref=sr_1_24" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1080px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="Ah6QmUtymEwigDjqfMmJZK" name="OnePlus Pad 3 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Ah6QmUtymEwigDjqfMmJZK-1920-80.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The OnePlus Pad 3 is the latest and greatest Android tablet from OnePlus, and at this price it's a good deal since you get the 13.2″ 3.4K   144 Hz touchscreen powered by a speedy Snapdragon 8 Elite chip, 12 GB of RAM and 256 GB of storage for all your apps.<a class="view-deal button" href="https://www.amazon.com/OnePlus-3-4K-LCD-144-Hz-Snapdragon-8%E2%80%91Speaker-Aluminum/dp/B0FC2HCN1Q/ref=sr_1_24" target="_blank" rel="nofollow" data-dimension112="87cdee2e-0364-4768-babd-b0a523ea1fc2" data-action="Deal Block" data-label="Pad 3" data-dimension48="Pad 3" data-dimension25="$629">View Deal</a></p></div><p><em>For more discounts, check out our </em><a href="https://www.tomsguide.com/sales-events/31-cyber-week-deals-that-make-perfect-holiday-gifts-shop-apple-yeti-birkenstock-nintendo-and-more"><em>Cyber Week deals</em></a><em> guide.</em></p><h3 class="article-body__section" id="section-shop-last-minute-cyber-week-deals"><span>Shop last-minute Cyber Week deals</span></h3><ul><li><strong>Amazon: </strong><a href="https://www.amazon.com/b?node=210998206011" target="_blank" rel="nofollow"><strong>50% off Ring, Ninja, AirPods, more</strong></a><strong></strong></li><li><strong>Walmart: </strong><a href="https://www.walmart.com/shop/deals/cyber-monday" target="_blank" rel="nofollow"><strong>save on Crocs, Keurig, PS5</strong></a></li><li><strong>REI: </strong><a href="https://www.rei.com/f/scd-deals" target="_blank" rel="nofollow"><strong>half-off Arc'teryx, Patagonia, more</strong></a><strong></strong></li><li><strong>Dell: </strong><a href="https://www.dell.com/en-us/shop/deals?sortBy=price-ascending" target="_blank" rel="nofollow"><strong>monitors from $79/laptops from $249</strong></a><strong></strong></li><li><strong>Nectar: </strong><a href="https://www.nectarsleep.com/" target="_blank" rel="nofollow"><strong>50% off mattresses + bundles</strong></a></li><li><strong>Best Buy: </strong><a href="https://www.bestbuy.com/site/all-electronics-on-sale/all-computers-tablets-on-sale/pcmcat1632941704767.c?id=pcmcat1632941704767" target="_blank" rel="nofollow"><strong>laptops from $149</strong></a><strong></strong></li><li><strong>Lenovo: </strong><a href="https://www.lenovo.com/us/en/d/deals/laptops/?IPromoID=LEN380027&sortBy=priceUp" target="_blank" rel="nofollow"><strong>doorbuster deals from $319</strong></a><strong></strong></li><li><strong>Wayfair: </strong><a href="https://www.wayfair.com/daily-sales" target="_blank" rel="nofollow"><strong>up to 80% off home decor</strong></a><strong></strong></li><li><strong>Lululemon: </strong><a href="https://shop.lululemon.com/c/we-made-too-much/n18mhd?Ns=price%7C0" target="_blank" rel="nofollow"><strong>top picks from $9</strong></a></li><li><strong>Birkenstock: </strong><a href="https://www.nordstrom.com/browse/sale?sort=PercentOff&filterByBrand=birkenstock" target="_blank" rel="nofollow"><strong>deals from $20 @ Nordstrom</strong></a><strong></strong></li><li><strong>Saatva: </strong><a href="https://www.saatva.com/mattresses/saatva-classic?utm_source=futurepublishing&utm_medium=affiliate&coupon=awyqqgzvxqicebab" target="_blank" rel="nofollow"><strong>luxury mattresses from $1,099</strong></a><strong></strong></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/tablets/7-best-cyber-monday-tablet-deals-you-can-still-get-from-someone-who-reviews-them-for-a-living</link>
                                                                            <description>
                            <![CDATA[ I've been watching tablet prices all month, and these are the best deals on iPads, Amazon Fire tablets and Android tablets that you can still get! ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">msVhLrFjEYvakq3DsVcpy3</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/5Cyf44wAPMtj3k99qHGmVo-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 04 Dec 2025 12:30:00 +0000</pubDate>                                                                                                                                <updated>Fri, 05 Dec 2025 15:44:18 +0000</updated>
                                                                                                                                            <category><![CDATA[Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                                                                <author><![CDATA[ alex.wawro@futurenet.com (Alex Wawro) ]]></author>                    <dc:creator><![CDATA[ Alex Wawro ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/Y4wW9n7CZrNzgofqVkGA5J-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Alex Wawro was a senior editor for computing at Tom’s Guide. A lifelong tech and games enthusiast, he has more than a decade of experience covering both for outlets like Game Developer, Black Hat, and PC World magazine. &lt;/p&gt;&lt;p&gt;  &lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/5Cyf44wAPMtj3k99qHGmVo-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple iPad held up with holiday finds deal tag superimposed]]></media:description>                                                            <media:text><![CDATA[Apple iPad held up with holiday finds deal tag superimposed]]></media:text>
                                <media:title type="plain"><![CDATA[Apple iPad held up with holiday finds deal tag superimposed]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/5Cyf44wAPMtj3k99qHGmVo-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Thanksgiving has come and gone here in the States, but as everyone turns to focus on the winter holidays I've got good news for late shoppers: there are loads of <a href="https://www.tomsguide.com/live/news/cyber-monday-deals-still-available-live-2025">Cyber Monday deals still available</a> if you know where to look! </p><p>I know because I review tablets for a living here at Tom's Guide, so I've had my face glued to the prices at all the major retailers for weeks. As a resut, I can tell you from experience that Apple's iPads are still available at good discounts, most notably the <a href="https://www.amazon.com/Apple-11-inch-Intelligence-Display-All-Day/dp/B0DZ76BN5D?th=1" target="_blank" rel="nofollow">11" iPad Air M3</a> or the bigger, beefier <a href="https://www.amazon.com/dp/B0D3J9SMLK?th=1" target="_blank" rel="nofollow">13" iPad Air M4</a> for $100 off apiece.</p><p>There are fewer great Android tablet deals still available, but you can still score some killer savings like this <a href="https://www.amazon.com/Samsung-Processor-Note-Taking-Manufacturer-Warranty/dp/B0DVZSRJ8Q?th=1" target="_blank" rel="nofollow">Samsung Galaxy Tab S10 FE for 35% off</a> or the new <a href="https://www.amazon.com/OnePlus-3-4K-LCD-144-Hz-Snapdragon-8%E2%80%91Speaker-Aluminum/dp/B0FC2HCN1Q/ref=sr_1_24" target="_blank" rel="nofollow">OnePlus Pad 3 for nearly $100 off</a>. </p><p>However, if you're hoping to find an Amazon Fire tablet at a discount I'm afraid you'll have a hard time of it—the retail giant's tablets are either out of stock or back up to full price.</p><p>But honestly, Android and iPad tablets tend to outperform Amazon's best in most areas anyway. So if you're looking to score a last-minute deal on a new slate, have a scroll and see if any of these Cyber Week tablet deals strike your fancy!</p><h3 class="article-body__section" id="section-quick-links"><span>Quick links</span></h3><ul><li><strong>Apple iPad (Wi-Fi/128GB):</strong> <a href="https://target.georiot.com/Proxy.ashx?tsid=45724&GR_URL=https%3A%2F%2Famazon.com%2Fdp%2FB0DZ75TN5F%3Ftag%3Dhawk-future-20%26ascsubtag%3Dtomsguide-us-1109442591589040568-20" target="_blank" rel="nofollow"><strong>was $349 now $324</strong> @<strong> Amazon</strong></a></li><li><strong>Apple iPad Air 11"(Wi-Fi/128GB):</strong> <a href="https://target.georiot.com/Proxy.ashx?tsid=45724&GR_URL=https%3A%2F%2Famazon.com%2FApple-11-inch-Intelligence-Display-All-Day%2Fdp%2FB0DZ76BN5D%3Ftag%3Dhawk-future-20%26ascsubtag%3Dtomsguide-us-9813713268992008056-20" target="_blank" rel="nofollow"><strong>was $599 now $559</strong> @<strong> Amazon</strong></a></li><li><strong>Samsung Galaxy Tab S10 FE+ (Wi-Fi/128GB): </strong><a href="https://www.amazon.com/Samsung-Processor-Note-Taking-Manufacturer-Warranty/dp/B0DVZSB68P"><strong>was $649 now $579 @ Amazon</strong></a></li><li><strong>OnePlus Pad 3 (Wi-Fi/128GB): </strong><a href="https://www.amazon.com/OnePlus-3-4K-LCD-144-Hz-Snapdragon-8%E2%80%91Speaker-Aluminum/dp/B0FC2HCN1Q/ref=sr_1_24" target="_blank" rel="nofollow"><strong>was $699 now $629 @ Amazon</strong></a></li><li><strong>Apple iPad Air 13" (Wi-Fi/128GB):</strong> <a href="https://target.georiot.com/Proxy.ashx?tsid=45724&GR_URL=https%3A%2F%2Famazon.com%2Fdp%2FB0DZ76QBLQ%3Ftag%3Dhawk-future-20%26ascsubtag%3Dtomsguide-us-5253735488779008472-20" target="_blank" rel="nofollow"><strong>was $799 now $719</strong> @<strong> Amazon</strong></a></li><li><strong>Apple iPad Pro 11" (Wi-Fi/256GB):</strong> <a href="https://target.georiot.com/Proxy.ashx?tsid=45724&GR_URL=https%3A%2F%2Famazon.com%2FApple-iPad-Pro-11-Inch-Intelligence%2Fdp%2FB0D3J9XDMQ%3Fth%3D1%26tag%3Dhawk-future-20%26ascsubtag%3Dtomsguide-us-6878393495702529742-20" target="_blank" rel="nofollow"><strong>was $999 now $899</strong> @<strong> Amazon</strong></a></li><li><strong>Apple iPad Pro 13" (Wi-Fi/256GB):</strong> <a href="https://target.georiot.com/Proxy.ashx?tsid=45724&GR_URL=https%3A%2F%2Famazon.com%2Fdp%2FB0D3J9SMLK%3Fth%3D1%26tag%3Dhawk-future-20%26ascsubtag%3Dtomsguide-us-1433656105248441109-20" target="_blank" rel="nofollow"><strong>was $1,299 now $1,099</strong> @<strong> Amazon</strong></a></li></ul><h3 class="article-body__section" id="section-best-ipad-deals"><span>Best iPad deals</span></h3><div class="product"><a data-dimension112="8d77353e-391b-4c65-acf8-daf0e4ed8adf" data-action="Deal Block" data-label="11" iPad (WiFi/128GB)" data-dimension48="11" iPad (WiFi/128GB)" data-dimension25="$319" href="https://www.amazon.com/dp/B0DZ75TN5F" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1325px;"><p class="vanilla-image-block" style="padding-top:113.21%;"><img id="oi25obYHzoyNfMHoycGamh" name="iPad 2022 Blue.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/oi25obYHzoyNfMHoycGamh-1920-80.jpg" mos="" align="middle" fullscreen="" width="1325" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/dp/B0DZ75TN5F" target="_blank" rel="nofollow" data-dimension112="8d77353e-391b-4c65-acf8-daf0e4ed8adf" data-action="Deal Block" data-label='11" iPad (WiFi/128GB)' data-dimension48='11" iPad (WiFi/128GB)' data-dimension25="$319">11" iPad (WiFi/128GB): was $349 now $319</a></strong><br>This is a nice discount on the base iPad with 128GB of storage, and it's one of the best iPads yet. In our <a href="https://www.tomsguide.com/computing/ipads/ipad-11-2025-review">iPad 11 review</a>, we lauded this tablet for its improved speed, longer battery life and the fact Apple finally bumped it up to 128GB of storage by default. The pricedid drop as low as $274 around Black Friday, but that steep a discount may be off the table now.<a class="view-deal button" href="https://www.amazon.com/dp/B0DZ75TN5F" target="_blank" rel="nofollow" data-dimension112="8d77353e-391b-4c65-acf8-daf0e4ed8adf" data-action="Deal Block" data-label="11" iPad (WiFi/128GB)" data-dimension48="11" iPad (WiFi/128GB)" data-dimension25="$319">View Deal</a></p></div><div class="product"><a data-dimension112="7d252838-2150-47ed-94bb-8ff6aa3bdb1b" data-action="Deal Block" data-label="iPad mini 7 (Wi-Fi + Cellular/128GB)" data-dimension48="iPad mini 7 (Wi-Fi + Cellular/128GB)" data-dimension25="$632" href="https://www.amazon.com/New-Apple-iPad-Mini-A17/dp/B0DK3WJTNQ" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1203px;"><p class="vanilla-image-block" style="padding-top:124.69%;"><img id="G2PjHEjHsRfuddfWSzPBjd" name="iPad mini 2024 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/G2PjHEjHsRfuddfWSzPBjd-1920-80.jpg" mos="" align="middle" fullscreen="" width="1203" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/New-Apple-iPad-Mini-A17/dp/B0DK3WJTNQ" target="_blank" rel="nofollow" data-dimension112="7d252838-2150-47ed-94bb-8ff6aa3bdb1b" data-action="Deal Block" data-label="iPad mini 7 (Wi-Fi + Cellular/128GB)" data-dimension48="iPad mini 7 (Wi-Fi + Cellular/128GB)" data-dimension25="$632">iPad mini 7 (Wi-Fi + Cellular/128GB): was $649 now $632</a></strong><br>This is a nice savings on the iPad mini 7 with Wi-Fi + cellular radio, though you'll be limited to Wi-Fi unless you pay for a cell line. This is a remarkably fast little tablet thanks to Apple's A17 Pro chip, and movies and comics look gorgeous on the 8.3-inch (2,266 x 1,488) Liquid Retina display. You also get 12MP cameras on the front and back and Wi-Fi 6e support.<a class="view-deal button" href="https://www.amazon.com/New-Apple-iPad-Mini-A17/dp/B0DK3WJTNQ" target="_blank" rel="nofollow" data-dimension112="7d252838-2150-47ed-94bb-8ff6aa3bdb1b" data-action="Deal Block" data-label="iPad mini 7 (Wi-Fi + Cellular/128GB)" data-dimension48="iPad mini 7 (Wi-Fi + Cellular/128GB)" data-dimension25="$632">View Deal</a></p></div><div class="product"><a data-dimension112="1fcbd1d3-9e01-41f1-bea1-51c6ca3a060c" data-action="Deal Block" data-label="11" iPad Air (Wi-Fi/128GB)" data-dimension48="11" iPad Air (Wi-Fi/128GB)" data-dimension25="$499" href="https://www.amazon.com/Apple-11-inch-Intelligence-Display-All-Day/dp/B0DZ76BN5D" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1325px;"><p class="vanilla-image-block" style="padding-top:113.21%;"><img id="NVZkwX7FuVd3CYdiYHdsgm" name="iPad Air 11 2024 deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/NVZkwX7FuVd3CYdiYHdsgm-1920-80.jpg" mos="" align="middle" fullscreen="" width="1325" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Apple-11-inch-Intelligence-Display-All-Day/dp/B0DZ76BN5D" target="_blank" rel="nofollow" data-dimension112="1fcbd1d3-9e01-41f1-bea1-51c6ca3a060c" data-action="Deal Block" data-label='11" iPad Air (Wi-Fi/128GB)' data-dimension48='11" iPad Air (Wi-Fi/128GB)' data-dimension25="$499">11" iPad Air (Wi-Fi/128GB): was $599 now $499</a></strong><br>Here's a sweet discount on the latest 11" iPad Air packing Apple's M3 processor, an 11-inch LED (2360 x 1640) display and 128GB of storage. I think this is generally the best iPad for most people because it's better than the basic iPad and doesn't cost as much as the iPad Pro; yet, it still offers nearly all the same features as the Pro. Check out our <a href="https://www.tomsguide.com/tablets/ipads/ipad-air-m3-review">iPad Air M3 review</a> to see what I mean!<a class="view-deal button" href="https://www.amazon.com/Apple-11-inch-Intelligence-Display-All-Day/dp/B0DZ76BN5D" target="_blank" rel="nofollow" data-dimension112="1fcbd1d3-9e01-41f1-bea1-51c6ca3a060c" data-action="Deal Block" data-label="11" iPad Air (Wi-Fi/128GB)" data-dimension48="11" iPad Air (Wi-Fi/128GB)" data-dimension25="$499">View Deal</a></p></div><div class="product"><a data-dimension112="2bec2383-ede9-497b-940b-85d1c85bda70" data-action="Deal Block" data-label="13" iPad Air (Wi-Fi/128GB)" data-dimension48="13" iPad Air (Wi-Fi/128GB)" data-dimension25="$699" href="https://www.amazon.com/dp/B0DZ76QBLQ" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1368px;"><p class="vanilla-image-block" style="padding-top:109.65%;"><img id="5LtYHnqoh7QQJRLor82SEG" name="iPad Air 13 2024 deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/5LtYHnqoh7QQJRLor82SEG-1920-80.jpg" mos="" align="middle" fullscreen="" width="1368" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/dp/B0DZ76QBLQ" target="_blank" rel="nofollow" data-dimension112="2bec2383-ede9-497b-940b-85d1c85bda70" data-action="Deal Block" data-label='13" iPad Air (Wi-Fi/128GB)' data-dimension48='13" iPad Air (Wi-Fi/128GB)' data-dimension25="$699">13" iPad Air (Wi-Fi/128GB): was $799 now $699</a></strong><br>Here's a bigger discount on a larger version of the iPad Air M3 sporting a 13-inch LED (2732 x 2048) display. Otherwise, it packs the same 128GB of storage, 12MP rear camera, WiFi 6E support, and 12MP front camera. The larger screen is really worth it if you plan to watch a lot of videos, read a lot of comics or play a lot of games.<a class="view-deal button" href="https://www.amazon.com/dp/B0DZ76QBLQ" target="_blank" rel="nofollow" data-dimension112="2bec2383-ede9-497b-940b-85d1c85bda70" data-action="Deal Block" data-label="13" iPad Air (Wi-Fi/128GB)" data-dimension48="13" iPad Air (Wi-Fi/128GB)" data-dimension25="$699">View Deal</a></p></div><div class="product"><a data-dimension112="4f44c384-4b6a-4a2b-9f81-3c01af4713d6" data-action="Deal Block" data-label="11" iPad Pro M5 (Wi-Fi/256GB)" data-dimension48="11" iPad Pro M5 (Wi-Fi/256GB)" data-dimension25="$927" href="https://www.amazon.com/Apple-iPad-Pro-11-inch-Landscape/dp/B0FWCXJVHN" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1308px;"><p class="vanilla-image-block" style="padding-top:114.68%;"><img id="kVGdyTH2y4y4yS5Mwos2bg" name="iPad Pro M5 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/kVGdyTH2y4y4yS5Mwos2bg-1920-80.jpg" mos="" align="middle" fullscreen="" width="1308" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Apple-iPad-Pro-11-inch-Landscape/dp/B0FWCXJVHN" target="_blank" rel="nofollow" data-dimension112="4f44c384-4b6a-4a2b-9f81-3c01af4713d6" data-action="Deal Block" data-label='11" iPad Pro M5 (Wi-Fi/256GB)' data-dimension48='11" iPad Pro M5 (Wi-Fi/256GB)' data-dimension25="$927">11" iPad Pro M5 (Wi-Fi/256GB): was $999 now $927</a></strong><br>This isn't a huge discount, but it's amazing you can get one at all given the iPad Pro M5 just came out last month and is Apple's fasted tablet yet. Not only does this iPad have Apple's fastest chip inside and 256GB of storage, it sports a lovely 11-inch Ultra Retina XDR OLED Display that makes everything you do on it look amazing. Check out our recent <a href="https://www.tomsguide.com/computing/ipads/ipad-pro-m5-review">iPad Pro M5 review</a> to see it in action!<a class="view-deal button" href="https://www.amazon.com/Apple-iPad-Pro-11-inch-Landscape/dp/B0FWCXJVHN" target="_blank" rel="nofollow" data-dimension112="4f44c384-4b6a-4a2b-9f81-3c01af4713d6" data-action="Deal Block" data-label="11" iPad Pro M5 (Wi-Fi/256GB)" data-dimension48="11" iPad Pro M5 (Wi-Fi/256GB)" data-dimension25="$927">View Deal</a></p></div><div class="product"><a data-dimension112="17bbeb84-b125-4c0e-ba09-e59decf98c4f" data-action="Deal Block" data-label="13" iPad Pro M4 (Wi-Fi/256GB)" data-dimension48="13" iPad Pro M4 (Wi-Fi/256GB)" data-dimension25="$1199" href="https://www.amazon.com/dp/B0D3J9SMLK?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:954px;"><p class="vanilla-image-block" style="padding-top:109.96%;"><img id="mDVBPrQDtsBwRgt9E49kE" name="6533540cv11d.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/mDVBPrQDtsBwRgt9E49kE-1920-80.jpg" mos="" align="middle" fullscreen="" width="954" height="1049" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/dp/B0D3J9SMLK?th=1" target="_blank" rel="nofollow" data-dimension112="17bbeb84-b125-4c0e-ba09-e59decf98c4f" data-action="Deal Block" data-label='13" iPad Pro M4 (Wi-Fi/256GB)' data-dimension48='13" iPad Pro M4 (Wi-Fi/256GB)' data-dimension25="$1199">13" iPad Pro M4 (Wi-Fi/256GB): was $1299 now $1199</a></strong><br>Here's a heftier discount on the slightly older iPad Pro M4, which is still a killer tablet that runs circles around most thanks to its Apple M4 chip. The extra-large 13-inch Ultra Retina XDR display makes this the biggest and most powerful iPad you can buy, so if you want one, I'd buy while it's discounted!<a class="view-deal button" href="https://www.amazon.com/dp/B0D3J9SMLK?th=1" target="_blank" rel="nofollow" data-dimension112="17bbeb84-b125-4c0e-ba09-e59decf98c4f" data-action="Deal Block" data-label="13" iPad Pro M4 (Wi-Fi/256GB)" data-dimension48="13" iPad Pro M4 (Wi-Fi/256GB)" data-dimension25="$1199">View Deal</a></p></div><h3 class="article-body__section" id="section-best-android-tablet-deals"><span>Best Android tablet deals</span></h3><div class="product"><a data-dimension112="25117e7f-cd8f-4745-8216-a6a8f67a228d" data-action="Deal Block" data-label="Galaxy Tab A9+" data-dimension48="Galaxy Tab A9+" data-dimension25="$149" href="https://www.amazon.com/Samsung-Processor-Note-Taking-Manufacturer-Warranty/dp/B0DVZSRJ8Q" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2094px;"><p class="vanilla-image-block" style="padding-top:60.65%;"><img id="3mdmia3kU3uFNStE7MJYkV" name="Screenshot 2024-11-11 at 10.41.30.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/3mdmia3kU3uFNStE7MJYkV-1920-80.png" mos="" align="middle" fullscreen="" width="2094" height="1270" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Samsung-Processor-Note-Taking-Manufacturer-Warranty/dp/B0DVZSRJ8Q" target="_blank" rel="nofollow" data-dimension112="25117e7f-cd8f-4745-8216-a6a8f67a228d" data-action="Deal Block" data-label="Galaxy Tab A9+" data-dimension48="Galaxy Tab A9+" data-dimension25="$149">Galaxy Tab A9+: was $219 now $149</a></strong><br>This is a weaker tablet that's still great for streaming movies or giving to a kid to keep them entertained, especially at this price. You get the 11" 1200p touchscreen, the Snapdragon chip powering everything, 4GB of RAM and 128GB of storage for all your apps.<a class="view-deal button" href="https://www.amazon.com/Samsung-Processor-Note-Taking-Manufacturer-Warranty/dp/B0DVZSRJ8Q" target="_blank" rel="nofollow" data-dimension112="25117e7f-cd8f-4745-8216-a6a8f67a228d" data-action="Deal Block" data-label="Galaxy Tab A9+" data-dimension48="Galaxy Tab A9+" data-dimension25="$149">View Deal</a></p></div><div class="product"><a data-dimension112="fcdadfc3-398a-4430-906d-1184eaf53f8f" data-action="Deal Block" data-label="Galaxy Tab S10 FE+" data-dimension48="Galaxy Tab S10 FE+" data-dimension25="$324" href="https://www.amazon.com/Samsung-Processor-Note-Taking-Manufacturer-Warranty/dp/B0DVZSRJ8Q" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1080px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="SrCgxi7AvcPGqXWv24WMaM" name="Samsung Galaxy S10 FE Plus deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/SrCgxi7AvcPGqXWv24WMaM-1920-80.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Save a nice chunk of change on Samsung's Galaxy Tab S10 FE+, a mid-range tablet that just launched this year and offers a big, beautiful 13.1-inch LCD panel and a 15+ hours of tested battery life. Read all about it in our <a href="https://www.tomsguide.com/computing/android-tablets/samsung-galaxy-tab-s10-fe-plus-review" data-dimension112="fcdadfc3-398a-4430-906d-1184eaf53f8f" data-action="Deal Block" data-label="Galaxy Tab S10 FE+" data-dimension48="Galaxy Tab S10 FE+" data-dimension25="$324">Samsung Galaxy Tab S10 FE+ review</a>!<a class="view-deal button" href="https://www.amazon.com/Samsung-Processor-Note-Taking-Manufacturer-Warranty/dp/B0DVZSRJ8Q" target="_blank" rel="nofollow" data-dimension112="fcdadfc3-398a-4430-906d-1184eaf53f8f" data-action="Deal Block" data-label="Galaxy Tab S10 FE+" data-dimension48="Galaxy Tab S10 FE+" data-dimension25="$324">View Deal</a></p></div><div class="product"><a data-dimension112="4b4cce3e-ab09-424e-9f29-13f56adf33ac" data-action="Deal Block" data-label="Galaxy Tab S10 Lite" data-dimension48="Galaxy Tab S10 Lite" data-dimension25="$299" href="https://www.amazon.com/Samsung-Processor-Note-Taking-Manufacturer-Warranty/dp/B0DVZSRJ8Q" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1080px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="6MtzjCmXKf5yE6GBQhiVZK" name="Samsung Galaxy Tab S10 FE deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6MtzjCmXKf5yE6GBQhiVZK-1920-80.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Samsung-Processor-Note-Taking-Manufacturer-Warranty/dp/B0DVZSRJ8Q" target="_blank" rel="nofollow" data-dimension112="4b4cce3e-ab09-424e-9f29-13f56adf33ac" data-action="Deal Block" data-label="Galaxy Tab S10 Lite" data-dimension48="Galaxy Tab S10 Lite" data-dimension25="$299">Galaxy Tab S10 Lite: was $349 now $299</a></strong><br>This mid-range Samsung tablet is a great deal at this price since you get an 11" touchscreen, 6GB RAM, 128GB of storage for your apps and a free S Pen stylus packed in at no charge!<a class="view-deal button" href="https://www.amazon.com/Samsung-Processor-Note-Taking-Manufacturer-Warranty/dp/B0DVZSRJ8Q" target="_blank" rel="nofollow" data-dimension112="4b4cce3e-ab09-424e-9f29-13f56adf33ac" data-action="Deal Block" data-label="Galaxy Tab S10 Lite" data-dimension48="Galaxy Tab S10 Lite" data-dimension25="$299">View Deal</a></p></div><div class="product"><a data-dimension112="87cdee2e-0364-4768-babd-b0a523ea1fc2" data-action="Deal Block" data-label="Pad 3" data-dimension48="Pad 3" data-dimension25="$629" href="https://www.amazon.com/OnePlus-3-4K-LCD-144-Hz-Snapdragon-8%E2%80%91Speaker-Aluminum/dp/B0FC2HCN1Q/ref=sr_1_24" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1080px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="Ah6QmUtymEwigDjqfMmJZK" name="OnePlus Pad 3 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Ah6QmUtymEwigDjqfMmJZK-1920-80.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The OnePlus Pad 3 is the latest and greatest Android tablet from OnePlus, and at this price it's a good deal since you get the 13.2″ 3.4K   144 Hz touchscreen powered by a speedy Snapdragon 8 Elite chip, 12 GB of RAM and 256 GB of storage for all your apps.<a class="view-deal button" href="https://www.amazon.com/OnePlus-3-4K-LCD-144-Hz-Snapdragon-8%E2%80%91Speaker-Aluminum/dp/B0FC2HCN1Q/ref=sr_1_24" target="_blank" rel="nofollow" data-dimension112="87cdee2e-0364-4768-babd-b0a523ea1fc2" data-action="Deal Block" data-label="Pad 3" data-dimension48="Pad 3" data-dimension25="$629">View Deal</a></p></div><p><em>For more discounts, check out our </em><a href="https://www.tomsguide.com/sales-events/31-cyber-week-deals-that-make-perfect-holiday-gifts-shop-apple-yeti-birkenstock-nintendo-and-more"><em>Cyber Week deals</em></a><em> guide.</em></p><h3 class="article-body__section" id="section-shop-last-minute-cyber-week-deals"><span>Shop last-minute Cyber Week deals</span></h3><ul><li><strong>Amazon: </strong><a href="https://www.amazon.com/b?node=210998206011" target="_blank" rel="nofollow"><strong>50% off Ring, Ninja, AirPods, more</strong></a><strong></strong></li><li><strong>Walmart: </strong><a href="https://www.walmart.com/shop/deals/cyber-monday" target="_blank" rel="nofollow"><strong>save on Crocs, Keurig, PS5</strong></a></li><li><strong>REI: </strong><a href="https://www.rei.com/f/scd-deals" target="_blank" rel="nofollow"><strong>half-off Arc'teryx, Patagonia, more</strong></a><strong></strong></li><li><strong>Dell: </strong><a href="https://www.dell.com/en-us/shop/deals?sortBy=price-ascending" target="_blank" rel="nofollow"><strong>monitors from $79/laptops from $249</strong></a><strong></strong></li><li><strong>Nectar: </strong><a href="https://www.nectarsleep.com/" target="_blank" rel="nofollow"><strong>50% off mattresses + bundles</strong></a></li><li><strong>Best Buy: </strong><a href="https://www.bestbuy.com/site/all-electronics-on-sale/all-computers-tablets-on-sale/pcmcat1632941704767.c?id=pcmcat1632941704767" target="_blank" rel="nofollow"><strong>laptops from $149</strong></a><strong></strong></li><li><strong>Lenovo: </strong><a href="https://www.lenovo.com/us/en/d/deals/laptops/?IPromoID=LEN380027&sortBy=priceUp" target="_blank" rel="nofollow"><strong>doorbuster deals from $319</strong></a><strong></strong></li><li><strong>Wayfair: </strong><a href="https://www.wayfair.com/daily-sales" target="_blank" rel="nofollow"><strong>up to 80% off home decor</strong></a><strong></strong></li><li><strong>Lululemon: </strong><a href="https://shop.lululemon.com/c/we-made-too-much/n18mhd?Ns=price%7C0" target="_blank" rel="nofollow"><strong>top picks from $9</strong></a></li><li><strong>Birkenstock: </strong><a href="https://www.nordstrom.com/browse/sale?sort=PercentOff&filterByBrand=birkenstock" target="_blank" rel="nofollow"><strong>deals from $20 @ Nordstrom</strong></a><strong></strong></li><li><strong>Saatva: </strong><a href="https://www.saatva.com/mattresses/saatva-classic?utm_source=futurepublishing&utm_medium=affiliate&coupon=awyqqgzvxqicebab" target="_blank" rel="nofollow"><strong>luxury mattresses from $1,099</strong></a><strong></strong></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The best Samsung tablet to buy in 2026: Our 3 expert picks, fully tested ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Samsung makes many of the best tablets on the market, offering gorgeous displays with lightweight, easy-to-use designs, sometimes at a fraction of the cost of its iPad rivals. If you're considering a Samsung tablet, we've done the hands-on testing to help you decide which one suits you best in this guide. </p><p>The <a href="#elk-fb1befcc-a08e-11f1-8917-51123cd74262">Galaxy Tab S10 FE Plus</a> is our top choice for most people, combining a large display, strong battery life and an included stylus at a more accessible price. It may be older, but it still delivers the full Samsung experience. If you want a lighter premium option, the <a href="#elk-fb1bf300-a08e-11f1-90fd-8dffb54664c5">Galaxy Tab S11</a> delivers a sleek design, a compact 11-inch AMOLED screen and amazing battery life at over 15 hours.</p><p>Prefer a larger display? Samsung makes the biggest around, and the recent <a href="#elk-fb1bf4fe-a08e-11f1-b24c-471c66812bfc">Galaxy Tab S12 Ultra</a> is our top choice thanks to its massive 14.6-inch OLED panel and strong performance. In this guide, I'll bring our expert advice and in-depth reviews on the best Samsung tablets worth buying today. </p><h2 id="the-best-samsung-tablets-you-can-buy-right-now">The best Samsung tablets you can buy right now</h2><h3 class="article-body__section" id="section-best-samsung-tablet-overall"><span>Best Samsung tablet overall</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="pkVy4Jyo2ZePK4cqLwuX9H" name="Galaxy Tab S10 FE Plus-03" alt="Samsung Galaxy Tab S10 FE Plus" src="https://cdn.mos.cms.futurecdn.net/pkVy4Jyo2ZePK4cqLwuX9H-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" class="inline"><img id="WqLzPy4iPS8qbMqK42dYLY" class="endorsement-img endorsement-bottom-right" style="max-width: 100px; max-height: 100px;" src="https://cdn.mos.cms.futurecdn.net/WqLzPy4iPS8qbMqK42dYLY-1920-80.png" name="TG_badges_Recommended.png" alt="Tom's Guide Recommended product badge"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><div class="buying-guide-block"><h3 id="1-samsung-galaxy-tab-s10-fe-plus"><span class="title__text"><a href="https://www.tomsguide.com/computing/android-tablets/samsung-galaxy-tab-s10-fe-plus-review">1. Samsung Galaxy Tab S10 FE Plus</a></span><span class="chunk rating"><span class="icon icon-star"> </span><span class="icon icon-star"> </span><span class="icon icon-star"> </span><span class="icon icon-star"> </span></span></h3><div class="_hawk subtitle"><p>The best Samsung tablet for most people</p></div><p class="specs__container"><strong>CPU: </strong>Exynos 1580 | <strong>Display: </strong>13.1-inch AMOLED | <strong>Storage: </strong>128GB, 256GB, microSD support up to 2TB | <strong>Memory: </strong>8GB, 12GB | <strong>Ports: </strong>USB-C, microSD | <strong>Dimensions: </strong>7.67 x 11.83 x 0.24 inches | <strong>Weight: </strong>1.5 pounds</p><div class="hawk-wrapper"></div><div class="icon icon-plus_circle _hawk">Great value for money</div><div class="icon icon-plus_circle _hawk">Large</div><div class="icon icon-plus_circle _hawk">Surprisingly good battery life</div><div class="icon icon-plus_circle _hawk">Seven years of updates</div><div class="icon icon-minus_circle _hawk">Low-powered chipset</div><div class="icon icon-minus_circle _hawk">Lacks Galaxy AI features</div></div><p>The Samsung Galaxy Tab S10 FE Plus really impressed us with what you get for your money. The large 13.1-inch display makes it ideal for streaming and watching videos, since it's bright at 782 nits peak brightness and super vivid, making the colors pop even more.</p><p>Most surprisingly, it has stereo speakers, too. Normally, the small space for audio means you get tinny speakers, but in our testing, there's a nice warm, bassy punch alongside all the details being represented nicely across the sound space.</p><p>Then throw in that big battery for all-day use (lasting 15 hours and 43 minutes in our test), and you've got something with real staying power across all your films, web browsing and casual gaming.</p><p>Notice how I said casual gaming? The chip inside is certainly not the most powerful for intense tasks. Under significant pressure, you can see slowdown, but if your use cases are casual (ie, not editing videos or playing AAA games), you won't see it break a sweat.</p><p>Throw in that included stylus for whenever you're feeling creative, a decent camera system for video calls and snapping quick pics, and One UI 8 (launched in October 2025) for a great tablet experience, and a price less than $500, and you're onto a winner.</p><ul><li><em><strong>Read our full </strong></em><a href="https://www.tomsguide.com/computing/android-tablets/samsung-galaxy-tab-s10-fe-plus-review"><em><strong>Samsung Galaxy Tab S10 FE Plus review</strong></em></a></li></ul><h3 class="article-body__section" id="section-best-ipad-alternative-samsung-tablet"><span>Best iPad alternative Samsung tablet </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:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="iWBHTgsrPbipQ8kxWitP8b" name="PXL_20250828_111649247" alt="Samsung Galaxy Tab S11 display" src="https://cdn.mos.cms.futurecdn.net/iWBHTgsrPbipQ8kxWitP8b-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" class=""><img id="WqLzPy4iPS8qbMqK42dYLY" class="endorsement-img endorsement-bottom-right" style="max-width: 100px; max-height: 100px;" src="https://cdn.mos.cms.futurecdn.net/WqLzPy4iPS8qbMqK42dYLY-1920-80.png" name="TG_badges_Recommended.png" alt="Tom's Guide Recommended product badge"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><div class="buying-guide-block"><h3 id="2-samsung-galaxy-tab-s11"><span class="title__text"><a href="https://www.tomsguide.com/computing/android-tablets/samsung-galaxy-tab-s11-review">2. Samsung Galaxy Tab S11</a></span></h3><div class="_hawk subtitle"><p>The best Samsung tablet to rival Apple's iPad</p></div><p class="specs__container"><strong>CPU: </strong>MediaTek Dimensity 9400+ | <strong>Display: </strong>11-inch Dynamic AMOLED 2X (2560 x 1600) | <strong>Storage: </strong>256GB | <strong>Memory: </strong>12GB | <strong>Ports: </strong>1x USB-C | <strong>Dimensions: </strong>9.99 x 6.51 x 0.22 inches | <strong>Weight: </strong>1.06 pounds</p><div class="hawk-wrapper"></div><div class="icon icon-plus_circle _hawk">Speedy performance</div><div class="icon icon-plus_circle _hawk">Massive 14-inch AMOLED looks fantastic</div><div class="icon icon-plus_circle _hawk">Included stylus is a nice touch</div><div class="icon icon-minus_circle _hawk">Costs almost the same as iPad Pro, performs worse</div><div class="icon icon-minus_circle _hawk">Size makes use as a tablet awkward</div></div><p>This is the closest Android kin to the <a href="https://www.tomsguide.com/best-picks/best-ipad">best iPads</a> you can buy — providing a top shot at getting the Apple experience while avoiding iOS. And it does so by pairing zippy performance and a gorgeous display with a sleek, lightweight design and a top-notch OS.</p><p>On the face of it, this feels <em>very </em>iPad Air with super slim dimensions and a weight that just breaks one pound. It feels great in the hand, and that aluminum frame gives a nice durable confidence too.</p><p>Then you turn it on and are greeted by that mesmerizing 11-inch AMOLED display with 1,600 nits of peak brightness. Whether you're getting stuff done or binge-watching in bed, that sharpness, smoothness and vivid color make everything pop off the screen. The processor is more than capable of handling everyday tasks like web browsing, emails and streaming, but also means you can properly game and video edit without too much trouble. Plus, the built-in speakers are rather good. </p><p>Then there's the redesigned S Pen — feeling much more comfortable to hold with a hexagonal barrel to get a solid grip on for all your doodling. And in that vein of getting stuff done, Samsung's made some impressive upgrades to DeX mode too, which can extend this into an almost desktop-like experience. So if you need to lock in with a keyboard and mouse to work hard, the S11 nails it.</p><p>Throw in the ocean of Android tablet apps, Google Gemini integration and impressive speed even under multitasking pressure (plus that massive 8,400 mAh battery) and you've got a banger.</p><ul><li><em><strong>Read our </strong></em><a href="https://www.tomsguide.com/computing/android-tablets/samsung-galaxy-tab-s11-review"><em><strong>Samsung Galaxy Tab S11 review</strong></em></a></li></ul><h3 class="article-body__section" id="section-the-best-samsung-tablet-for-power-users"><span>The best Samsung tablet for power users</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YHb7i2SCuxbWHULRtcWkL4" name="Samsung Galaxy Tab S12 Ultra-5" alt="Samsung Galaxy Tab S12 Ultra" src="https://cdn.mos.cms.futurecdn.net/YHb7i2SCuxbWHULRtcWkL4-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" class=""><img id="WqLzPy4iPS8qbMqK42dYLY" class="endorsement-img endorsement-bottom-right" style="max-width: 100px; max-height: 100px;" src="https://cdn.mos.cms.futurecdn.net/WqLzPy4iPS8qbMqK42dYLY-1920-80.png" name="TG_badges_Recommended.png" alt="Tom's Guide Recommended product badge"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><div class="buying-guide-block"><h3 id="3-samsung-galaxy-tab-s12-ultra"><span class="title__text"><a href="https://www.tomsguide.com/computing/android-tablets/samsung-galaxy-tab-s12-ultra-review">3.  Samsung Galaxy Tab S12 Ultra</a></span><span class="chunk rating"><span class="icon icon-star"> </span><span class="icon icon-star"> </span><span class="icon icon-star"> </span><span class="icon icon-star"> </span></span></h3><div class="_hawk subtitle"><p>The best Samsung tablet for pure size and power</p></div><p class="specs__container"><strong>CPU: </strong>MediaTek Dimensity 9500 | <strong>Display: </strong>14.6-inch (2960 x 1848) AMOLED | <strong>Storage: </strong>Up to 1TB | <strong>Memory: </strong>12GB | <strong>Ports: </strong>USB-C, microSD | <strong>Dimensions: </strong>12.8 x 8.2 x 0.2 inches | <strong>Weight: </strong>1.6 pounds</p><div class="hawk-wrapper"></div><div class="icon icon-plus_circle _hawk">Gorgeous 14.6-inch OLED panel</div><div class="icon icon-plus_circle _hawk">Sturdy and elegant lightweight design</div><div class="icon icon-plus_circle _hawk">Strong performance</div><div class="icon icon-plus_circle _hawk">Long battery life</div><div class="icon icon-minus_circle _hawk">$200 price hike</div><div class="icon icon-minus_circle _hawk">DeX Mode requires an external monitor</div></div><p>The Samsung Galaxy Tab S12 Ultra takes what worked for last year’s Ultra model and makes it even more compelling for anyone eyeing up an enormous display: you get a huge 14.6-inch OLED display and an upgraded MediaTek Dimensity 9500 processor, giving you not just more workspace but more muscle for demanding tasks. As our reviewer, Tony, puts it, it's the best Android tablet yet — but you'll be paying a lot for it. </p><p>Yes, this is one massive display, but that's not all it has going for it. In our hands-on experience, it’s among the best OLEDs you’ll find on any tablet, with rich contrast and detail that make both deep work and downtime a pleasure. For instance, when watching a nature documentary, we found animals and landscapes pop with lifelike vibrancy. That's a real premium movie-watching slate.</p><p>Performance-wise, it’s robust enough to handle multitasking and intensive apps without slowing down, whether you’re juggling slides, spreadsheets or a dozen Chrome tabs. It's not quite enough to fully replace one of the <a href="https://www.tomsguide.com/computing/laptops/best-laptops">best laptops</a>, especially since <a href="https://www.tomsguide.com/computing/android-tablets/i-ditched-my-laptop-for-the-samsung-galaxy-tab-s11-ultra-heres-what-happened">Samsung's DeX Mode</a> only works with an external monitor, but it's enough to use more demanding apps. </p><p>Battery life lands at 11 hours and 31 minutes in our testing, which is respectable for a screen this size, though it trails the <a href="#elk-fb1befcc-a08e-11f1-8917-51123cd74262">S10 FE Plus</a>’s impressive 15:43 and is just behind the <a href="#elk-fb1bf300-a08e-11f1-90fd-8dffb54664c5">S11</a>. The trade-off for that extra screen real estate is a bit less stamina and a form factor that can feel cumbersome on the go, especially if you’re comparing to more compact options</p><p>Now, if your expectation is a seamless, laptop-replacement type switch, keep in mind that while the S12 Ultra makes work on the go possible and even enjoyable, it’s not a flawless laptop replacement. That said, for multitaskers who want a mighty and big tablet that can be used as a work machine, the Galaxy Tab S12 Ultra is our top Samsung pick.</p><ul><li><em><strong>Read our full </strong></em><a href="https://www.tomsguide.com/computing/android-tablets/samsung-galaxy-tab-s12-ultra-review"><em><strong>Samsung Galaxy Tab S12 Ultra review</strong></em></a></li></ul><h3 class="article-body__section" id="section-battery-life-test-results"><span>Battery life test results</span></h3><p>Despite having OLED displays and thin, lightweight designs, Samsung tablets have some of the best battery life we've tested. Each of our recommendations last over 9 hours, which is more than enough for long-haul trips or days out running between classes or the office.</p><p>Even the likes of the <a href="https://www.tomsguide.com/computing/ipads/apple-ipad-air-m4-review-small-tweaks-to-the-gold-standard">iPad Air M4</a>, one of the best iPads to get, can't keep up with Samsung's offerings. Check out how long each of our Samsung picks last. Just keep in mind that battery life depends on what you're using a tablet for: if you're playing demanding games on it all day, battery won't last as long!</p><div class="vizualizer-embed"><style>@import url('https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;700&display=swap');@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;700&display=swap');#fv-chart-1790850863761-ex8omnlta *, #fv-chart-1790850863761-ex8omnlta *:before, #fv-chart-1790850863761-ex8omnlta *:after, #fv-chart-1790850863761-ex8omnlta-slideshow *, #fv-chart-1790850863761-ex8omnlta-slideshow *:before, #fv-chart-1790850863761-ex8omnlta-slideshow *:after {box-sizing: border-box !important; margin: 0; padding: 0; border: 0;font-size: 100%; font: inherit; vertical-align: baseline;}#fv-chart-1790850863761-ex8omnlta, #fv-chart-1790850863761-ex8omnlta-slideshow { font-family: 'Open Sans', sans-serif !important; }#fv-chart-1790850863761-ex8omnlta {position: relative !important; overflow: visible !important;--riv-primary: #0072C6;}#fv-chart-1790850863761-ex8omnlta .fv-inner-wrapper {color: #1F2937 !important; background-color: #ffffff !important;padding: 1.5rem 1.5rem 2rem !important; border-radius: 0.5rem !important;box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1) !important;margin: 1rem 0 !important; display: flex !important; flex-direction: column !important;overflow: hidden !important;}#fv-chart-1790850863761-ex8omnlta .fv-inner-wrapper.fv-no-header.fv-is-image-compare {padding-top: 0 !important;}#fv-chart-1790850863761-ex8omnlta.fv-full-bleed {width: 100vw !important;margin-left: calc(50% - 50vw) !important;}body {overflow-x: clip !important;}#fv-chart-1790850863761-ex8omnlta.fv-full-bleed .fv-inner-wrapper {padding: 0 !important;border-radius: 0 !important;box-shadow: none !important;margin: 0 !important;background-color: transparent !important;}#fv-chart-1790850863761-ex8omnlta .fv-inner-wrapper.fv-is-shop-the-look {padding: 0 !important;border-radius: 0 !important;box-shadow: none !important;margin: 0 !important;background-color: transparent !important;}#fv-chart-1790850863761-ex8omnlta-slideshow {position: relative !important;width: 100% !important;margin: 1rem 0 !important;--riv-primary: #0072C6;}#fv-chart-1790850863761-ex8omnlta-slideshow .fv-slides-wrapper {position: relative !important;width: 100% !important;}#fv-chart-1790850863761-ex8omnlta-slideshow .fv-slide {width: 100% !important;animation: fv-fade-in 0.3s ease-in-out;}@keyframes fv-fade-in {from { opacity: 0; }to { opacity: 1; }}#fv-chart-1790850863761-ex8omnlta-slideshow .fv-slideshow-nav-row {position: relative !important;display: flex !important;justify-content: space-between !important;align-items: center !important;padding: 0 0 16px 0 !important;width: 100% !important;z-index: 20 !important;}#fv-chart-1790850863761-ex8omnlta-slideshow .fv-nav-btn {background-color: var(--riv-primary) !important;color: #ffffff !important;border: none !important;border-radius: 4px !important;padding: 8px 16px !important;font-size: 14px !important;font-weight: 700 !important;cursor: pointer !important;display: flex !important;align-items: center !important;justify-content: center !important;gap: 6px !important;transition: opacity 0.2s, background-color 0.2s !important;height: 36px !important;text-transform: none !important;box-shadow: 0 1px 2px rgba(0,0,0,0.1) !important;}#fv-chart-1790850863761-ex8omnlta-slideshow .fv-nav-btn svg {width: 18px !important;height: 18px !important;stroke-width: 3px !important;filter: none !important;}#fv-chart-1790850863761-ex8omnlta-slideshow .fv-nav-btn:hover {opacity: 0.9 !important;transform: translateY(-1px) !important;}#fv-chart-1790850863761-ex8omnlta-slideshow .fv-nav-btn.disabled {background-color: #E5E7EB !important;color: #9CA3AF !important;cursor: default !important;pointer-events: none !important;box-shadow: none !important;}#fv-chart-1790850863761-ex8omnlta-slideshow .fv-slide-counter {font-family: 'Poppins', sans-serif !important;font-size: 14px !important;font-weight: 600 !important;color: #374151 !important;text-align: center !important;min-width: 40px !important;background-color: rgba(255,255,255,0.8) !important;padding: 2px 8px !important;border-radius: 10px !important;}#fv-chart-1790850863761-ex8omnlta-slideshow .fv-slideshow-select {position: absolute !important;top: 10px !important;right: 10px !important;z-index: 20 !important;appearance: none !important;-webkit-appearance: none !important;-moz-appearance: none !important;background-color: white !important;border: 1px solid #d1d5db !important;color: #1F2937 !important;font-family: 'Open Sans', sans-serif !important;font-size: 14px !important;font-weight: 600 !important;padding: 6px 32px 6px 12px !important;border-radius: 4px !important;cursor: pointer !important;box-shadow: 0 1px 2px rgba(0,0,0,0.05) !important;background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e") !important;background-position: right 0.5rem center !important;background-repeat: no-repeat !important;background-size: 1.5em 1.5em !important;}#fv-chart-1790850863761-ex8omnlta-slideshow .fv-slideshow-select:focus {outline: 2px solid #0072C6 !important;border-color: #0072C6 !important;}#fv-chart-1790850863761-ex8omnlta .fv-chart-title {font-weight: bold !important;text-align: center !important;margin-bottom: 0.5rem !important;color: var(--riv-primary) !important;font-size: 20px !important;line-height: 1.2 !important;font-family: 'Open Sans', sans-serif !important;text-transform: none !important;white-space: normal !important;overflow-wrap: break-word !important;padding: 0 20px !important;}#fv-chart-1790850863761-ex8omnlta .fv-chart-subhead {font-size: 18px !important;font-weight: 500 !important;text-align: center !important;margin-bottom: 2rem !important;color: #374151 !important;line-height: 1.7 !important;font-family: 'Open Sans', sans-serif !important;display: block !important;text-transform: none !important;padding: 0 20px !important;}#fv-chart-1790850863761-ex8omnlta .rv-chart-caption { font-size: 15px !important; color: #374151 !important; text-align: center !important; font-style: normal !important; font-weight: normal !important; line-height: 1.7 !important; font-family: 'Open Sans', sans-serif !important; display: block !important; }#fv-chart-1790850863761-ex8omnlta .fv-versus-chart { display: flex; flex-direction: column; width: 100%; margin-top: 1rem; }#fv-chart-1790850863761-ex8omnlta .fv-versus-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1.5rem; padding: 0 1rem; }#fv-chart-1790850863761-ex8omnlta .fv-versus-select-wrapper { flex: 1; min-width: 0; }#fv-chart-1790850863761-ex8omnlta .fv-versus-select-wrapper.fv-left { text-align: center; padding-right: 1rem; }#fv-chart-1790850863761-ex8omnlta .fv-versus-select-wrapper.fv-right { text-align: center; padding-left: 1rem; }#fv-chart-1790850863761-ex8omnlta .fv-versus-select-container { position: relative; display: inline-block; max-width: 100%; width: 100%; }#fv-chart-1790850863761-ex8omnlta .fv-versus-chevron { position: absolute; top: 50%; transform: translateY(-50%); pointer-events: none; width: 16px; height: 16px; flex-shrink: 0; }#fv-chart-1790850863761-ex8omnlta .fv-versus-select-wrapper.fv-left .fv-versus-chevron { right: 0; }#fv-chart-1790850863761-ex8omnlta .fv-versus-select-wrapper.fv-right .fv-versus-chevron { right: 0; }#fv-chart-1790850863761-ex8omnlta .fv-versus-select { background: transparent; border: none; border-bottom: 2px solid; font-family: 'Poppins', sans-serif; font-weight: 700; font-size: 14px; padding: 0.25rem 0; cursor: pointer; outline: none; appearance: none; -webkit-appearance: none; -moz-appearance: none; max-width: 100%; width: 100%; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; }#fv-chart-1790850863761-ex8omnlta .fv-versus-select.fv-select-left { text-align: center; direction: ltr; padding-right: 1.25rem; }#fv-chart-1790850863761-ex8omnlta .fv-versus-select.fv-select-right { text-align: center; padding-right: 1.25rem; }#fv-chart-1790850863761-ex8omnlta .fv-versus-select option { font-family: 'Open Sans', sans-serif; font-weight: 400; font-size: 14px; color: #374151; direction: ltr; text-align: left; }#fv-chart-1790850863761-ex8omnlta .fv-versus-vs { font-family: 'Poppins', sans-serif; font-weight: 700; font-size: 14px; color: #374151; letter-spacing: 0.1em; padding: 0 1rem; }#fv-chart-1790850863761-ex8omnlta .fv-versus-body { display: flex; flex-direction: column; gap: 1.5rem; }#fv-chart-1790850863761-ex8omnlta .fv-versus-row { position: relative; height: auto; padding-top: 20px; margin-bottom: 0.25rem; display: block; }#fv-chart-1790850863761-ex8omnlta .fv-versus-bar-container { position: relative; height: 32px; display: flex; align-items: center; }#fv-chart-1790850863761-ex8omnlta .fv-versus-bar-left-wrapper { flex: 1; height: 100%; display: flex; justify-content: flex-end; align-items: center; }#fv-chart-1790850863761-ex8omnlta .fv-versus-bar-right-wrapper { flex: 1; height: 100%; display: flex; justify-content: flex-start; align-items: center; }#fv-chart-1790850863761-ex8omnlta .fv-versus-bar { height: 32px; width: var(--target-width); transition: width 0.8s ease-out; animation: fv-grow-max-width 0.8s ease-out forwards; display: flex; align-items: center; overflow: hidden; color: #ffffff; }#fv-chart-1790850863761-ex8omnlta .fv-versus-bar-left { border-radius: 4px 0 0 4px; justify-content: flex-end; padding: 0 8px; }#fv-chart-1790850863761-ex8omnlta .fv-versus-bar-right { border-radius: 0 4px 4px 0; justify-content: flex-start; padding: 0 8px; }@keyframes fv-grow-max-width {from { max-width: 0; }to { max-width: 100%; }}#fv-chart-1790850863761-ex8omnlta .fv-versus-center-line { position: absolute; left: 50%; top: 0; bottom: 0; width: 4px; background-color: #ffffff; transform: translateX(-50%); z-index: 1; }#fv-chart-1790850863761-ex8omnlta .fv-inside-left { white-space: nowrap; flex-shrink: 0; }#fv-chart-1790850863761-ex8omnlta .fv-inside-right { white-space: nowrap; flex-shrink: 0; }#fv-chart-1790850863761-ex8omnlta .fv-versus-val-text { font-family: 'Poppins', sans-serif; font-weight: 700; font-size: 14px; }#fv-chart-1790850863761-ex8omnlta .fv-versus-pct-diff { font-size: 12px; font-weight: 600; }#fv-chart-1790850863761-ex8omnlta .fv-versus-label { position: absolute; left: 50%; transform: translateX(-50%); top: 0; background-color: transparent; border: none; box-shadow: none; padding: 0; font-family: 'Open Sans', sans-serif; font-weight: 700; font-size: 14px; color: #374151; white-space: nowrap; }#fv-chart-1790850863761-ex8omnlta .sr-only { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0,0,0,0) !important; white-space: nowrap !important; border: 0 !important; }#fv-chart-1790850863761-ex8omnlta .fv-bottom-bar { display: flex !important; flex-direction: column !important; align-items: center !important; margin-top: 0.5rem !important; gap: 1rem !important; }#fv-chart-1790850863761-ex8omnlta .fv-footer-content { text-align: center !important; width: 100% !important; }#fv-chart-1790850863761-ex8omnlta .fv-logo {display: block !important;margin: 0 auto !important;width: 120px !important;min-width: 120px !important;max-width: 120px !important;height: auto !important;object-fit: contain !important;flex-shrink: 0 !important;}#fv-chart-1790850863761-ex8omnlta .fv-dropdown-wrapper { text-align: center !important; margin-bottom: 16px !important; margin-top: 0 !important; }#fv-chart-1790850863761-ex8omnlta .fv-dropdown-title-container { position: relative !important; display: inline-block !important; max-width: 100% !important; }#fv-chart-1790850863761-ex8omnlta .fv-dropdown-title {appearance: none !important;-webkit-appearance: none !important;-moz-appearance: none !important;background: transparent !important;border: none !important;font-size: 18px !important;font-weight: 600 !important;color: var(--riv-primary) !important;padding-right: 28px !important;padding-left: 10px !important;cursor: pointer !important;text-align: center !important;text-align-last: center !important;width: auto !important;max-width: 100% !important;font-family: 'Open Sans', sans-serif !important;line-height: 1.3 !important;margin: 0 !important;text-overflow: ellipsis !important;overflow: hidden !important;white-space: nowrap !important;}#fv-chart-1790850863761-ex8omnlta .fv-dropdown-title:focus { outline: none !important; }#fv-chart-1790850863761-ex8omnlta .fv-dropdown-title::-ms-expand { display: none !important; }#fv-chart-1790850863761-ex8omnlta .fv-dropdown-chevron {position: absolute !important;right: 0 !important;top: 50% !important;transform: translateY(-50%) !important;pointer-events: none !important;color: var(--riv-primary) !important;display: flex !important;align-items: center !important;}#fv-chart-1790850863761-ex8omnlta .fv-carousel-title-controls { display: flex !important; justify-content: space-between !important; align-items: center !important; margin-bottom: 16px !important; width: 100% !important; gap: 12px !important; }#fv-chart-1790850863761-ex8omnlta .fv-carousel-nav-btn {background: transparent !important; border: 1px solid #d1d5db !important; border-radius: 6px !important; padding: 6px 10px !important;cursor: pointer !important; font-size: 14px !important; color: #374151 !important; display: flex !important; align-items: center !important; gap: 4px !important; font-family: 'Open Sans', sans-serif !important;}#fv-chart-1790850863761-ex8omnlta .fv-carousel-nav-btn:hover { border-color: #9ca3af !important; }#fv-chart-1790850863761-ex8omnlta .fv-carousel-counter { font-size: 14px !important; color: #374151 !important; text-align: center !important; margin-top: 1rem !important; }#fv-chart-1790850863761-ex8omnlta .fv-legend { display: flex !important; justify-content: center !important; flex-wrap: wrap !important; gap: 8px 16px !important; margin: 0 !important; padding: 0 !important; margin-top: 1rem !important; }#fv-chart-1790850863761-ex8omnlta .fv-legend-item { display: flex !important; align-items: center !important; gap: 6px !important; font-size: 14px !important; color: #374151 !important; }#fv-chart-1790850863761-ex8omnlta .fv-legend-color { width: 12px !important; height: 12px !important; border-radius: 3px !important; }#fv-chart-1790850863761-ex8omnlta .fv-multi-value-legend {display: flex !important;justify-content: center !important;flex-wrap: wrap !important;gap: 12px 24px !important;margin-bottom: 1.5rem !important;padding: 0 !important;}#fv-chart-1790850863761-ex8omnlta .fv-multi-legend-item { display: flex !important; align-items: center !important; gap: 8px !important; font-size: 14px !important; color: #374151 !important; font-weight: 500 !important; }#fv-chart-1790850863761-ex8omnlta .fv-multi-legend-swatch { width: 16px !important; height: 16px !important; border-radius: 3px !important; }#fv-chart-1790850863761-ex8omnlta .fv-benchmark-group { margin-bottom: 1rem !important; }#fv-chart-1790850863761-ex8omnlta .fv-benchmark-title {font-size: 18px !important; font-weight: 600 !important; margin-bottom: 16px !important; margin-top: 0 !important; padding: 0 !important;text-align: center !important; color: var(--riv-primary) !important; flex: 1 !important; min-width: 0 !important;font-family: 'Open Sans', sans-serif !important; line-height: 1.3 !important;text-transform: none !important;white-space: normal !important;overflow-wrap: break-word !important;word-wrap: break-word !important;max-width: 100% !important;}#fv-chart-1790850863761-ex8omnlta .fv-bar-row, #fv-chart-1790850863761-ex8omnlta .fv-stacked-product { display: flex !important; align-items: center !important; width: 100% !important; margin-bottom: 0.75rem !important; position: relative !important; }#fv-chart-1790850863761-ex8omnlta .fv-bar-label { width: 150px !important; flex-shrink: 0 !important; font-size: 14px !important; color: #374151 !important; padding-right: 10px !important; text-align: right !important; font-weight: 500 !important; display: block !important; }#fv-chart-1790850863761-ex8omnlta .fv-bar-container { flex-grow: 1 !important; background-color: #E5E7EB !important; border-radius: 4px !important; min-height: 25px !important; border: 1px solid #D1D5DB !important; position: relative !important; display: flex !important; align-items: center !important; }#fv-chart-1790850863761-ex8omnlta .fv-bar-commentary-inline { display: none !important; position: absolute !important; left: 150px !important; top: 0 !important; bottom: 0 !important; right: 0 !important; width: calc(100% - 150px) !important; margin: 0 !important; padding: 0 8px !important; font-size: 13px !important; color: #fff !important; background: rgba(0,0,0,0.8) !important; border-radius: 4px !important; line-height: 1.4 !important; font-weight: normal !important; text-transform: none !important; word-wrap: break-word !important; z-index: 10 !important; align-items: center !important; overflow-y: auto !important; }#fv-chart-1790850863761-ex8omnlta.preview-wrapper .fv-bar-row:hover .fv-bar-commentary-inline, #fv-chart-1790850863761-ex8omnlta.preview-wrapper .fv-bar-commentary-inline:focus, #fv-chart-1790850863761-ex8omnlta.preview-wrapper .fv-bar-commentary-inline:focus-within, #fv-chart-1790850863761-ex8omnlta.mobile-view .fv-bar-row:hover .fv-bar-commentary-inline, #fv-chart-1790850863761-ex8omnlta.mobile-view .fv-bar-commentary-inline:focus, #fv-chart-1790850863761-ex8omnlta.mobile-view .fv-bar-commentary-inline:focus-within { display: flex !important; }#fv-chart-1790850863761-ex8omnlta .fv-bar { height: 100% !important; border-radius: 3px !important; display: flex !important; align-items: center !important; transition: opacity 0.2s ease, width 0.8s ease-out !important; min-height: 23px !important; }#fv-chart-1790850863761-ex8omnlta .fv-bar:hover { opacity: 0.8 !important; }#fv-chart-1790850863761-ex8omnlta .fv-bar-inner-content { display: flex !important; justify-content: space-between !important; align-items: center !important; width: 100% !important; height: 100% !important; padding: 0 8px !important; font-size: 14px !important; font-weight: bold !important; overflow: hidden !important; }#fv-chart-1790850863761-ex8omnlta .fv-bar-inner-label { white-space: nowrap !important; overflow: hidden !important; text-overflow: ellipsis !important; padding-right: 8px !important; }#fv-chart-1790850863761-ex8omnlta .fv-bar-inner-value { flex-shrink: 0 !important; }#fv-chart-1790850863761-ex8omnlta .fv-bar-value-outside { padding-left: 8px !important; font-size: 14px !important; font-weight: bold !important; color: #374151 !important; white-space: nowrap !important; }#fv-chart-1790850863761-ex8omnlta .fv-bar-label.fv-primary-product { font-weight: bold !important; color: var(--riv-primary) !important; }#fv-chart-1790850863761-ex8omnlta .fv-multi-bar-container { flex-direction: column !important; padding: 4px !important; align-items: stretch !important; gap: 4px !important; height: auto !important; }#fv-chart-1790850863761-ex8omnlta .fv-multi-bar-item { display: flex !important; align-items: center !important; height: 25px !important; width: 100% !important; }#fv-chart-1790850863761-ex8omnlta .fv-stacked-bar { display: flex !important; overflow: hidden !important; }#fv-chart-1790850863761-ex8omnlta .fv-stacked-segment { height: 100% !important; display: flex !important; align-items: center !important; justify-content: flex-end !important; padding-right: 8px !important; border-right: 1px solid rgba(255,255,255,0.3) !important; }#fv-chart-1790850863761-ex8omnlta .fv-stacked-segment:last-child { border-right: none !important; }#fv-chart-1790850863761-ex8omnlta .fv-segment-value { font-size: 14px !important; font-weight: bold !important; }#fv-chart-1790850863761-ex8omnlta .fv-grouped-bar-product { display: flex !important; flex-direction: column !important; width: 100% !important; margin-bottom: 1.25rem !important; }#fv-chart-1790850863761-ex8omnlta .fv-grouped-product-title-wrapper { padding-left: 150px !important; }#fv-chart-1790850863761-ex8omnlta .fv-grouped-product-title { width: 100% !important; text-align: left !important; padding-right: 0 !important; margin-bottom: 0.5rem !important; font-weight: 700 !important; font-size: 14px !important; color: #374151 !important; text-transform: none !important; }#fv-chart-1790850863761-ex8omnlta .fv-bar-cluster { width: 100% !important; flex-grow: 1 !important; display: flex !important; flex-direction: column !important; }#fv-chart-1790850863761-ex8omnlta .fv-bar-cluster .fv-bar-row { margin-bottom: 3px !important; }#fv-chart-1790850863761-ex8omnlta .fv-bar-cluster .fv-bar-container { height: 20px !important; }#fv-chart-1790850863761-ex8omnlta .riv-grid line {stroke: #D1D5DB !important;stroke-dasharray: 3 3 !important;}#fv-chart-1790850863761-ex8omnlta .fv-x-axis-wrapper { display: flex !important; width: 100% !important; margin-top: 0.5rem !important; }#fv-chart-1790850863761-ex8omnlta .fv-x-axis-label-space { width: 150px !important; padding-right: 10px !important; flex-shrink: 0 !important; }#fv-chart-1790850863761-ex8omnlta .fv-x-axis-chart-space { flex-grow: 1 !important; padding-right: 8px !important; }#fv-chart-1790850863761-ex8omnlta .fv-x-axis-wrapper.fv-grouped-x-axis { margin-left: 0 !important; }#fv-chart-1790850863761-ex8omnlta .fv-x-axis-line { border-top: 1px solid #D1D5DB !important; }#fv-chart-1790850863761-ex8omnlta .fv-x-axis-ticks { display: flex !important; justify-content: space-between !important; padding-top: 4px !important; font-size: 13px !important; color: #374151 !important; }#fv-chart-1790850863761-ex8omnlta .fv-x-axis-ticks span { position: relative !important; }#fv-chart-1790850863761-ex8omnlta .fv-x-axis-ticks span::before { content: '' !important; position: absolute !important; top: -6px !important; left: 50% !important; transform: translateX(-50%) !important; width: 2px !important; height: 4px !important; background-color: #D1D5DB !important; border-radius: 1px !important; }#fv-chart-1790850863761-ex8omnlta .fv-x-axis-unit { text-align: center !important; font-size: 14px !important; color: #374151 !important; margin-top: 8px !important; display: block !important; }#fv-chart-1790850863761-ex8omnlta .fv-x-axis-title { text-align: center !important; font-size: 15px !important; color: #374151 !important; margin-top: 8px !important; margin-bottom: 16px !important; line-height: 1.5 !important; padding: 0 1rem !important; display: block !important; font-weight: bold !important; }#fv-chart-1790850863761-ex8omnlta .fv-y-axis-title {font-size: 15px !important;color: #374151 !important;line-height: 1.5 !important;text-align: left !important;padding-left: 5.83% !important;margin-bottom: 4px !important;display: block !important;font-weight: bold !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-pie-container,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-pie-container {flex-direction: column !important; gap: 1rem !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-grouped-product-title-wrapper,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-grouped-product-title-wrapper {padding-left: 0 !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-bar-row,#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-stacked-product,#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-grouped-bar-product,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-bar-row,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-stacked-product,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-grouped-bar-product {flex-direction: column !important; align-items: flex-start !important; margin-bottom: 1.25rem !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-bar-label:not(.fv-grouped-product-title),#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-bar-label:not(.fv-grouped-product-title) {width: 100% !important; text-align: left !important; padding-right: 0 !important; margin-bottom: 0.25rem !important; font-size: 14px !important; font-weight: 700 !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-bar-label,#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-grouped-product-title,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-bar-label,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-grouped-product-title {width: 100% !important; text-align: left !important; padding-right: 0 !important; margin-bottom: 0.25rem !important; font-size: 14px !important; font-weight: 700 !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-bar-container,#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-bar-cluster,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-bar-container,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-bar-cluster {width: 100% !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-bar-row .fv-bar-commentary-inline,#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-bar-row:hover .fv-bar-commentary-inline,#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-bar-row .fv-bar-commentary-inline:focus,#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-bar-row .fv-bar-commentary-inline:focus-within,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-bar-row .fv-bar-commentary-inline,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-bar-row:hover .fv-bar-commentary-inline,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-bar-row .fv-bar-commentary-inline:focus,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-bar-row .fv-bar-commentary-inline:focus-within {position: static !important; display: block !important; width: 100% !important; margin: 4px 0 0 0 !important; padding: 0 !important; background: transparent !important; color: #6B7280 !important; font-size: 12px !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-x-axis-wrapper,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-x-axis-wrapper {margin-left: 0 !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-x-axis-label-space,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-x-axis-label-space {display: none !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-x-axis-chart-space,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-x-axis-chart-space {padding-right: 0 !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-benchmark-title,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-benchmark-title {font-size: 16px !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-dropdown-title,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-dropdown-title {font-size: 16px !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-carousel-nav-btn,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-carousel-nav-btn {padding: 8px 12px !important; font-size: 14px !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-chart-title,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-chart-title {padding: 0 8px !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-chart-subhead,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-chart-subhead {padding: 0 8px !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-versus-header,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-versus-header {flex-direction: column !important; align-items: center !important; padding: 0 !important; gap: 0.5rem !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-versus-select-wrapper,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-versus-select-wrapper {flex: 1 !important; min-width: 0 !important; width: 100% !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-versus-select-wrapper.fv-left,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-versus-select-wrapper.fv-left {text-align: center !important; padding-right: 0 !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-versus-select-wrapper.fv-right,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-versus-select-wrapper.fv-right {text-align: center !important; padding-left: 0 !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-versus-select.fv-select-left,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-versus-select.fv-select-left {text-align: center !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-versus-select.fv-select-right,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-versus-select.fv-select-right {text-align: center !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-versus-vs,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-versus-vs {text-align: center !important; padding: 0.25rem 0 !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-versus-select-container,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-versus-select-container {max-width: 100% !important; width: 100% !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-versus-select,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-versus-select {font-size: 14px !important; width: 100% !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-stl-shop-all-btn,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-stl-shop-all-btn {bottom: 0.5rem !important; right: 0.5rem !important; height: 2rem !important; font-size: 0.75rem !important; padding: 0 0.75rem 0 2.5rem !important; max-width: calc(100% - 1rem) !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-stl-shop-all-logo,#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-stl-shop-all-icon,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-stl-shop-all-logo,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-stl-shop-all-icon {width: 2rem !important; height: 2rem !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-stl-shop-all-icon svg,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-stl-shop-all-icon svg {width: 14px !important; height: 14px !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-bar-commentary-inline,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-bar-commentary-inline {display: block !important; margin-left: 0 !important; width: 100% !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-y-axis-title { padding-left: 5% !important;  }#fv-chart-1790850863761-ex8omnlta.mobile-view.fv-contains-line-chart .fv-footer-content {margin-left: -1rem !important;margin-right: -1rem !important;}@media (max-width: 599px) {#fv-chart-1790850863761-ex8omnlta .fv-pie-container {flex-direction: column !important; gap: 1rem !important;}#fv-chart-1790850863761-ex8omnlta .fv-grouped-product-title-wrapper {padding-left: 0 !important;}#fv-chart-1790850863761-ex8omnlta .fv-bar-row,#fv-chart-1790850863761-ex8omnlta .fv-stacked-product,#fv-chart-1790850863761-ex8omnlta .fv-grouped-bar-product {flex-direction: column !important; align-items: flex-start !important; margin-bottom: 1.25rem !important;}#fv-chart-1790850863761-ex8omnlta .fv-bar-label:not(.fv-grouped-product-title) {width: 100% !important; text-align: left !important; padding-right: 0 !important; margin-bottom: 0.25rem !important; font-size: 14px !important; font-weight: 700 !important;}#fv-chart-1790850863761-ex8omnlta .fv-bar-label,#fv-chart-1790850863761-ex8omnlta .fv-grouped-product-title {width: 100% !important; text-align: left !important; padding-right: 0 !important; margin-bottom: 0.25rem !important; font-size: 14px !important; font-weight: 700 !important;}#fv-chart-1790850863761-ex8omnlta .fv-bar-container,#fv-chart-1790850863761-ex8omnlta .fv-bar-cluster {width: 100% !important;}#fv-chart-1790850863761-ex8omnlta .fv-bar-row .fv-bar-commentary-inline,#fv-chart-1790850863761-ex8omnlta .fv-bar-row:hover .fv-bar-commentary-inline,#fv-chart-1790850863761-ex8omnlta .fv-bar-row .fv-bar-commentary-inline:focus,#fv-chart-1790850863761-ex8omnlta .fv-bar-row .fv-bar-commentary-inline:focus-within {position: static !important; display: block !important; width: 100% !important; margin: 4px 0 0 0 !important; padding: 0 !important; background: transparent !important; color: #6B7280 !important; font-size: 12px !important;}#fv-chart-1790850863761-ex8omnlta .fv-x-axis-wrapper {margin-left: 0 !important;}#fv-chart-1790850863761-ex8omnlta .fv-x-axis-label-space {display: none !important;}#fv-chart-1790850863761-ex8omnlta .fv-x-axis-chart-space {padding-right: 0 !important;}#fv-chart-1790850863761-ex8omnlta .fv-benchmark-title {font-size: 16px !important;}#fv-chart-1790850863761-ex8omnlta .fv-dropdown-title {font-size: 16px !important;}#fv-chart-1790850863761-ex8omnlta .fv-carousel-nav-btn {padding: 8px 12px !important; font-size: 14px !important;}#fv-chart-1790850863761-ex8omnlta .fv-chart-title {padding: 0 8px !important;}#fv-chart-1790850863761-ex8omnlta .fv-chart-subhead {padding: 0 8px !important;}#fv-chart-1790850863761-ex8omnlta .fv-versus-header {flex-direction: column !important; align-items: center !important; padding: 0 !important; gap: 0.5rem !important;}#fv-chart-1790850863761-ex8omnlta .fv-versus-select-wrapper {flex: 1 !important; min-width: 0 !important; width: 100% !important;}#fv-chart-1790850863761-ex8omnlta .fv-versus-select-wrapper.fv-left {text-align: center !important; padding-right: 0 !important;}#fv-chart-1790850863761-ex8omnlta .fv-versus-select-wrapper.fv-right {text-align: center !important; padding-left: 0 !important;}#fv-chart-1790850863761-ex8omnlta .fv-versus-select.fv-select-left {text-align: center !important;}#fv-chart-1790850863761-ex8omnlta .fv-versus-select.fv-select-right {text-align: center !important;}#fv-chart-1790850863761-ex8omnlta .fv-versus-vs {text-align: center !important; padding: 0.25rem 0 !important;}#fv-chart-1790850863761-ex8omnlta .fv-versus-select-container {max-width: 100% !important; width: 100% !important;}#fv-chart-1790850863761-ex8omnlta .fv-versus-select {font-size: 14px !important; width: 100% !important;}#fv-chart-1790850863761-ex8omnlta .fv-stl-shop-all-btn {bottom: 0.5rem !important; right: 0.5rem !important; height: 2rem !important; font-size: 0.75rem !important; padding: 0 0.75rem 0 2.5rem !important; max-width: calc(100% - 1rem) !important;}#fv-chart-1790850863761-ex8omnlta .fv-stl-shop-all-logo,#fv-chart-1790850863761-ex8omnlta .fv-stl-shop-all-icon {width: 2rem !important; height: 2rem !important;}#fv-chart-1790850863761-ex8omnlta .fv-stl-shop-all-icon svg {width: 14px !important; height: 14px !important;}#fv-chart-1790850863761-ex8omnlta .fv-bar-commentary-inline {display: block !important; margin-left: 0 !important; width: 100% !important;}#fv-chart-1790850863761-ex8omnlta .fv-y-axis-title { padding-left: 5% !important;  }#fv-chart-1790850863761-ex8omnlta.fv-contains-line-chart .fv-footer-content {margin-left: -1rem !important;margin-right: -1rem !important;}}</style><script type="application/ld+json">{"@context": "https://schema.org","@type": "Dataset","name": "Best Samsung Tablets Battery life Test Results","description": "In our battery test, we set the tablet's display to 150 nits of brightness and have it endlessly browse the web via Wi-Fi until it runs out of juice.","creator": {"@type": "Organization","name": "Toms Guide","logo": "https://cdn.mos.cms.futurecdn.net/KE3tZBYLQsQv2fhtXgLkuL.png"},"isAccessibleForFree": true,"dateCreated": "2026-10-01T10:34:23.764Z","citation": "Add your caption to explain the data, the learnings and the key takeaways of the data being visualized","keywords": ["Samsung Galaxy Tab S10 FE Plus","Samsung Galaxy Tab S11","Samsung Galaxy Tab S12 Ultra","Battery life (hh:mm:ss)","benchmark","comparison","performance","review","Toms Guide"],"measurementTechnique": "Performance Benchmarking","variableMeasured": [{"@type": "PropertyValue","name": "Samsung Galaxy Tab S10 FE Plus – Battery life (hh:mm:ss)","value": 15.716666666666667,"unitText": "hours"},{"@type": "PropertyValue","name": "Samsung Galaxy Tab S11 – Battery life (hh:mm:ss)","value": 9.75,"unitText": "hours"},{"@type": "PropertyValue","name": "Samsung Galaxy Tab S12 Ultra – Battery life (hh:mm:ss)","value": 11.516666666666667,"unitText": "hours"}]}</script><div id="fv-chart-1790850863761-ex8omnlta" class="fv-chart-wrapper   " data-bar-labels-on-top="false" data-iframe-height="true" data-vizualizer-embed="true"><div class="fv-inner-wrapper    "><h3 class="fv-chart-title">Best Samsung Tablets Battery life Test Results</h3><p class="fv-chart-subhead">In our battery test, we set the tablet's display to 150 nits of brightness and have it endlessly browse the web via Wi-Fi until it runs out of juice.</p><div class="riv-chart-container"><div class="fv-chart-item" id="fv-chart-1790850863761-ex8omnlta-bar-Battery life (hh:mm:ss)" data-chart-type="Bar" data-title="Battery life (hh:mm:ss)" data-subhead="In our battery test, we set the tablet's display to 150 nits of brightness and have it endlessly browse the web via Wi-Fi until it runs out of juice." data-caption="" style=""><div class="fv-benchmark-group"><h4 class="fv-benchmark-title">Battery life (hh:mm:ss)</h4><div class="fv-bar-row"><div class="fv-bar-label ">Samsung Galaxy Tab S10 FE Plus</div><div class="fv-bar-container"><div class="fv-bar" style="margin-left: 0%; width: 78.58333333333334%; background-color: #0072C6;" data-target-width="78.58333333333334" data-target-margin="0"><div class="fv-bar-inner-content" style="color: #ffffff !important; text-shadow: 1px 1px 1px rgba(0,0,0,0.3) !important; flex-direction: row;"><span></span><span class="fv-bar-inner-value">15:43:00</span></div></div></div></div><div class="fv-bar-row"><div class="fv-bar-label ">Samsung Galaxy Tab S11</div><div class="fv-bar-container"><div class="fv-bar" style="margin-left: 0%; width: 48.75%; background-color: #F57C00;" data-target-width="48.75" data-target-margin="0"><div class="fv-bar-inner-content" style="color: #1F2937 !important; text-shadow: none !important; flex-direction: row;"><span></span><span class="fv-bar-inner-value">09:45:00</span></div></div></div></div><div class="fv-bar-row"><div class="fv-bar-label ">Samsung Galaxy Tab S12 Ultra</div><div class="fv-bar-container"><div class="fv-bar" style="margin-left: 0%; width: 57.58333333333334%; background-color: #388E3C;" data-target-width="57.58333333333334" data-target-margin="0"><div class="fv-bar-inner-content" style="color: #ffffff !important; text-shadow: 1px 1px 1px rgba(0,0,0,0.3) !important; flex-direction: row;"><span></span><span class="fv-bar-inner-value">11:31:00</span></div></div></div></div><div class="fv-x-axis-wrapper"><div class="fv-x-axis-label-space"></div><div class="fv-x-axis-chart-space"><div class="fv-x-axis-line"></div><div class="fv-x-axis-ticks"><span>0</span><span>5</span><span>10</span><span>15</span><span>20</span></div><div class="fv-x-axis-unit">hours</div></div></div><table class="sr-only"><caption>Battery life (hh:mm:ss) Data</caption><thead><tr><th>Product</th><th>Value</th></tr></thead><tbody><tr><td>Samsung Galaxy Tab S10 FE Plus</td><td>15.716666666666667</td></tr><tr><td>Samsung Galaxy Tab S11</td><td>9.75</td></tr><tr><td>Samsung Galaxy Tab S12 Ultra</td><td>11.516666666666667</td></tr></tbody></table></div></div></div><div class="fv-bottom-bar"><div class="fv-footer-content" style="display: none;"><div class="rv-chart-caption" style="display: block;"><span class="fv-original-caption" style="display: block;"></span><span class="fv-ia-dynamic-caption" style="display: none;"></span></div></div><div class="fv-logo-explore-bar"><img class="fv-logo" src="https://cdn.mos.cms.futurecdn.net/KE3tZBYLQsQv2fhtXgLkuL.png" alt="Toms Guide Logo"></div></div></div></div><script>window.iFrameResizer = {heightCalculationMethod: 'taggedElement'};</script><script src="https://cdnjs.cloudflare.com/ajax/libs/iframe-resizer/4.2.11/iframeResizer.contentWindow.min.js" async></script><script>(function() {window.fvAnimateCharts = function(chartWrapper) {if (!chartWrapper) return;function animateBars(chartElement) {if (!chartElement) return;var bars = chartElement.querySelectorAll('.fv-bar, .fv-stacked-segment');bars.forEach(function(bar, index) {bar.style.setProperty('width', '0%', 'important');bar.style.setProperty('transition', 'none', 'important');var targetWidth = bar.dataset.targetWidth;if (targetWidth === undefined) return;void bar.offsetWidth;var targetMargin = bar.dataset.targetMargin;var baseMargin = bar.dataset.baseMargin;if (baseMargin !== undefined) {bar.style.setProperty('margin-left', baseMargin + '%', 'important');}setTimeout(function() {var marginTransition = baseMargin !== undefined ? ', margin-left 0.8s ease-out' : '';bar.style.setProperty('transition', 'opacity 0.2s ease, width 0.8s ease-out' + marginTransition, 'important');bar.style.setProperty('width', targetWidth + '%', 'important');if (targetMargin !== undefined && baseMargin !== undefined) {bar.style.setProperty('margin-left', targetMargin + '%', 'important');}}, index * 50 + 50);});}function animateLineChart(chartElement) {if (!chartElement) return;var lineSvg = chartElement.querySelector('svg');if (!lineSvg) return;var paths = lineSvg.querySelectorAll('.riv-line-path');paths.forEach(function(p, i) {if (typeof p.getTotalLength === 'function') {var len = p.getTotalLength();p.style.transition = 'none';p.style.strokeDasharray = len;p.style.strokeDashoffset = len;p.getBoundingClientRect();setTimeout(function() {p.style.transition = 'stroke-dashoffset 1s ease-out ' + (i * 0.1) + 's, stroke-width 0.2s, opacity 0.2s';p.style.strokeDashoffset = '0';}, 100);}});var dots = lineSvg.querySelectorAll('.riv-dot');dots.forEach(function(dot, i) {dot.style.opacity = '0';setTimeout(function() {dot.style.transition = 'opacity 0.3s ease';dot.style.opacity = '1';}, 500 + i * 10);});}var charts = chartWrapper.querySelectorAll('.fv-chart-item');charts.forEach(function(chart) {if (window.getComputedStyle(chart).display === 'none') return;var chartType = chart.dataset.chartType;if (chartType === 'Line') {animateLineChart(chart);} else if (chartType !== 'Pie') {animateBars(chart);}});};function initialize(uniqueId, isSlideshow) {var root = document.getElementById(uniqueId);if (!root && !isSlideshow) return;function setupWrapper(chartWrapper) {if (!chartWrapper) return;function checkMobileView() {var width = chartWrapper.getBoundingClientRect().width;var isMobileDevice = window.screen && Math.min(window.screen.width, window.screen.height) <= 599;var isMobile;if (width === 0) {isMobile = isMobileDevice || window.matchMedia('(max-width: 599px)').matches;} else {isMobile = isMobileDevice || width < 600;}if (isMobile) {chartWrapper.classList.add('mobile-view');} else {chartWrapper.classList.remove('mobile-view');}}checkMobileView();if (typeof ResizeObserver !== 'undefined') {var ro = new ResizeObserver(function() {checkMobileView();});ro.observe(chartWrapper);}window.addEventListener('resize', checkMobileView);var labelsOnTop = chartWrapper.dataset.barLabelsOnTop === 'true';if (labelsOnTop) {var charts = chartWrapper.querySelectorAll('.fv-chart-item');var hasVisibleBarChart = false;charts.forEach(function(c) {if (window.getComputedStyle(c).display !== 'none') {var cType = c.dataset.chartType;if (cType === 'Bar' || cType === 'Stacked Bar' || cType === 'Versus') {hasVisibleBarChart = true;}}});if (hasVisibleBarChart) {chartWrapper.classList.add('labels-on-top');} else {chartWrapper.classList.remove('labels-on-top');}} else {chartWrapper.classList.remove('labels-on-top');}chartWrapper.querySelectorAll('.riv-line-legend').forEach(function(legend) {var chartId = legend.dataset.chart;var chart = chartWrapper.querySelector('[id="' + chartId + '"]');if (!chart) return;var lines = chart.querySelectorAll('.riv-line-path');var dots = chart.querySelectorAll('.riv-dot');var legendItems = legend.querySelectorAll('.riv-legend-item');legendItems.forEach(function(item) {var productName = item.dataset.product;var safeProductName = productName.replace(/"/g, '\"');var line = chart.querySelector('.riv-line-path[data-product="' + safeProductName + '"]');var productDots = chart.querySelectorAll('.riv-dot[data-product="' + safeProductName + '"]');if (line && !line.dataset.origStroke) {line.dataset.origStroke = line.getAttribute('stroke-width') || '2';}var highlight = function() {if (legend.querySelector('.isolated')) return;lines.forEach(function(l) { l.style.opacity = '0.2'; l.setAttribute('stroke-width', l.dataset.origStroke); });dots.forEach(function(d) { d.style.opacity = '0.2'; });legendItems.forEach(function(i) { i.style.opacity = '0.3'; i.style.transition = 'opacity 0.2s'; });if (line) {line.style.opacity = '1';line.setAttribute('stroke-width', '4');}productDots.forEach(function(d) { d.style.opacity = '1'; });item.style.opacity = '1';};var clearHighlight = function() {if (legend.querySelector('.isolated')) return;lines.forEach(function(l) { l.style.opacity = '1'; l.setAttribute('stroke-width', l.dataset.origStroke); });dots.forEach(function(d) { d.style.opacity = '1'; });legendItems.forEach(function(i) { i.style.opacity = '1'; });};var toggleIsolate = function() {var isIsolated = item.classList.contains('isolated');legendItems.forEach(function(i) { i.classList.remove('isolated'); });if (isIsolated) {lines.forEach(function(l) { l.style.opacity = '1'; l.setAttribute('stroke-width', l.dataset.origStroke); });dots.forEach(function(d) { d.style.opacity = '1'; });legendItems.forEach(function(i) { i.style.opacity = '1'; });} else {item.classList.add('isolated');lines.forEach(function(l) { l.style.opacity = '0.2'; l.setAttribute('stroke-width', l.dataset.origStroke); });dots.forEach(function(d) { d.style.opacity = '0.2'; });legendItems.forEach(function(i) { i.style.opacity = '0.3'; i.style.transition = 'opacity 0.2s'; });if (line) {line.style.opacity = '1';line.setAttribute('stroke-width', '4');}productDots.forEach(function(d) { d.style.opacity = '1'; });item.style.opacity = '1';}};item.addEventListener('mouseenter', highlight);item.addEventListener('focus', highlight);item.addEventListener('mouseleave', clearHighlight);item.addEventListener('blur', clearHighlight);item.addEventListener('click', toggleIsolate);if (line) {line.style.cursor = 'pointer';line.addEventListener('mouseenter', highlight);line.addEventListener('mouseleave', clearHighlight);line.addEventListener('click', toggleIsolate);}});});var versusCharts = chartWrapper.querySelectorAll('.fv-versus-chart');versusCharts.forEach(function(vc) {var dataJson = vc.getAttribute('data-versus-data');var leftColor = vc.getAttribute('data-left-color') || '#E53935';var rightColor = vc.getAttribute('data-right-color') || '#FFB300';if (!dataJson) return;var versusData = JSON.parse(dataJson);var leftSelect = vc.querySelector('.fv-select-left');var rightSelect = vc.querySelector('.fv-select-right');var rows = vc.querySelectorAll('.fv-versus-row');function updateVersusChart() {var leftProduct = leftSelect.value;var rightProduct = rightSelect.value;leftSelect.style.color = leftColor;leftSelect.style.borderColor = leftColor;rightSelect.style.color = rightColor;rightSelect.style.borderColor = rightColor;rows.forEach(function(row) {var index = parseInt(row.getAttribute('data-index'));var data = versusData[index];if (!data) return;var leftVal = data.productData[leftProduct] ? data.productData[leftProduct].value : undefined;var rightVal = data.productData[rightProduct] ? data.productData[rightProduct].value : undefined;var leftIsNum = typeof leftVal === 'number';var rightIsNum = typeof rightVal === 'number';var leftNum = leftIsNum ? leftVal : 0;var rightNum = rightIsNum ? rightVal : 0;var maxVal = Math.max(leftNum, rightNum, 0.0001);var leftWidth = leftIsNum ? (leftNum / maxVal) * 95 : 0;var rightWidth = rightIsNum ? (rightNum / maxVal) * 85 : 0;var winner = null;var pctDiffStr = null;if (leftIsNum && rightIsNum) {if (leftNum > rightNum) {winner = 'left';if (rightNum > 0) {var diff = Math.round(((leftNum - rightNum) / rightNum) * 100);pctDiffStr = '+' + diff.toLocaleString() + '%';}} else if (rightNum > leftNum) {winner = 'right';if (leftNum > 0) {var diff = Math.round(((rightNum - leftNum) / leftNum) * 100);pctDiffStr = '+' + diff.toLocaleString() + '%';}}}var leftDisplay = data.productData[leftProduct] && data.productData[leftProduct].displayValue !== undefined ? data.productData[leftProduct].displayValue : (leftIsNum ? leftNum.toLocaleString() : (leftVal !== undefined ? leftVal : '-'));var rightDisplay = data.productData[rightProduct] && data.productData[rightProduct].displayValue !== undefined ? data.productData[rightProduct].displayValue : (rightIsNum ? rightNum.toLocaleString() : (rightVal !== undefined ? rightVal : '-'));var unit = (data.productData[leftProduct] && data.productData[leftProduct].unit) ||(data.productData[rightProduct] && data.productData[rightProduct].unit) || '';var leftTextStr = leftDisplay;var rightTextStr = rightDisplay;var leftBar = row.querySelector('.fv-versus-bar-left');var rightBar = row.querySelector('.fv-versus-bar-right');var leftText = row.querySelector('.fv-inside-left');var rightText = row.querySelector('.fv-inside-right');var labelText = row.querySelector('.fv-versus-label span');var leftWrapper = row.querySelector('.fv-versus-bar-left-wrapper');var rightWrapper = row.querySelector('.fv-versus-bar-right-wrapper');var existingPctDiffs = row.querySelectorAll('.fv-versus-pct-diff');existingPctDiffs.forEach(function(el) { el.remove(); });if (winner === 'left' && pctDiffStr) {var pctSpan = document.createElement('span');pctSpan.className = 'fv-versus-pct-diff';pctSpan.style.color = 'rgba(255, 255, 255, 0.9)';pctSpan.textContent = pctDiffStr;if (leftBar) leftBar.insertBefore(pctSpan, leftBar.firstChild);} else if (winner === 'right' && pctDiffStr) {var pctSpan = document.createElement('span');pctSpan.className = 'fv-versus-pct-diff';pctSpan.style.color = 'rgba(255, 255, 255, 0.9)';pctSpan.textContent = pctDiffStr;if (rightBar) rightBar.appendChild(pctSpan);}if (leftBar) {leftBar.style.backgroundColor = leftColor;leftBar.dataset.targetWidth = leftWidth;leftBar.style.setProperty('--target-width', leftWidth + '%');leftBar.style.width = leftWidth + '%';}if (rightBar) {rightBar.style.backgroundColor = rightColor;rightBar.dataset.targetWidth = rightWidth;rightBar.style.setProperty('--target-width', rightWidth + '%');rightBar.style.width = rightWidth + '%';}if (leftText) {leftText.innerHTML = leftTextStr;}if (rightText) {rightText.innerHTML = rightTextStr;}if (labelText) {labelText.textContent = data.attribute + (unit ? ' (' + unit + ')' : '');}});}if (leftSelect) leftSelect.addEventListener('change', updateVersusChart);if (rightSelect) rightSelect.addEventListener('change', updateVersusChart);});var barRows = chartWrapper.querySelectorAll('.fv-bar-row');var globalCaptionEl = chartWrapper.querySelector('.rv-chart-caption');var fallbackCaptionHtml = globalCaptionEl ? globalCaptionEl.innerHTML : '';barRows.forEach(function(row) {var commentaryEl = row.querySelector('[data-commentary-key]');if (commentaryEl) {var commentaryText = commentaryEl.textContent;if (commentaryText && commentaryText.trim().length > 0) {row.addEventListener('mouseenter', function() {if (!chartWrapper.classList.contains('mobile-view') && globalCaptionEl) {globalCaptionEl.innerHTML = commentaryText;globalCaptionEl.classList.add('fv-bar-active-caption');}});row.addEventListener('mouseleave', function() {if (!chartWrapper.classList.contains('mobile-view') && globalCaptionEl) {globalCaptionEl.innerHTML = fallbackCaptionHtml;globalCaptionEl.classList.remove('fv-bar-active-caption');}});}}});var charts = chartWrapper.querySelectorAll('.fv-chart-item');var dropdown = chartWrapper.querySelector('.fv-dropdown-title');var prevBtn = chartWrapper.querySelector('.fv-carousel-nav-btn.prev');var nextBtn = chartWrapper.querySelector('.fv-carousel-nav-btn.next');var carouselTitle = chartWrapper.querySelector('.fv-carousel-title-controls .fv-benchmark-title');var counter = chartWrapper.querySelector('.fv-carousel-counter');var subheadEl = chartWrapper.querySelector('.fv-chart-subhead');var captionEl = chartWrapper.querySelector('.rv-chart-caption');var footerContentEl = chartWrapper.querySelector('.fv-footer-content');var bottomBarEl = chartWrapper.querySelector('.fv-bottom-bar');var logoEl = chartWrapper.querySelector('.fv-logo');if (charts.length > 1 && (dropdown || prevBtn)) {var currentChartIndex = 0;var titles = [];if (dropdown) {titles = Array.from(dropdown.options).map(function(o) { return o.text; });} else {charts.forEach(function(c) {titles.push(c.getAttribute('data-title') || '');});}function showInternalChart(index) {if (index < 0) index = charts.length - 1;if (index >= charts.length) index = 0;currentChartIndex = index;charts.forEach(function(c, i) {c.style.display = i === index ? 'block' : 'none';if (i === index) {var cType = c.dataset.chartType;if (cType === 'Line') {} else if (cType !== 'Pie') {window.fvAnimateCharts(chartWrapper);}var labelsOnTop = chartWrapper.dataset.barLabelsOnTop === 'true';if (labelsOnTop && (cType === 'Bar' || cType === 'Stacked Bar' || cType === 'Versus')) {chartWrapper.classList.add('labels-on-top');} else {chartWrapper.classList.remove('labels-on-top');}}});if (dropdown) dropdown.value = index;if (carouselTitle && titles[index]) carouselTitle.textContent = titles[index];if (counter) counter.textContent = (index + 1) + ' of ' + charts.length;var activeChart = charts[index];if (activeChart) {var newSubhead = activeChart.getAttribute('data-subhead');var newCaption = activeChart.getAttribute('data-caption');var currentChartType = activeChart.getAttribute('data-chart-type');var hideGlobalCaption = currentChartType === 'Countdown' || currentChartType === 'Image Comparison' || currentChartType === 'Shop the Collection';if (subheadEl) subheadEl.textContent = newSubhead || '';if (captionEl) {captionEl.textContent = newCaption || '';fallbackCaptionHtml = newCaption || '';}if (footerContentEl) {if (newCaption && newCaption.trim().length > 0 && !hideGlobalCaption) {footerContentEl.style.display = 'block';if (bottomBarEl) bottomBarEl.style.display = 'flex';} else {footerContentEl.style.display = 'none';if (bottomBarEl && !logoEl) {bottomBarEl.style.display = 'none';}}}}}if (dropdown) dropdown.addEventListener('change', function(e) { showInternalChart(parseInt(e.target.value)); });if (prevBtn) prevBtn.addEventListener('click', function() { showInternalChart(currentChartIndex - 1); });if (nextBtn) nextBtn.addEventListener('click', function() { showInternalChart(currentChartIndex + 1); });}var imageCompareWrappers = chartWrapper.querySelectorAll('.fv-image-compare-wrapper');imageCompareWrappers.forEach(function(wrapper) {var inner = wrapper.querySelector('.fv-image-compare-inner') || wrapper;var slider = wrapper.querySelector('.fv-image-compare-slider');var fgImage = wrapper.querySelector('.fv-image-compare-fg');var bgImage = wrapper.querySelector('.fv-image-compare-bg');var labelLeft = wrapper.querySelector('.fv-image-compare-label-left');var labelRight = wrapper.querySelector('.fv-image-compare-label-right');var isDragging = false;var scale = 1;var panX = 0;var panY = 0;var isPanning = false;var hasPanned = false;var lastClientX = 0;var lastClientY = 0;var initialDistance = null;var lastCenterX = null;var lastCenterY = null;function updateTransform() {if (wrapper.classList.contains('fv-image-compare-fullscreen')) {inner.style.setProperty('transform', 'translate(' + panX + 'px, ' + panY + 'px) scale(' + scale + ')', 'important');} else {inner.style.removeProperty('transform');scale = 1;panX = 0;panY = 0;}}function constrainPan() {var rect = wrapper.getBoundingClientRect();var maxPanX = Math.max(0, (rect.width * scale - rect.width) / 2);var maxPanY = Math.max(0, (rect.height * scale - rect.height) / 2);panX = Math.max(-maxPanX, Math.min(panX, maxPanX));panY = Math.max(-maxPanY, Math.min(panY, maxPanY));}wrapper.addEventListener('wheel', function(e) {if (!wrapper.classList.contains('fv-image-compare-fullscreen')) return;e.preventDefault();var zoomSensitivity = 0.005;var zoomFactor = Math.exp(-e.deltaY * zoomSensitivity);var newScale = Math.max(1, Math.min(scale * zoomFactor, 5));if (newScale === scale) return;var rect = wrapper.getBoundingClientRect();var mouseX = e.clientX - rect.left - rect.width / 2;var mouseY = e.clientY - rect.top - rect.height / 2;var ratio = newScale / scale;panX = mouseX - (mouseX - panX) * ratio;panY = mouseY - (mouseY - panY) * ratio;scale = newScale;constrainPan();updateTransform();}, { passive: false });wrapper.addEventListener('mousedown', function(e) {if (!wrapper.classList.contains('fv-image-compare-fullscreen') || scale <= 1) return;if (e.target.closest('.fv-image-compare-slider') || e.target.closest('button')) return;isPanning = true;hasPanned = false;lastClientX = e.clientX;lastClientY = e.clientY;});window.addEventListener('mousemove', function(e) {if (!isPanning) return;var dx = e.clientX - lastClientX;var dy = e.clientY - lastClientY;if (Math.abs(dx) > 2 || Math.abs(dy) > 2) {hasPanned = true;}lastClientX = e.clientX;lastClientY = e.clientY;panX += dx;panY += dy;constrainPan();updateTransform();});window.addEventListener('mouseup', function() {isPanning = false;});wrapper.addEventListener('touchstart', function(e) {if (!wrapper.classList.contains('fv-image-compare-fullscreen')) return;if (e.touches.length === 2) {e.preventDefault();var dx = e.touches[0].clientX - e.touches[1].clientX;var dy = e.touches[0].clientY - e.touches[1].clientY;initialDistance = Math.sqrt(dx * dx + dy * dy);var rect = wrapper.getBoundingClientRect();lastCenterX = (e.touches[0].clientX + e.touches[1].clientX) / 2 - rect.left - rect.width / 2;lastCenterY = (e.touches[0].clientY + e.touches[1].clientY) / 2 - rect.top - rect.height / 2;hasPanned = true;} else if (e.touches.length === 1 && scale > 1) {if (e.target.closest('.fv-image-compare-slider') || e.target.closest('button')) return;isPanning = true;hasPanned = false;lastClientX = e.touches[0].clientX;lastClientY = e.touches[0].clientY;}}, { passive: false });wrapper.addEventListener('touchmove', function(e) {if (!wrapper.classList.contains('fv-image-compare-fullscreen')) return;if (e.touches.length === 2 && initialDistance !== null) {e.preventDefault();var dx = e.touches[0].clientX - e.touches[1].clientX;var dy = e.touches[0].clientY - e.touches[1].clientY;var distance = Math.sqrt(dx * dx + dy * dy);if (initialDistance > 0) {var zoomFactor = distance / initialDistance;var newScale = Math.max(1, Math.min(scale * zoomFactor, 5));var rect = wrapper.getBoundingClientRect();var centerX = (e.touches[0].clientX + e.touches[1].clientX) / 2 - rect.left - rect.width / 2;var centerY = (e.touches[0].clientY + e.touches[1].clientY) / 2 - rect.top - rect.height / 2;var ratio = newScale / scale;panX = centerX - (centerX - panX) * ratio;panY = centerY - (centerY - panY) * ratio;if (lastCenterX !== null && lastCenterY !== null) {panX += (centerX - lastCenterX);panY += (centerY - lastCenterY);}scale = newScale;lastCenterX = centerX;lastCenterY = centerY;constrainPan();updateTransform();}initialDistance = distance;} else if (e.touches.length === 1 && isPanning) {e.preventDefault();var dx = e.touches[0].clientX - lastClientX;var dy = e.touches[0].clientY - lastClientY;if (Math.abs(dx) > 2 || Math.abs(dy) > 2) {hasPanned = true;}lastClientX = e.touches[0].clientX;lastClientY = e.touches[0].clientY;panX += dx;panY += dy;constrainPan();updateTransform();}}, { passive: false });wrapper.addEventListener('touchend', function(e) {if (e.touches.length < 2) {initialDistance = null;}if (e.touches.length === 0) {isPanning = false;}});function handleMove(clientX) {var rect = inner.getBoundingClientRect();var x = Math.max(0, Math.min(clientX - rect.left, rect.width));var percent = Math.max(0, Math.min((x / rect.width) * 100, 100));if (slider) slider.style.setProperty('left', percent + '%', 'important');if (fgImage) fgImage.style.setProperty('clip-path', 'polygon(0 0, ' + percent + '% 0, ' + percent + '% 100%, 0 100%)', 'important');if (labelLeft) {if (percent < 10) {labelLeft.style.setProperty('opacity', '0', 'important');} else {labelLeft.style.setProperty('opacity', '1', 'important');}}if (labelRight) {if (percent > 90) {labelRight.style.setProperty('opacity', '0', 'important');} else {labelRight.style.setProperty('opacity', '1', 'important');}}}function onMouseMove(e) {if (!isDragging) return;handleMove(e.clientX);}function onTouchMove(e) {if (!isDragging) return;e.preventDefault();handleMove(e.touches[0].clientX);}function stopDragging() {isDragging = false;window.removeEventListener('mousemove', onMouseMove);window.removeEventListener('mouseup', stopDragging);window.removeEventListener('touchmove', onTouchMove);window.removeEventListener('touchend', stopDragging);}if (slider) {var startDrag = function(clientX) {isDragging = true;handleMove(clientX);window.addEventListener('mousemove', onMouseMove);window.addEventListener('mouseup', stopDragging);};var startTouchDrag = function(clientX) {isDragging = true;handleMove(clientX);window.addEventListener('touchmove', onTouchMove, { passive: false });window.addEventListener('touchend', stopDragging);};slider.addEventListener('mousedown', function(e) {e.preventDefault();startDrag(e.clientX);});slider.addEventListener('touchstart', function(e) {e.preventDefault();startTouchDrag(e.touches[0].clientX);}, { passive: false });}var expandBtn = wrapper.querySelector('.fv-image-compare-expand-btn');var closeBtn = wrapper.querySelector('.fv-image-compare-close-btn');if (expandBtn) {if (window !== window.parent) {expandBtn.style.display = 'none';} else {expandBtn.addEventListener('click', function(e) {e.stopPropagation();wrapper.classList.add('fv-image-compare-fullscreen');document.body.style.overflow = 'hidden';if (fgImage && fgImage.dataset.highresSrc) {fgImage.src = fgImage.dataset.highresSrc;fgImage.removeAttribute('srcset');fgImage.removeAttribute('sizes');}if (bgImage && bgImage.dataset.highresSrc) {bgImage.src = bgImage.dataset.highresSrc;bgImage.removeAttribute('srcset');bgImage.removeAttribute('sizes');}});}}if (closeBtn) {closeBtn.addEventListener('click', function(e) {e.stopPropagation();wrapper.classList.remove('fv-image-compare-fullscreen');document.body.style.overflow = '';updateTransform();});}document.addEventListener('keydown', function(e) {if (e.key === 'Escape' && wrapper.classList.contains('fv-image-compare-fullscreen')) {wrapper.classList.remove('fv-image-compare-fullscreen');document.body.style.overflow = '';updateTransform();}});});var hotspots = chartWrapper.querySelectorAll('.fv-stl-hotspot-btn');var allProductsModal = chartWrapper.querySelector('.fv-stl-all-products-modal');var shopAllBtn = chartWrapper.querySelector('.fv-stl-shop-all-btn');var allProductsList = chartWrapper.querySelector('.fv-stl-all-products-list');var stlContainer = chartWrapper.querySelector('.fv-stl-container');function closeAllModals() {if (allProductsModal) {allProductsModal.classList.remove('is-active');var items = allProductsModal.querySelectorAll('.fv-stl-all-products-item');items.forEach(function(item) {item.classList.remove('is-highlighted');});if (stlContainer) {setTimeout(function() {if (!allProductsModal.classList.contains('is-active')) {stlContainer.style.minHeight = '';if ('parentIFrame' in window) {window.parentIFrame.size();}}}, 300);}}hotspots.forEach(function(btn) { btn.setAttribute('aria-expanded', 'false'); });if ('parentIFrame' in window) {window.parentIFrame.size();}}hotspots.forEach(function(btn) {btn.addEventListener('click', function(e) {e.stopPropagation();var hotspotId = btn.getAttribute('data-hotspot-id');var isExpanded = btn.getAttribute('aria-expanded') === 'true';closeAllModals();if (!isExpanded && allProductsModal) {btn.setAttribute('aria-expanded', 'true');allProductsModal.classList.add('is-active');var container = btn.closest('.fv-stl-container');if (container && container.offsetHeight < 450) {container.style.minHeight = '450px';}var targetItem = allProductsModal.querySelector('.fv-stl-all-products-item[data-product-id="' + hotspotId + '"]');if (targetItem) {targetItem.classList.add('is-highlighted');setTimeout(function() {targetItem.scrollIntoView({ behavior: 'smooth', block: 'center' });}, 100);}if ('parentIFrame' in window) {window.parentIFrame.size();}}});});if (shopAllBtn && allProductsModal) {shopAllBtn.addEventListener('click', function(e) {e.stopPropagation();closeAllModals();allProductsModal.classList.add('is-active');var container = shopAllBtn.closest('.fv-stl-container');if (container && container.offsetHeight < 450) {container.style.minHeight = '450px';}if ('parentIFrame' in window) {window.parentIFrame.size();}});}if (allProductsModal) {var closeAllBtn = allProductsModal.querySelector('.fv-stl-all-products-close');if (closeAllBtn) {closeAllBtn.addEventListener('click', function(e) {e.stopPropagation();closeAllModals();});}}chartWrapper.addEventListener('click', function(e) {if (!e.target.closest('.fv-stl-all-products-content')) {closeAllModals();}});if (allProductsModal) {allProductsModal.addEventListener('click', function(e) {if (!e.target.closest('.fv-stl-all-products-content')) {closeAllModals();}});}var iaNodes = chartWrapper.querySelectorAll('.fv-ia-node-button');var iaWrapper = chartWrapper.querySelector('.fv-ia-wrapper');var originalCaption = chartWrapper.querySelector('.fv-original-caption') || captionEl;var dynamicCaption = chartWrapper.querySelector('.fv-ia-dynamic-caption');var exploreBtn = chartWrapper.querySelector('.fv-ia-explore-btn');var currentIaIndex = -1;function closeAllIANodes() {iaNodes.forEach(function(btn) { btn.classList.remove('is-active'); });if (originalCaption) originalCaption.style.display = 'block';if (dynamicCaption) dynamicCaption.style.display = 'none';}function resetExploreBtn() {currentIaIndex = -1;if (exploreBtn) {var exploreSpan = exploreBtn.querySelector('span');if (exploreSpan) exploreSpan.textContent = 'Explore';}}iaNodes.forEach(function(btn, index) {btn.addEventListener('click', function(e) {e.stopPropagation();var isActive = btn.classList.contains('is-active');closeAllIANodes();if (!isActive) {currentIaIndex = index;if (exploreBtn) {var exploreSpan = exploreBtn.querySelector('span');if (exploreSpan) exploreSpan.textContent = 'Next';}btn.classList.add('is-active');if (dynamicCaption) {var title = btn.getAttribute('data-title') || '';var desc = btn.getAttribute('data-desc') || '';dynamicCaption.innerHTML = '';var strongTag = document.createElement('strong');strongTag.textContent = title;dynamicCaption.appendChild(strongTag);if (desc) {dynamicCaption.appendChild(document.createTextNode(' - ' + desc));}if (originalCaption) originalCaption.style.display = 'none';dynamicCaption.style.display = 'block';if (footerContentEl) footerContentEl.style.display = 'block';}} else {resetExploreBtn();}});});if (exploreBtn) {exploreBtn.addEventListener('click', function(e) {e.stopPropagation();if (iaNodes.length === 0) return;var nextIndex = currentIaIndex + 1;if (nextIndex >= iaNodes.length) {closeAllIANodes();resetExploreBtn();} else {currentIaIndex = nextIndex;var targetBtn = iaNodes[currentIaIndex];if (targetBtn) {if(targetBtn.classList.contains('is-active')) {targetBtn.click();}targetBtn.click();}}});}if (iaWrapper) {iaWrapper.addEventListener('click', function(e) {if (!e.target.closest('.fv-ia-node-button') && !e.target.closest('.fv-ia-explore-btn')) {closeAllIANodes();resetExploreBtn();}});}window.fvAnimateCharts(chartWrapper);var countdownContainer = chartWrapper.querySelector('.fv-countdown-container');if (countdownContainer) {var targetDateAttr = countdownContainer.getAttribute('data-target-date');if (targetDateAttr) {var targetDate = new Date(targetDateAttr);var primaryColor = countdownContainer.getAttribute('data-primary-color') || '#f97316';var subheadColor = countdownContainer.getAttribute('data-subhead-color') || '#ffffff';var pad = function(n) { return (n < 10 ? '0' : '') + n; };var updateCountdown = function() {var difference = +targetDate - +new Date();var d = 0, h = 0, m = 0, s = 0;if (difference > 0) {d = Math.floor(difference / (1000 * 60 * 60 * 24));h = Math.floor((difference / (1000 * 60 * 60)) % 24);m = Math.floor((difference / 1000 / 60) % 60);s = Math.floor((difference / 1000) % 60);}var daysEl = countdownContainer.querySelector('[data-time="days"]');var hoursEl = countdownContainer.querySelector('[data-time="hours"]');var minsEl = countdownContainer.querySelector('[data-time="minutes"]');var secsEl = countdownContainer.querySelector('[data-time="seconds"]');if (daysEl) daysEl.textContent = d;if (hoursEl) hoursEl.textContent = pad(h);if (minsEl) minsEl.textContent = pad(m);if (secsEl) secsEl.textContent = pad(s);};updateCountdown();setInterval(updateCountdown, 1000);}}}if (false) {var slideshowContainer = document.getElementById(uniqueId + '-slideshow');if (slideshowContainer) {var slides = slideshowContainer.querySelectorAll('.fv-slide');slides.forEach(function(slide) {setupWrapper(slide.querySelector('.fv-chart-wrapper'));});}} else {setupWrapper(root);}}if (document.readyState === 'loading') {document.addEventListener('DOMContentLoaded', function() { initialize('fv-chart-1790850863761-ex8omnlta', false); });} else {initialize('fv-chart-1790850863761-ex8omnlta', false);}})();</script></div><h3 class="article-body__section" id="section-also-tested"><span>Also tested</span></h3><div class="product"><a data-dimension112="fb1bf68e-a08e-11f1-a60a-31480ecc4697" data-action="Deal Block" data-label="Galaxy Tab S10 Plus" data-dimension48="Galaxy Tab S10 Plus" data-dimension25="$1059" href="https://www.walmart.com/ip/Samsung-Galaxy-Tab-S10-12-4-Tablet-256GB-Android-14-Moonstone-Gray-S-Pen-Included/8947900220" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="eHJ8YVR6nTn43UYum8KYqn" name="Samsung Galaxy Tab S10 Plus" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/eHJ8YVR6nTn43UYum8KYqn-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>(★★★★☆)</strong></p><p>Samsung's Galaxy Tab S10 Plus is every bit as premium as its high price makes it out to be. From its colorful, 12.4-inch AMOLED display and included (and handy) stylus to its lightweight yet sizeable, portable design. It's still a great tablet to pick up, even with the S11 now outpacing it. It's a tablet that can take full advantage of what Android has to offer, but even at this price, it can't beat what Apple's iPads are dishing out. Plus, it's only gone up in price, so you're better off grabbing the <a href="#elk-fb1befcc-a08e-11f1-8917-51123cd74262" data-dimension112="fb1bf68e-a08e-11f1-a60a-31480ecc4697" data-action="Deal Block" data-label="Galaxy Tab S10 Plus" data-dimension48="Galaxy Tab S10 Plus" data-dimension25="$1059">Galaxy Tab S10 FE Plus</a>.</p><p><strong>Read our full </strong><a href="https://www.tomsguide.com/tablets/android-tablets/samsung-galaxy-tab-s10-plus-review-watch-out-ipad-pro"><strong>Samsung Galaxy Tab S10 Plus review</strong></a><strong></strong><a class="view-deal button" href="https://www.walmart.com/ip/Samsung-Galaxy-Tab-S10-12-4-Tablet-256GB-Android-14-Moonstone-Gray-S-Pen-Included/8947900220" target="_blank" rel="nofollow" data-dimension112="fb1bf68e-a08e-11f1-a60a-31480ecc4697" data-action="Deal Block" data-label="Galaxy Tab S10 Plus" data-dimension48="Galaxy Tab S10 Plus" data-dimension25="$1059">View Deal</a></p></div><h2 class="article-body__section" id="section-best-samsung-tablet-frequently-asked-questions"><span>Best Samsung Tablet: Frequently Asked Questions</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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="veiVMHga9Zd599FSGxErrh" name="Samsung Galaxy Tab S12 Ultra-6" alt="Samsung Galaxy Tab S12 Ultra" src="https://cdn.mos.cms.futurecdn.net/veiVMHga9Zd599FSGxErrh-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><section class="article__schema-question"><h3>Why should I buy a Samsung tablet over an iPad?</h3><article class="article__schema-answer"><p>Samsung tablets deliver better value and flexibility, especially if you're already in Samsung's ecosystem. The premium S Pen stylus is typically included, saving you money, and you get more versatile storage options thanks to the standard microSD card slot.</p><p>For productivity, Samsung’s DeX mode transforms the tablet into a PC-like desktop environment with true multitasking and resizable windows. Furthermore, many Galaxy Tabs feature a superior AMOLED display for richer, more immersive movie watching with perfect blacks.</p></article></section><section class="article__schema-question"><h3>Do Samsung tablets come with an S Pen?</h3><article class="article__schema-answer"><p>Many Samsung Galaxy Tab models include an S Pen, but you should check the box contents for the exact model before buying. All the Samsung tablets in this guide come with an S Pen included, which is great for note-taking, sketching or just doodling.</p><p>Compared to many of the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a> and <a href="https://www.tomsguide.com/best-picks/best-ipad">best iPads</a>, the included pen makes a Galaxy Tab better value than a tablet that requires a separate stylus purchase.</p></article></section><section class="article__schema-question"><h3>Can a Samsung tablet replace a laptop for work?</h3><article class="article__schema-answer"><p>This depends on the work you will do on a Samsung tablet. It can replace a laptop for email, web work, video calls, note-taking, documents and light multitasking, especially when paired with a keyboard and Samsung DeX. The Galaxy Tab S12 Ultra is a great alternative with its 14-inch display and when paired with the $399 Pro Keyboard, but that will ramp up the price. </p><p>But it's not a complete replacement for every workflow, as it still uses Android OS. Check that the Android versions of your essential work apps meet your needs, and note that DeX and keyboard accessories still have limitations compared with a usual laptop.</p></article></section><section class="article__schema-question"><h3>Are Samsung tablets on Android?</h3><article class="article__schema-answer"><p>Yes, Samsung Galaxy Tab tablets run Android, with Samsung’s One UI software layered on top. That gives you access to the Google Play Store and Samsung-specific features such as DeX on compatible models, which provides a more desktop-like interface for multitasking.</p><p>That means you get the full Google Play Store just like any other Android tablet, although Samsung offers a number of unique features, like Galaxy AI, that other Android tablets can't match.</p></article></section><h2 class="article-body__section" id="section-how-we-test-the-best-samsung-tablets"><span>How we test the best Samsung tablets</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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wpfa6TAsVmJYEjHGgTSnmC" name="Samsung Galaxy Tab S12 Ultra-2" alt="Samsung Galaxy Tab S12 Ultra" src="https://cdn.mos.cms.futurecdn.net/wpfa6TAsVmJYEjHGgTSnmC-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>We put every tablet through real-world and lab testing to see how it holds up — not just to the hype, but to the competition. That means using each device like an actual owner would, while also digging into the data that matters.</p><ul><li><strong>Battery life</strong>: We run a web-surfing test over Wi-Fi with the screen set to a standard brightness to see how long it lasts on a full charge.</li><li><strong>Display quality</strong>: We measure screen brightness (in nits) and color accuracy (via sRGB) to gauge how good it’ll look for work and play.</li><li><strong>Performance</strong>: We run benchmarks like Geekbench to see how fast and powerful the tablet really is.</li><li><strong>Software experience</strong>: On Android tablets, we check app availability and whether you’re getting full access to the Google Play Store.</li><li><strong>Parental controls</strong>: If a tablet offers kid-safe features, we try to break them — so your kids don’t.</li><li><strong>Everyday use</strong>: We spend days weeks using each tablet like any buyer would; opening apps, watching videos, multitasking, and seeing how it all feels in the hand.</li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/tablets/best-samsung-tablets</link>
                                                                            <description>
                            <![CDATA[ These are the best Samsung tablets we've tested in a range of prices and sizes to fit a variety of budgets. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">wyeYAARCtVdew9GmHUsWDU</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/exGQQCpRu6rrEYiTYADTCE-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 27 Nov 2025 17:38:04 +0000</pubDate>                                                                                                                                <updated>Thu, 01 Oct 2026 11:01:09 +0000</updated>
                                                                                                                                            <category><![CDATA[Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                                                                                    <dc:creator><![CDATA[ Darragh Murphy ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/5QiaTSWf9FcVB7STxcdo4M-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Darragh is Tom’s Guide’s Buying Guide Editor and is fascinated by all things bizarre in tech. This usually leads to assorted coverage varying from washing machines designed for earbuds to expert buying advice on the latest laptops. Whether it&amp;#39;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 an interesting angle no matter the subject. &lt;/p&gt;&lt;p&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, tablets, smartwatches, VR headsets, 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&amp;#39;s not checking out the latest devices and updating buying guides with expert advice, 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/exGQQCpRu6rrEYiTYADTCE-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Tab S12 Ultra]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Tab S12 Ultra]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Tab S12 Ultra]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/exGQQCpRu6rrEYiTYADTCE-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Samsung makes many of the best tablets on the market, offering gorgeous displays with lightweight, easy-to-use designs, sometimes at a fraction of the cost of its iPad rivals. If you're considering a Samsung tablet, we've done the hands-on testing to help you decide which one suits you best in this guide. </p><p>The <a href="#elk-fb1befcc-a08e-11f1-8917-51123cd74262">Galaxy Tab S10 FE Plus</a> is our top choice for most people, combining a large display, strong battery life and an included stylus at a more accessible price. It may be older, but it still delivers the full Samsung experience. If you want a lighter premium option, the <a href="#elk-fb1bf300-a08e-11f1-90fd-8dffb54664c5">Galaxy Tab S11</a> delivers a sleek design, a compact 11-inch AMOLED screen and amazing battery life at over 15 hours.</p><p>Prefer a larger display? Samsung makes the biggest around, and the recent <a href="#elk-fb1bf4fe-a08e-11f1-b24c-471c66812bfc">Galaxy Tab S12 Ultra</a> is our top choice thanks to its massive 14.6-inch OLED panel and strong performance. In this guide, I'll bring our expert advice and in-depth reviews on the best Samsung tablets worth buying today. </p><h2 id="the-best-samsung-tablets-you-can-buy-right-now">The best Samsung tablets you can buy right now</h2><h3 class="article-body__section" id="section-best-samsung-tablet-overall"><span>Best Samsung tablet overall</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="pkVy4Jyo2ZePK4cqLwuX9H" name="Galaxy Tab S10 FE Plus-03" alt="Samsung Galaxy Tab S10 FE Plus" src="https://cdn.mos.cms.futurecdn.net/pkVy4Jyo2ZePK4cqLwuX9H-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" class="inline"><img id="WqLzPy4iPS8qbMqK42dYLY" class="endorsement-img endorsement-bottom-right" style="max-width: 100px; max-height: 100px;" src="https://cdn.mos.cms.futurecdn.net/WqLzPy4iPS8qbMqK42dYLY-1920-80.png" name="TG_badges_Recommended.png" alt="Tom's Guide Recommended product badge"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><div class="buying-guide-block"><h3 id="1-samsung-galaxy-tab-s10-fe-plus"><span class="title__text"><a href="https://www.tomsguide.com/computing/android-tablets/samsung-galaxy-tab-s10-fe-plus-review">1. Samsung Galaxy Tab S10 FE Plus</a></span><span class="chunk rating"><span class="icon icon-star"> </span><span class="icon icon-star"> </span><span class="icon icon-star"> </span><span class="icon icon-star"> </span></span></h3><div class="_hawk subtitle"><p>The best Samsung tablet for most people</p></div><p class="specs__container"><strong>CPU: </strong>Exynos 1580 | <strong>Display: </strong>13.1-inch AMOLED | <strong>Storage: </strong>128GB, 256GB, microSD support up to 2TB | <strong>Memory: </strong>8GB, 12GB | <strong>Ports: </strong>USB-C, microSD | <strong>Dimensions: </strong>7.67 x 11.83 x 0.24 inches | <strong>Weight: </strong>1.5 pounds</p><div class="hawk-wrapper"></div><div class="icon icon-plus_circle _hawk">Great value for money</div><div class="icon icon-plus_circle _hawk">Large</div><div class="icon icon-plus_circle _hawk">Surprisingly good battery life</div><div class="icon icon-plus_circle _hawk">Seven years of updates</div><div class="icon icon-minus_circle _hawk">Low-powered chipset</div><div class="icon icon-minus_circle _hawk">Lacks Galaxy AI features</div></div><p>The Samsung Galaxy Tab S10 FE Plus really impressed us with what you get for your money. The large 13.1-inch display makes it ideal for streaming and watching videos, since it's bright at 782 nits peak brightness and super vivid, making the colors pop even more.</p><p>Most surprisingly, it has stereo speakers, too. Normally, the small space for audio means you get tinny speakers, but in our testing, there's a nice warm, bassy punch alongside all the details being represented nicely across the sound space.</p><p>Then throw in that big battery for all-day use (lasting 15 hours and 43 minutes in our test), and you've got something with real staying power across all your films, web browsing and casual gaming.</p><p>Notice how I said casual gaming? The chip inside is certainly not the most powerful for intense tasks. Under significant pressure, you can see slowdown, but if your use cases are casual (ie, not editing videos or playing AAA games), you won't see it break a sweat.</p><p>Throw in that included stylus for whenever you're feeling creative, a decent camera system for video calls and snapping quick pics, and One UI 8 (launched in October 2025) for a great tablet experience, and a price less than $500, and you're onto a winner.</p><ul><li><em><strong>Read our full </strong></em><a href="https://www.tomsguide.com/computing/android-tablets/samsung-galaxy-tab-s10-fe-plus-review"><em><strong>Samsung Galaxy Tab S10 FE Plus review</strong></em></a></li></ul><h3 class="article-body__section" id="section-best-ipad-alternative-samsung-tablet"><span>Best iPad alternative Samsung tablet </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:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="iWBHTgsrPbipQ8kxWitP8b" name="PXL_20250828_111649247" alt="Samsung Galaxy Tab S11 display" src="https://cdn.mos.cms.futurecdn.net/iWBHTgsrPbipQ8kxWitP8b-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" class=""><img id="WqLzPy4iPS8qbMqK42dYLY" class="endorsement-img endorsement-bottom-right" style="max-width: 100px; max-height: 100px;" src="https://cdn.mos.cms.futurecdn.net/WqLzPy4iPS8qbMqK42dYLY-1920-80.png" name="TG_badges_Recommended.png" alt="Tom's Guide Recommended product badge"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><div class="buying-guide-block"><h3 id="2-samsung-galaxy-tab-s11"><span class="title__text"><a href="https://www.tomsguide.com/computing/android-tablets/samsung-galaxy-tab-s11-review">2. Samsung Galaxy Tab S11</a></span></h3><div class="_hawk subtitle"><p>The best Samsung tablet to rival Apple's iPad</p></div><p class="specs__container"><strong>CPU: </strong>MediaTek Dimensity 9400+ | <strong>Display: </strong>11-inch Dynamic AMOLED 2X (2560 x 1600) | <strong>Storage: </strong>256GB | <strong>Memory: </strong>12GB | <strong>Ports: </strong>1x USB-C | <strong>Dimensions: </strong>9.99 x 6.51 x 0.22 inches | <strong>Weight: </strong>1.06 pounds</p><div class="hawk-wrapper"></div><div class="icon icon-plus_circle _hawk">Speedy performance</div><div class="icon icon-plus_circle _hawk">Massive 14-inch AMOLED looks fantastic</div><div class="icon icon-plus_circle _hawk">Included stylus is a nice touch</div><div class="icon icon-minus_circle _hawk">Costs almost the same as iPad Pro, performs worse</div><div class="icon icon-minus_circle _hawk">Size makes use as a tablet awkward</div></div><p>This is the closest Android kin to the <a href="https://www.tomsguide.com/best-picks/best-ipad">best iPads</a> you can buy — providing a top shot at getting the Apple experience while avoiding iOS. And it does so by pairing zippy performance and a gorgeous display with a sleek, lightweight design and a top-notch OS.</p><p>On the face of it, this feels <em>very </em>iPad Air with super slim dimensions and a weight that just breaks one pound. It feels great in the hand, and that aluminum frame gives a nice durable confidence too.</p><p>Then you turn it on and are greeted by that mesmerizing 11-inch AMOLED display with 1,600 nits of peak brightness. Whether you're getting stuff done or binge-watching in bed, that sharpness, smoothness and vivid color make everything pop off the screen. The processor is more than capable of handling everyday tasks like web browsing, emails and streaming, but also means you can properly game and video edit without too much trouble. Plus, the built-in speakers are rather good. </p><p>Then there's the redesigned S Pen — feeling much more comfortable to hold with a hexagonal barrel to get a solid grip on for all your doodling. And in that vein of getting stuff done, Samsung's made some impressive upgrades to DeX mode too, which can extend this into an almost desktop-like experience. So if you need to lock in with a keyboard and mouse to work hard, the S11 nails it.</p><p>Throw in the ocean of Android tablet apps, Google Gemini integration and impressive speed even under multitasking pressure (plus that massive 8,400 mAh battery) and you've got a banger.</p><ul><li><em><strong>Read our </strong></em><a href="https://www.tomsguide.com/computing/android-tablets/samsung-galaxy-tab-s11-review"><em><strong>Samsung Galaxy Tab S11 review</strong></em></a></li></ul><h3 class="article-body__section" id="section-the-best-samsung-tablet-for-power-users"><span>The best Samsung tablet for power users</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YHb7i2SCuxbWHULRtcWkL4" name="Samsung Galaxy Tab S12 Ultra-5" alt="Samsung Galaxy Tab S12 Ultra" src="https://cdn.mos.cms.futurecdn.net/YHb7i2SCuxbWHULRtcWkL4-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" class=""><img id="WqLzPy4iPS8qbMqK42dYLY" class="endorsement-img endorsement-bottom-right" style="max-width: 100px; max-height: 100px;" src="https://cdn.mos.cms.futurecdn.net/WqLzPy4iPS8qbMqK42dYLY-1920-80.png" name="TG_badges_Recommended.png" alt="Tom's Guide Recommended product badge"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><div class="buying-guide-block"><h3 id="3-samsung-galaxy-tab-s12-ultra"><span class="title__text"><a href="https://www.tomsguide.com/computing/android-tablets/samsung-galaxy-tab-s12-ultra-review">3.  Samsung Galaxy Tab S12 Ultra</a></span><span class="chunk rating"><span class="icon icon-star"> </span><span class="icon icon-star"> </span><span class="icon icon-star"> </span><span class="icon icon-star"> </span></span></h3><div class="_hawk subtitle"><p>The best Samsung tablet for pure size and power</p></div><p class="specs__container"><strong>CPU: </strong>MediaTek Dimensity 9500 | <strong>Display: </strong>14.6-inch (2960 x 1848) AMOLED | <strong>Storage: </strong>Up to 1TB | <strong>Memory: </strong>12GB | <strong>Ports: </strong>USB-C, microSD | <strong>Dimensions: </strong>12.8 x 8.2 x 0.2 inches | <strong>Weight: </strong>1.6 pounds</p><div class="hawk-wrapper"></div><div class="icon icon-plus_circle _hawk">Gorgeous 14.6-inch OLED panel</div><div class="icon icon-plus_circle _hawk">Sturdy and elegant lightweight design</div><div class="icon icon-plus_circle _hawk">Strong performance</div><div class="icon icon-plus_circle _hawk">Long battery life</div><div class="icon icon-minus_circle _hawk">$200 price hike</div><div class="icon icon-minus_circle _hawk">DeX Mode requires an external monitor</div></div><p>The Samsung Galaxy Tab S12 Ultra takes what worked for last year’s Ultra model and makes it even more compelling for anyone eyeing up an enormous display: you get a huge 14.6-inch OLED display and an upgraded MediaTek Dimensity 9500 processor, giving you not just more workspace but more muscle for demanding tasks. As our reviewer, Tony, puts it, it's the best Android tablet yet — but you'll be paying a lot for it. </p><p>Yes, this is one massive display, but that's not all it has going for it. In our hands-on experience, it’s among the best OLEDs you’ll find on any tablet, with rich contrast and detail that make both deep work and downtime a pleasure. For instance, when watching a nature documentary, we found animals and landscapes pop with lifelike vibrancy. That's a real premium movie-watching slate.</p><p>Performance-wise, it’s robust enough to handle multitasking and intensive apps without slowing down, whether you’re juggling slides, spreadsheets or a dozen Chrome tabs. It's not quite enough to fully replace one of the <a href="https://www.tomsguide.com/computing/laptops/best-laptops">best laptops</a>, especially since <a href="https://www.tomsguide.com/computing/android-tablets/i-ditched-my-laptop-for-the-samsung-galaxy-tab-s11-ultra-heres-what-happened">Samsung's DeX Mode</a> only works with an external monitor, but it's enough to use more demanding apps. </p><p>Battery life lands at 11 hours and 31 minutes in our testing, which is respectable for a screen this size, though it trails the <a href="#elk-fb1befcc-a08e-11f1-8917-51123cd74262">S10 FE Plus</a>’s impressive 15:43 and is just behind the <a href="#elk-fb1bf300-a08e-11f1-90fd-8dffb54664c5">S11</a>. The trade-off for that extra screen real estate is a bit less stamina and a form factor that can feel cumbersome on the go, especially if you’re comparing to more compact options</p><p>Now, if your expectation is a seamless, laptop-replacement type switch, keep in mind that while the S12 Ultra makes work on the go possible and even enjoyable, it’s not a flawless laptop replacement. That said, for multitaskers who want a mighty and big tablet that can be used as a work machine, the Galaxy Tab S12 Ultra is our top Samsung pick.</p><ul><li><em><strong>Read our full </strong></em><a href="https://www.tomsguide.com/computing/android-tablets/samsung-galaxy-tab-s12-ultra-review"><em><strong>Samsung Galaxy Tab S12 Ultra review</strong></em></a></li></ul><h3 class="article-body__section" id="section-battery-life-test-results"><span>Battery life test results</span></h3><p>Despite having OLED displays and thin, lightweight designs, Samsung tablets have some of the best battery life we've tested. Each of our recommendations last over 9 hours, which is more than enough for long-haul trips or days out running between classes or the office.</p><p>Even the likes of the <a href="https://www.tomsguide.com/computing/ipads/apple-ipad-air-m4-review-small-tweaks-to-the-gold-standard">iPad Air M4</a>, one of the best iPads to get, can't keep up with Samsung's offerings. Check out how long each of our Samsung picks last. Just keep in mind that battery life depends on what you're using a tablet for: if you're playing demanding games on it all day, battery won't last as long!</p><div class="vizualizer-embed"><style>@import url('https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;700&display=swap');@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;700&display=swap');#fv-chart-1790850863761-ex8omnlta *, #fv-chart-1790850863761-ex8omnlta *:before, #fv-chart-1790850863761-ex8omnlta *:after, #fv-chart-1790850863761-ex8omnlta-slideshow *, #fv-chart-1790850863761-ex8omnlta-slideshow *:before, #fv-chart-1790850863761-ex8omnlta-slideshow *:after {box-sizing: border-box !important; margin: 0; padding: 0; border: 0;font-size: 100%; font: inherit; vertical-align: baseline;}#fv-chart-1790850863761-ex8omnlta, #fv-chart-1790850863761-ex8omnlta-slideshow { font-family: 'Open Sans', sans-serif !important; }#fv-chart-1790850863761-ex8omnlta {position: relative !important; overflow: visible !important;--riv-primary: #0072C6;}#fv-chart-1790850863761-ex8omnlta .fv-inner-wrapper {color: #1F2937 !important; background-color: #ffffff !important;padding: 1.5rem 1.5rem 2rem !important; border-radius: 0.5rem !important;box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1) !important;margin: 1rem 0 !important; display: flex !important; flex-direction: column !important;overflow: hidden !important;}#fv-chart-1790850863761-ex8omnlta .fv-inner-wrapper.fv-no-header.fv-is-image-compare {padding-top: 0 !important;}#fv-chart-1790850863761-ex8omnlta.fv-full-bleed {width: 100vw !important;margin-left: calc(50% - 50vw) !important;}body {overflow-x: clip !important;}#fv-chart-1790850863761-ex8omnlta.fv-full-bleed .fv-inner-wrapper {padding: 0 !important;border-radius: 0 !important;box-shadow: none !important;margin: 0 !important;background-color: transparent !important;}#fv-chart-1790850863761-ex8omnlta .fv-inner-wrapper.fv-is-shop-the-look {padding: 0 !important;border-radius: 0 !important;box-shadow: none !important;margin: 0 !important;background-color: transparent !important;}#fv-chart-1790850863761-ex8omnlta-slideshow {position: relative !important;width: 100% !important;margin: 1rem 0 !important;--riv-primary: #0072C6;}#fv-chart-1790850863761-ex8omnlta-slideshow .fv-slides-wrapper {position: relative !important;width: 100% !important;}#fv-chart-1790850863761-ex8omnlta-slideshow .fv-slide {width: 100% !important;animation: fv-fade-in 0.3s ease-in-out;}@keyframes fv-fade-in {from { opacity: 0; }to { opacity: 1; }}#fv-chart-1790850863761-ex8omnlta-slideshow .fv-slideshow-nav-row {position: relative !important;display: flex !important;justify-content: space-between !important;align-items: center !important;padding: 0 0 16px 0 !important;width: 100% !important;z-index: 20 !important;}#fv-chart-1790850863761-ex8omnlta-slideshow .fv-nav-btn {background-color: var(--riv-primary) !important;color: #ffffff !important;border: none !important;border-radius: 4px !important;padding: 8px 16px !important;font-size: 14px !important;font-weight: 700 !important;cursor: pointer !important;display: flex !important;align-items: center !important;justify-content: center !important;gap: 6px !important;transition: opacity 0.2s, background-color 0.2s !important;height: 36px !important;text-transform: none !important;box-shadow: 0 1px 2px rgba(0,0,0,0.1) !important;}#fv-chart-1790850863761-ex8omnlta-slideshow .fv-nav-btn svg {width: 18px !important;height: 18px !important;stroke-width: 3px !important;filter: none !important;}#fv-chart-1790850863761-ex8omnlta-slideshow .fv-nav-btn:hover {opacity: 0.9 !important;transform: translateY(-1px) !important;}#fv-chart-1790850863761-ex8omnlta-slideshow .fv-nav-btn.disabled {background-color: #E5E7EB !important;color: #9CA3AF !important;cursor: default !important;pointer-events: none !important;box-shadow: none !important;}#fv-chart-1790850863761-ex8omnlta-slideshow .fv-slide-counter {font-family: 'Poppins', sans-serif !important;font-size: 14px !important;font-weight: 600 !important;color: #374151 !important;text-align: center !important;min-width: 40px !important;background-color: rgba(255,255,255,0.8) !important;padding: 2px 8px !important;border-radius: 10px !important;}#fv-chart-1790850863761-ex8omnlta-slideshow .fv-slideshow-select {position: absolute !important;top: 10px !important;right: 10px !important;z-index: 20 !important;appearance: none !important;-webkit-appearance: none !important;-moz-appearance: none !important;background-color: white !important;border: 1px solid #d1d5db !important;color: #1F2937 !important;font-family: 'Open Sans', sans-serif !important;font-size: 14px !important;font-weight: 600 !important;padding: 6px 32px 6px 12px !important;border-radius: 4px !important;cursor: pointer !important;box-shadow: 0 1px 2px rgba(0,0,0,0.05) !important;background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e") !important;background-position: right 0.5rem center !important;background-repeat: no-repeat !important;background-size: 1.5em 1.5em !important;}#fv-chart-1790850863761-ex8omnlta-slideshow .fv-slideshow-select:focus {outline: 2px solid #0072C6 !important;border-color: #0072C6 !important;}#fv-chart-1790850863761-ex8omnlta .fv-chart-title {font-weight: bold !important;text-align: center !important;margin-bottom: 0.5rem !important;color: var(--riv-primary) !important;font-size: 20px !important;line-height: 1.2 !important;font-family: 'Open Sans', sans-serif !important;text-transform: none !important;white-space: normal !important;overflow-wrap: break-word !important;padding: 0 20px !important;}#fv-chart-1790850863761-ex8omnlta .fv-chart-subhead {font-size: 18px !important;font-weight: 500 !important;text-align: center !important;margin-bottom: 2rem !important;color: #374151 !important;line-height: 1.7 !important;font-family: 'Open Sans', sans-serif !important;display: block !important;text-transform: none !important;padding: 0 20px !important;}#fv-chart-1790850863761-ex8omnlta .rv-chart-caption { font-size: 15px !important; color: #374151 !important; text-align: center !important; font-style: normal !important; font-weight: normal !important; line-height: 1.7 !important; font-family: 'Open Sans', sans-serif !important; display: block !important; }#fv-chart-1790850863761-ex8omnlta .fv-versus-chart { display: flex; flex-direction: column; width: 100%; margin-top: 1rem; }#fv-chart-1790850863761-ex8omnlta .fv-versus-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1.5rem; padding: 0 1rem; }#fv-chart-1790850863761-ex8omnlta .fv-versus-select-wrapper { flex: 1; min-width: 0; }#fv-chart-1790850863761-ex8omnlta .fv-versus-select-wrapper.fv-left { text-align: center; padding-right: 1rem; }#fv-chart-1790850863761-ex8omnlta .fv-versus-select-wrapper.fv-right { text-align: center; padding-left: 1rem; }#fv-chart-1790850863761-ex8omnlta .fv-versus-select-container { position: relative; display: inline-block; max-width: 100%; width: 100%; }#fv-chart-1790850863761-ex8omnlta .fv-versus-chevron { position: absolute; top: 50%; transform: translateY(-50%); pointer-events: none; width: 16px; height: 16px; flex-shrink: 0; }#fv-chart-1790850863761-ex8omnlta .fv-versus-select-wrapper.fv-left .fv-versus-chevron { right: 0; }#fv-chart-1790850863761-ex8omnlta .fv-versus-select-wrapper.fv-right .fv-versus-chevron { right: 0; }#fv-chart-1790850863761-ex8omnlta .fv-versus-select { background: transparent; border: none; border-bottom: 2px solid; font-family: 'Poppins', sans-serif; font-weight: 700; font-size: 14px; padding: 0.25rem 0; cursor: pointer; outline: none; appearance: none; -webkit-appearance: none; -moz-appearance: none; max-width: 100%; width: 100%; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; }#fv-chart-1790850863761-ex8omnlta .fv-versus-select.fv-select-left { text-align: center; direction: ltr; padding-right: 1.25rem; }#fv-chart-1790850863761-ex8omnlta .fv-versus-select.fv-select-right { text-align: center; padding-right: 1.25rem; }#fv-chart-1790850863761-ex8omnlta .fv-versus-select option { font-family: 'Open Sans', sans-serif; font-weight: 400; font-size: 14px; color: #374151; direction: ltr; text-align: left; }#fv-chart-1790850863761-ex8omnlta .fv-versus-vs { font-family: 'Poppins', sans-serif; font-weight: 700; font-size: 14px; color: #374151; letter-spacing: 0.1em; padding: 0 1rem; }#fv-chart-1790850863761-ex8omnlta .fv-versus-body { display: flex; flex-direction: column; gap: 1.5rem; }#fv-chart-1790850863761-ex8omnlta .fv-versus-row { position: relative; height: auto; padding-top: 20px; margin-bottom: 0.25rem; display: block; }#fv-chart-1790850863761-ex8omnlta .fv-versus-bar-container { position: relative; height: 32px; display: flex; align-items: center; }#fv-chart-1790850863761-ex8omnlta .fv-versus-bar-left-wrapper { flex: 1; height: 100%; display: flex; justify-content: flex-end; align-items: center; }#fv-chart-1790850863761-ex8omnlta .fv-versus-bar-right-wrapper { flex: 1; height: 100%; display: flex; justify-content: flex-start; align-items: center; }#fv-chart-1790850863761-ex8omnlta .fv-versus-bar { height: 32px; width: var(--target-width); transition: width 0.8s ease-out; animation: fv-grow-max-width 0.8s ease-out forwards; display: flex; align-items: center; overflow: hidden; color: #ffffff; }#fv-chart-1790850863761-ex8omnlta .fv-versus-bar-left { border-radius: 4px 0 0 4px; justify-content: flex-end; padding: 0 8px; }#fv-chart-1790850863761-ex8omnlta .fv-versus-bar-right { border-radius: 0 4px 4px 0; justify-content: flex-start; padding: 0 8px; }@keyframes fv-grow-max-width {from { max-width: 0; }to { max-width: 100%; }}#fv-chart-1790850863761-ex8omnlta .fv-versus-center-line { position: absolute; left: 50%; top: 0; bottom: 0; width: 4px; background-color: #ffffff; transform: translateX(-50%); z-index: 1; }#fv-chart-1790850863761-ex8omnlta .fv-inside-left { white-space: nowrap; flex-shrink: 0; }#fv-chart-1790850863761-ex8omnlta .fv-inside-right { white-space: nowrap; flex-shrink: 0; }#fv-chart-1790850863761-ex8omnlta .fv-versus-val-text { font-family: 'Poppins', sans-serif; font-weight: 700; font-size: 14px; }#fv-chart-1790850863761-ex8omnlta .fv-versus-pct-diff { font-size: 12px; font-weight: 600; }#fv-chart-1790850863761-ex8omnlta .fv-versus-label { position: absolute; left: 50%; transform: translateX(-50%); top: 0; background-color: transparent; border: none; box-shadow: none; padding: 0; font-family: 'Open Sans', sans-serif; font-weight: 700; font-size: 14px; color: #374151; white-space: nowrap; }#fv-chart-1790850863761-ex8omnlta .sr-only { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0,0,0,0) !important; white-space: nowrap !important; border: 0 !important; }#fv-chart-1790850863761-ex8omnlta .fv-bottom-bar { display: flex !important; flex-direction: column !important; align-items: center !important; margin-top: 0.5rem !important; gap: 1rem !important; }#fv-chart-1790850863761-ex8omnlta .fv-footer-content { text-align: center !important; width: 100% !important; }#fv-chart-1790850863761-ex8omnlta .fv-logo {display: block !important;margin: 0 auto !important;width: 120px !important;min-width: 120px !important;max-width: 120px !important;height: auto !important;object-fit: contain !important;flex-shrink: 0 !important;}#fv-chart-1790850863761-ex8omnlta .fv-dropdown-wrapper { text-align: center !important; margin-bottom: 16px !important; margin-top: 0 !important; }#fv-chart-1790850863761-ex8omnlta .fv-dropdown-title-container { position: relative !important; display: inline-block !important; max-width: 100% !important; }#fv-chart-1790850863761-ex8omnlta .fv-dropdown-title {appearance: none !important;-webkit-appearance: none !important;-moz-appearance: none !important;background: transparent !important;border: none !important;font-size: 18px !important;font-weight: 600 !important;color: var(--riv-primary) !important;padding-right: 28px !important;padding-left: 10px !important;cursor: pointer !important;text-align: center !important;text-align-last: center !important;width: auto !important;max-width: 100% !important;font-family: 'Open Sans', sans-serif !important;line-height: 1.3 !important;margin: 0 !important;text-overflow: ellipsis !important;overflow: hidden !important;white-space: nowrap !important;}#fv-chart-1790850863761-ex8omnlta .fv-dropdown-title:focus { outline: none !important; }#fv-chart-1790850863761-ex8omnlta .fv-dropdown-title::-ms-expand { display: none !important; }#fv-chart-1790850863761-ex8omnlta .fv-dropdown-chevron {position: absolute !important;right: 0 !important;top: 50% !important;transform: translateY(-50%) !important;pointer-events: none !important;color: var(--riv-primary) !important;display: flex !important;align-items: center !important;}#fv-chart-1790850863761-ex8omnlta .fv-carousel-title-controls { display: flex !important; justify-content: space-between !important; align-items: center !important; margin-bottom: 16px !important; width: 100% !important; gap: 12px !important; }#fv-chart-1790850863761-ex8omnlta .fv-carousel-nav-btn {background: transparent !important; border: 1px solid #d1d5db !important; border-radius: 6px !important; padding: 6px 10px !important;cursor: pointer !important; font-size: 14px !important; color: #374151 !important; display: flex !important; align-items: center !important; gap: 4px !important; font-family: 'Open Sans', sans-serif !important;}#fv-chart-1790850863761-ex8omnlta .fv-carousel-nav-btn:hover { border-color: #9ca3af !important; }#fv-chart-1790850863761-ex8omnlta .fv-carousel-counter { font-size: 14px !important; color: #374151 !important; text-align: center !important; margin-top: 1rem !important; }#fv-chart-1790850863761-ex8omnlta .fv-legend { display: flex !important; justify-content: center !important; flex-wrap: wrap !important; gap: 8px 16px !important; margin: 0 !important; padding: 0 !important; margin-top: 1rem !important; }#fv-chart-1790850863761-ex8omnlta .fv-legend-item { display: flex !important; align-items: center !important; gap: 6px !important; font-size: 14px !important; color: #374151 !important; }#fv-chart-1790850863761-ex8omnlta .fv-legend-color { width: 12px !important; height: 12px !important; border-radius: 3px !important; }#fv-chart-1790850863761-ex8omnlta .fv-multi-value-legend {display: flex !important;justify-content: center !important;flex-wrap: wrap !important;gap: 12px 24px !important;margin-bottom: 1.5rem !important;padding: 0 !important;}#fv-chart-1790850863761-ex8omnlta .fv-multi-legend-item { display: flex !important; align-items: center !important; gap: 8px !important; font-size: 14px !important; color: #374151 !important; font-weight: 500 !important; }#fv-chart-1790850863761-ex8omnlta .fv-multi-legend-swatch { width: 16px !important; height: 16px !important; border-radius: 3px !important; }#fv-chart-1790850863761-ex8omnlta .fv-benchmark-group { margin-bottom: 1rem !important; }#fv-chart-1790850863761-ex8omnlta .fv-benchmark-title {font-size: 18px !important; font-weight: 600 !important; margin-bottom: 16px !important; margin-top: 0 !important; padding: 0 !important;text-align: center !important; color: var(--riv-primary) !important; flex: 1 !important; min-width: 0 !important;font-family: 'Open Sans', sans-serif !important; line-height: 1.3 !important;text-transform: none !important;white-space: normal !important;overflow-wrap: break-word !important;word-wrap: break-word !important;max-width: 100% !important;}#fv-chart-1790850863761-ex8omnlta .fv-bar-row, #fv-chart-1790850863761-ex8omnlta .fv-stacked-product { display: flex !important; align-items: center !important; width: 100% !important; margin-bottom: 0.75rem !important; position: relative !important; }#fv-chart-1790850863761-ex8omnlta .fv-bar-label { width: 150px !important; flex-shrink: 0 !important; font-size: 14px !important; color: #374151 !important; padding-right: 10px !important; text-align: right !important; font-weight: 500 !important; display: block !important; }#fv-chart-1790850863761-ex8omnlta .fv-bar-container { flex-grow: 1 !important; background-color: #E5E7EB !important; border-radius: 4px !important; min-height: 25px !important; border: 1px solid #D1D5DB !important; position: relative !important; display: flex !important; align-items: center !important; }#fv-chart-1790850863761-ex8omnlta .fv-bar-commentary-inline { display: none !important; position: absolute !important; left: 150px !important; top: 0 !important; bottom: 0 !important; right: 0 !important; width: calc(100% - 150px) !important; margin: 0 !important; padding: 0 8px !important; font-size: 13px !important; color: #fff !important; background: rgba(0,0,0,0.8) !important; border-radius: 4px !important; line-height: 1.4 !important; font-weight: normal !important; text-transform: none !important; word-wrap: break-word !important; z-index: 10 !important; align-items: center !important; overflow-y: auto !important; }#fv-chart-1790850863761-ex8omnlta.preview-wrapper .fv-bar-row:hover .fv-bar-commentary-inline, #fv-chart-1790850863761-ex8omnlta.preview-wrapper .fv-bar-commentary-inline:focus, #fv-chart-1790850863761-ex8omnlta.preview-wrapper .fv-bar-commentary-inline:focus-within, #fv-chart-1790850863761-ex8omnlta.mobile-view .fv-bar-row:hover .fv-bar-commentary-inline, #fv-chart-1790850863761-ex8omnlta.mobile-view .fv-bar-commentary-inline:focus, #fv-chart-1790850863761-ex8omnlta.mobile-view .fv-bar-commentary-inline:focus-within { display: flex !important; }#fv-chart-1790850863761-ex8omnlta .fv-bar { height: 100% !important; border-radius: 3px !important; display: flex !important; align-items: center !important; transition: opacity 0.2s ease, width 0.8s ease-out !important; min-height: 23px !important; }#fv-chart-1790850863761-ex8omnlta .fv-bar:hover { opacity: 0.8 !important; }#fv-chart-1790850863761-ex8omnlta .fv-bar-inner-content { display: flex !important; justify-content: space-between !important; align-items: center !important; width: 100% !important; height: 100% !important; padding: 0 8px !important; font-size: 14px !important; font-weight: bold !important; overflow: hidden !important; }#fv-chart-1790850863761-ex8omnlta .fv-bar-inner-label { white-space: nowrap !important; overflow: hidden !important; text-overflow: ellipsis !important; padding-right: 8px !important; }#fv-chart-1790850863761-ex8omnlta .fv-bar-inner-value { flex-shrink: 0 !important; }#fv-chart-1790850863761-ex8omnlta .fv-bar-value-outside { padding-left: 8px !important; font-size: 14px !important; font-weight: bold !important; color: #374151 !important; white-space: nowrap !important; }#fv-chart-1790850863761-ex8omnlta .fv-bar-label.fv-primary-product { font-weight: bold !important; color: var(--riv-primary) !important; }#fv-chart-1790850863761-ex8omnlta .fv-multi-bar-container { flex-direction: column !important; padding: 4px !important; align-items: stretch !important; gap: 4px !important; height: auto !important; }#fv-chart-1790850863761-ex8omnlta .fv-multi-bar-item { display: flex !important; align-items: center !important; height: 25px !important; width: 100% !important; }#fv-chart-1790850863761-ex8omnlta .fv-stacked-bar { display: flex !important; overflow: hidden !important; }#fv-chart-1790850863761-ex8omnlta .fv-stacked-segment { height: 100% !important; display: flex !important; align-items: center !important; justify-content: flex-end !important; padding-right: 8px !important; border-right: 1px solid rgba(255,255,255,0.3) !important; }#fv-chart-1790850863761-ex8omnlta .fv-stacked-segment:last-child { border-right: none !important; }#fv-chart-1790850863761-ex8omnlta .fv-segment-value { font-size: 14px !important; font-weight: bold !important; }#fv-chart-1790850863761-ex8omnlta .fv-grouped-bar-product { display: flex !important; flex-direction: column !important; width: 100% !important; margin-bottom: 1.25rem !important; }#fv-chart-1790850863761-ex8omnlta .fv-grouped-product-title-wrapper { padding-left: 150px !important; }#fv-chart-1790850863761-ex8omnlta .fv-grouped-product-title { width: 100% !important; text-align: left !important; padding-right: 0 !important; margin-bottom: 0.5rem !important; font-weight: 700 !important; font-size: 14px !important; color: #374151 !important; text-transform: none !important; }#fv-chart-1790850863761-ex8omnlta .fv-bar-cluster { width: 100% !important; flex-grow: 1 !important; display: flex !important; flex-direction: column !important; }#fv-chart-1790850863761-ex8omnlta .fv-bar-cluster .fv-bar-row { margin-bottom: 3px !important; }#fv-chart-1790850863761-ex8omnlta .fv-bar-cluster .fv-bar-container { height: 20px !important; }#fv-chart-1790850863761-ex8omnlta .riv-grid line {stroke: #D1D5DB !important;stroke-dasharray: 3 3 !important;}#fv-chart-1790850863761-ex8omnlta .fv-x-axis-wrapper { display: flex !important; width: 100% !important; margin-top: 0.5rem !important; }#fv-chart-1790850863761-ex8omnlta .fv-x-axis-label-space { width: 150px !important; padding-right: 10px !important; flex-shrink: 0 !important; }#fv-chart-1790850863761-ex8omnlta .fv-x-axis-chart-space { flex-grow: 1 !important; padding-right: 8px !important; }#fv-chart-1790850863761-ex8omnlta .fv-x-axis-wrapper.fv-grouped-x-axis { margin-left: 0 !important; }#fv-chart-1790850863761-ex8omnlta .fv-x-axis-line { border-top: 1px solid #D1D5DB !important; }#fv-chart-1790850863761-ex8omnlta .fv-x-axis-ticks { display: flex !important; justify-content: space-between !important; padding-top: 4px !important; font-size: 13px !important; color: #374151 !important; }#fv-chart-1790850863761-ex8omnlta .fv-x-axis-ticks span { position: relative !important; }#fv-chart-1790850863761-ex8omnlta .fv-x-axis-ticks span::before { content: '' !important; position: absolute !important; top: -6px !important; left: 50% !important; transform: translateX(-50%) !important; width: 2px !important; height: 4px !important; background-color: #D1D5DB !important; border-radius: 1px !important; }#fv-chart-1790850863761-ex8omnlta .fv-x-axis-unit { text-align: center !important; font-size: 14px !important; color: #374151 !important; margin-top: 8px !important; display: block !important; }#fv-chart-1790850863761-ex8omnlta .fv-x-axis-title { text-align: center !important; font-size: 15px !important; color: #374151 !important; margin-top: 8px !important; margin-bottom: 16px !important; line-height: 1.5 !important; padding: 0 1rem !important; display: block !important; font-weight: bold !important; }#fv-chart-1790850863761-ex8omnlta .fv-y-axis-title {font-size: 15px !important;color: #374151 !important;line-height: 1.5 !important;text-align: left !important;padding-left: 5.83% !important;margin-bottom: 4px !important;display: block !important;font-weight: bold !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-pie-container,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-pie-container {flex-direction: column !important; gap: 1rem !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-grouped-product-title-wrapper,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-grouped-product-title-wrapper {padding-left: 0 !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-bar-row,#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-stacked-product,#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-grouped-bar-product,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-bar-row,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-stacked-product,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-grouped-bar-product {flex-direction: column !important; align-items: flex-start !important; margin-bottom: 1.25rem !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-bar-label:not(.fv-grouped-product-title),#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-bar-label:not(.fv-grouped-product-title) {width: 100% !important; text-align: left !important; padding-right: 0 !important; margin-bottom: 0.25rem !important; font-size: 14px !important; font-weight: 700 !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-bar-label,#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-grouped-product-title,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-bar-label,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-grouped-product-title {width: 100% !important; text-align: left !important; padding-right: 0 !important; margin-bottom: 0.25rem !important; font-size: 14px !important; font-weight: 700 !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-bar-container,#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-bar-cluster,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-bar-container,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-bar-cluster {width: 100% !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-bar-row .fv-bar-commentary-inline,#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-bar-row:hover .fv-bar-commentary-inline,#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-bar-row .fv-bar-commentary-inline:focus,#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-bar-row .fv-bar-commentary-inline:focus-within,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-bar-row .fv-bar-commentary-inline,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-bar-row:hover .fv-bar-commentary-inline,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-bar-row .fv-bar-commentary-inline:focus,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-bar-row .fv-bar-commentary-inline:focus-within {position: static !important; display: block !important; width: 100% !important; margin: 4px 0 0 0 !important; padding: 0 !important; background: transparent !important; color: #6B7280 !important; font-size: 12px !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-x-axis-wrapper,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-x-axis-wrapper {margin-left: 0 !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-x-axis-label-space,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-x-axis-label-space {display: none !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-x-axis-chart-space,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-x-axis-chart-space {padding-right: 0 !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-benchmark-title,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-benchmark-title {font-size: 16px !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-dropdown-title,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-dropdown-title {font-size: 16px !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-carousel-nav-btn,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-carousel-nav-btn {padding: 8px 12px !important; font-size: 14px !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-chart-title,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-chart-title {padding: 0 8px !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-chart-subhead,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-chart-subhead {padding: 0 8px !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-versus-header,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-versus-header {flex-direction: column !important; align-items: center !important; padding: 0 !important; gap: 0.5rem !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-versus-select-wrapper,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-versus-select-wrapper {flex: 1 !important; min-width: 0 !important; width: 100% !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-versus-select-wrapper.fv-left,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-versus-select-wrapper.fv-left {text-align: center !important; padding-right: 0 !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-versus-select-wrapper.fv-right,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-versus-select-wrapper.fv-right {text-align: center !important; padding-left: 0 !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-versus-select.fv-select-left,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-versus-select.fv-select-left {text-align: center !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-versus-select.fv-select-right,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-versus-select.fv-select-right {text-align: center !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-versus-vs,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-versus-vs {text-align: center !important; padding: 0.25rem 0 !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-versus-select-container,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-versus-select-container {max-width: 100% !important; width: 100% !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-versus-select,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-versus-select {font-size: 14px !important; width: 100% !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-stl-shop-all-btn,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-stl-shop-all-btn {bottom: 0.5rem !important; right: 0.5rem !important; height: 2rem !important; font-size: 0.75rem !important; padding: 0 0.75rem 0 2.5rem !important; max-width: calc(100% - 1rem) !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-stl-shop-all-logo,#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-stl-shop-all-icon,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-stl-shop-all-logo,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-stl-shop-all-icon {width: 2rem !important; height: 2rem !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-stl-shop-all-icon svg,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-stl-shop-all-icon svg {width: 14px !important; height: 14px !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-bar-commentary-inline,#fv-chart-1790850863761-ex8omnlta.labels-on-top .fv-bar-commentary-inline {display: block !important; margin-left: 0 !important; width: 100% !important;}#fv-chart-1790850863761-ex8omnlta.mobile-view .fv-y-axis-title { padding-left: 5% !important;  }#fv-chart-1790850863761-ex8omnlta.mobile-view.fv-contains-line-chart .fv-footer-content {margin-left: -1rem !important;margin-right: -1rem !important;}@media (max-width: 599px) {#fv-chart-1790850863761-ex8omnlta .fv-pie-container {flex-direction: column !important; gap: 1rem !important;}#fv-chart-1790850863761-ex8omnlta .fv-grouped-product-title-wrapper {padding-left: 0 !important;}#fv-chart-1790850863761-ex8omnlta .fv-bar-row,#fv-chart-1790850863761-ex8omnlta .fv-stacked-product,#fv-chart-1790850863761-ex8omnlta .fv-grouped-bar-product {flex-direction: column !important; align-items: flex-start !important; margin-bottom: 1.25rem !important;}#fv-chart-1790850863761-ex8omnlta .fv-bar-label:not(.fv-grouped-product-title) {width: 100% !important; text-align: left !important; padding-right: 0 !important; margin-bottom: 0.25rem !important; font-size: 14px !important; font-weight: 700 !important;}#fv-chart-1790850863761-ex8omnlta .fv-bar-label,#fv-chart-1790850863761-ex8omnlta .fv-grouped-product-title {width: 100% !important; text-align: left !important; padding-right: 0 !important; margin-bottom: 0.25rem !important; font-size: 14px !important; font-weight: 700 !important;}#fv-chart-1790850863761-ex8omnlta .fv-bar-container,#fv-chart-1790850863761-ex8omnlta .fv-bar-cluster {width: 100% !important;}#fv-chart-1790850863761-ex8omnlta .fv-bar-row .fv-bar-commentary-inline,#fv-chart-1790850863761-ex8omnlta .fv-bar-row:hover .fv-bar-commentary-inline,#fv-chart-1790850863761-ex8omnlta .fv-bar-row .fv-bar-commentary-inline:focus,#fv-chart-1790850863761-ex8omnlta .fv-bar-row .fv-bar-commentary-inline:focus-within {position: static !important; display: block !important; width: 100% !important; margin: 4px 0 0 0 !important; padding: 0 !important; background: transparent !important; color: #6B7280 !important; font-size: 12px !important;}#fv-chart-1790850863761-ex8omnlta .fv-x-axis-wrapper {margin-left: 0 !important;}#fv-chart-1790850863761-ex8omnlta .fv-x-axis-label-space {display: none !important;}#fv-chart-1790850863761-ex8omnlta .fv-x-axis-chart-space {padding-right: 0 !important;}#fv-chart-1790850863761-ex8omnlta .fv-benchmark-title {font-size: 16px !important;}#fv-chart-1790850863761-ex8omnlta .fv-dropdown-title {font-size: 16px !important;}#fv-chart-1790850863761-ex8omnlta .fv-carousel-nav-btn {padding: 8px 12px !important; font-size: 14px !important;}#fv-chart-1790850863761-ex8omnlta .fv-chart-title {padding: 0 8px !important;}#fv-chart-1790850863761-ex8omnlta .fv-chart-subhead {padding: 0 8px !important;}#fv-chart-1790850863761-ex8omnlta .fv-versus-header {flex-direction: column !important; align-items: center !important; padding: 0 !important; gap: 0.5rem !important;}#fv-chart-1790850863761-ex8omnlta .fv-versus-select-wrapper {flex: 1 !important; min-width: 0 !important; width: 100% !important;}#fv-chart-1790850863761-ex8omnlta .fv-versus-select-wrapper.fv-left {text-align: center !important; padding-right: 0 !important;}#fv-chart-1790850863761-ex8omnlta .fv-versus-select-wrapper.fv-right {text-align: center !important; padding-left: 0 !important;}#fv-chart-1790850863761-ex8omnlta .fv-versus-select.fv-select-left {text-align: center !important;}#fv-chart-1790850863761-ex8omnlta .fv-versus-select.fv-select-right {text-align: center !important;}#fv-chart-1790850863761-ex8omnlta .fv-versus-vs {text-align: center !important; padding: 0.25rem 0 !important;}#fv-chart-1790850863761-ex8omnlta .fv-versus-select-container {max-width: 100% !important; width: 100% !important;}#fv-chart-1790850863761-ex8omnlta .fv-versus-select {font-size: 14px !important; width: 100% !important;}#fv-chart-1790850863761-ex8omnlta .fv-stl-shop-all-btn {bottom: 0.5rem !important; right: 0.5rem !important; height: 2rem !important; font-size: 0.75rem !important; padding: 0 0.75rem 0 2.5rem !important; max-width: calc(100% - 1rem) !important;}#fv-chart-1790850863761-ex8omnlta .fv-stl-shop-all-logo,#fv-chart-1790850863761-ex8omnlta .fv-stl-shop-all-icon {width: 2rem !important; height: 2rem !important;}#fv-chart-1790850863761-ex8omnlta .fv-stl-shop-all-icon svg {width: 14px !important; height: 14px !important;}#fv-chart-1790850863761-ex8omnlta .fv-bar-commentary-inline {display: block !important; margin-left: 0 !important; width: 100% !important;}#fv-chart-1790850863761-ex8omnlta .fv-y-axis-title { padding-left: 5% !important;  }#fv-chart-1790850863761-ex8omnlta.fv-contains-line-chart .fv-footer-content {margin-left: -1rem !important;margin-right: -1rem !important;}}</style><script type="application/ld+json">{"@context": "https://schema.org","@type": "Dataset","name": "Best Samsung Tablets Battery life Test Results","description": "In our battery test, we set the tablet's display to 150 nits of brightness and have it endlessly browse the web via Wi-Fi until it runs out of juice.","creator": {"@type": "Organization","name": "Toms Guide","logo": "https://cdn.mos.cms.futurecdn.net/KE3tZBYLQsQv2fhtXgLkuL.png"},"isAccessibleForFree": true,"dateCreated": "2026-10-01T10:34:23.764Z","citation": "Add your caption to explain the data, the learnings and the key takeaways of the data being visualized","keywords": ["Samsung Galaxy Tab S10 FE Plus","Samsung Galaxy Tab S11","Samsung Galaxy Tab S12 Ultra","Battery life (hh:mm:ss)","benchmark","comparison","performance","review","Toms Guide"],"measurementTechnique": "Performance Benchmarking","variableMeasured": [{"@type": "PropertyValue","name": "Samsung Galaxy Tab S10 FE Plus – Battery life (hh:mm:ss)","value": 15.716666666666667,"unitText": "hours"},{"@type": "PropertyValue","name": "Samsung Galaxy Tab S11 – Battery life (hh:mm:ss)","value": 9.75,"unitText": "hours"},{"@type": "PropertyValue","name": "Samsung Galaxy Tab S12 Ultra – Battery life (hh:mm:ss)","value": 11.516666666666667,"unitText": "hours"}]}</script><div id="fv-chart-1790850863761-ex8omnlta" class="fv-chart-wrapper   " data-bar-labels-on-top="false" data-iframe-height="true" data-vizualizer-embed="true"><div class="fv-inner-wrapper    "><h3 class="fv-chart-title">Best Samsung Tablets Battery life Test Results</h3><p class="fv-chart-subhead">In our battery test, we set the tablet's display to 150 nits of brightness and have it endlessly browse the web via Wi-Fi until it runs out of juice.</p><div class="riv-chart-container"><div class="fv-chart-item" id="fv-chart-1790850863761-ex8omnlta-bar-Battery life (hh:mm:ss)" data-chart-type="Bar" data-title="Battery life (hh:mm:ss)" data-subhead="In our battery test, we set the tablet's display to 150 nits of brightness and have it endlessly browse the web via Wi-Fi until it runs out of juice." data-caption="" style=""><div class="fv-benchmark-group"><h4 class="fv-benchmark-title">Battery life (hh:mm:ss)</h4><div class="fv-bar-row"><div class="fv-bar-label ">Samsung Galaxy Tab S10 FE Plus</div><div class="fv-bar-container"><div class="fv-bar" style="margin-left: 0%; width: 78.58333333333334%; background-color: #0072C6;" data-target-width="78.58333333333334" data-target-margin="0"><div class="fv-bar-inner-content" style="color: #ffffff !important; text-shadow: 1px 1px 1px rgba(0,0,0,0.3) !important; flex-direction: row;"><span></span><span class="fv-bar-inner-value">15:43:00</span></div></div></div></div><div class="fv-bar-row"><div class="fv-bar-label ">Samsung Galaxy Tab S11</div><div class="fv-bar-container"><div class="fv-bar" style="margin-left: 0%; width: 48.75%; background-color: #F57C00;" data-target-width="48.75" data-target-margin="0"><div class="fv-bar-inner-content" style="color: #1F2937 !important; text-shadow: none !important; flex-direction: row;"><span></span><span class="fv-bar-inner-value">09:45:00</span></div></div></div></div><div class="fv-bar-row"><div class="fv-bar-label ">Samsung Galaxy Tab S12 Ultra</div><div class="fv-bar-container"><div class="fv-bar" style="margin-left: 0%; width: 57.58333333333334%; background-color: #388E3C;" data-target-width="57.58333333333334" data-target-margin="0"><div class="fv-bar-inner-content" style="color: #ffffff !important; text-shadow: 1px 1px 1px rgba(0,0,0,0.3) !important; flex-direction: row;"><span></span><span class="fv-bar-inner-value">11:31:00</span></div></div></div></div><div class="fv-x-axis-wrapper"><div class="fv-x-axis-label-space"></div><div class="fv-x-axis-chart-space"><div class="fv-x-axis-line"></div><div class="fv-x-axis-ticks"><span>0</span><span>5</span><span>10</span><span>15</span><span>20</span></div><div class="fv-x-axis-unit">hours</div></div></div><table class="sr-only"><caption>Battery life (hh:mm:ss) Data</caption><thead><tr><th>Product</th><th>Value</th></tr></thead><tbody><tr><td>Samsung Galaxy Tab S10 FE Plus</td><td>15.716666666666667</td></tr><tr><td>Samsung Galaxy Tab S11</td><td>9.75</td></tr><tr><td>Samsung Galaxy Tab S12 Ultra</td><td>11.516666666666667</td></tr></tbody></table></div></div></div><div class="fv-bottom-bar"><div class="fv-footer-content" style="display: none;"><div class="rv-chart-caption" style="display: block;"><span class="fv-original-caption" style="display: block;"></span><span class="fv-ia-dynamic-caption" style="display: none;"></span></div></div><div class="fv-logo-explore-bar"><img class="fv-logo" src="https://cdn.mos.cms.futurecdn.net/KE3tZBYLQsQv2fhtXgLkuL.png" alt="Toms Guide Logo"></div></div></div></div><script>window.iFrameResizer = {heightCalculationMethod: 'taggedElement'};</script><script src="https://cdnjs.cloudflare.com/ajax/libs/iframe-resizer/4.2.11/iframeResizer.contentWindow.min.js" async></script><script>(function() {window.fvAnimateCharts = function(chartWrapper) {if (!chartWrapper) return;function animateBars(chartElement) {if (!chartElement) return;var bars = chartElement.querySelectorAll('.fv-bar, .fv-stacked-segment');bars.forEach(function(bar, index) {bar.style.setProperty('width', '0%', 'important');bar.style.setProperty('transition', 'none', 'important');var targetWidth = bar.dataset.targetWidth;if (targetWidth === undefined) return;void bar.offsetWidth;var targetMargin = bar.dataset.targetMargin;var baseMargin = bar.dataset.baseMargin;if (baseMargin !== undefined) {bar.style.setProperty('margin-left', baseMargin + '%', 'important');}setTimeout(function() {var marginTransition = baseMargin !== undefined ? ', margin-left 0.8s ease-out' : '';bar.style.setProperty('transition', 'opacity 0.2s ease, width 0.8s ease-out' + marginTransition, 'important');bar.style.setProperty('width', targetWidth + '%', 'important');if (targetMargin !== undefined && baseMargin !== undefined) {bar.style.setProperty('margin-left', targetMargin + '%', 'important');}}, index * 50 + 50);});}function animateLineChart(chartElement) {if (!chartElement) return;var lineSvg = chartElement.querySelector('svg');if (!lineSvg) return;var paths = lineSvg.querySelectorAll('.riv-line-path');paths.forEach(function(p, i) {if (typeof p.getTotalLength === 'function') {var len = p.getTotalLength();p.style.transition = 'none';p.style.strokeDasharray = len;p.style.strokeDashoffset = len;p.getBoundingClientRect();setTimeout(function() {p.style.transition = 'stroke-dashoffset 1s ease-out ' + (i * 0.1) + 's, stroke-width 0.2s, opacity 0.2s';p.style.strokeDashoffset = '0';}, 100);}});var dots = lineSvg.querySelectorAll('.riv-dot');dots.forEach(function(dot, i) {dot.style.opacity = '0';setTimeout(function() {dot.style.transition = 'opacity 0.3s ease';dot.style.opacity = '1';}, 500 + i * 10);});}var charts = chartWrapper.querySelectorAll('.fv-chart-item');charts.forEach(function(chart) {if (window.getComputedStyle(chart).display === 'none') return;var chartType = chart.dataset.chartType;if (chartType === 'Line') {animateLineChart(chart);} else if (chartType !== 'Pie') {animateBars(chart);}});};function initialize(uniqueId, isSlideshow) {var root = document.getElementById(uniqueId);if (!root && !isSlideshow) return;function setupWrapper(chartWrapper) {if (!chartWrapper) return;function checkMobileView() {var width = chartWrapper.getBoundingClientRect().width;var isMobileDevice = window.screen && Math.min(window.screen.width, window.screen.height) <= 599;var isMobile;if (width === 0) {isMobile = isMobileDevice || window.matchMedia('(max-width: 599px)').matches;} else {isMobile = isMobileDevice || width < 600;}if (isMobile) {chartWrapper.classList.add('mobile-view');} else {chartWrapper.classList.remove('mobile-view');}}checkMobileView();if (typeof ResizeObserver !== 'undefined') {var ro = new ResizeObserver(function() {checkMobileView();});ro.observe(chartWrapper);}window.addEventListener('resize', checkMobileView);var labelsOnTop = chartWrapper.dataset.barLabelsOnTop === 'true';if (labelsOnTop) {var charts = chartWrapper.querySelectorAll('.fv-chart-item');var hasVisibleBarChart = false;charts.forEach(function(c) {if (window.getComputedStyle(c).display !== 'none') {var cType = c.dataset.chartType;if (cType === 'Bar' || cType === 'Stacked Bar' || cType === 'Versus') {hasVisibleBarChart = true;}}});if (hasVisibleBarChart) {chartWrapper.classList.add('labels-on-top');} else {chartWrapper.classList.remove('labels-on-top');}} else {chartWrapper.classList.remove('labels-on-top');}chartWrapper.querySelectorAll('.riv-line-legend').forEach(function(legend) {var chartId = legend.dataset.chart;var chart = chartWrapper.querySelector('[id="' + chartId + '"]');if (!chart) return;var lines = chart.querySelectorAll('.riv-line-path');var dots = chart.querySelectorAll('.riv-dot');var legendItems = legend.querySelectorAll('.riv-legend-item');legendItems.forEach(function(item) {var productName = item.dataset.product;var safeProductName = productName.replace(/"/g, '\"');var line = chart.querySelector('.riv-line-path[data-product="' + safeProductName + '"]');var productDots = chart.querySelectorAll('.riv-dot[data-product="' + safeProductName + '"]');if (line && !line.dataset.origStroke) {line.dataset.origStroke = line.getAttribute('stroke-width') || '2';}var highlight = function() {if (legend.querySelector('.isolated')) return;lines.forEach(function(l) { l.style.opacity = '0.2'; l.setAttribute('stroke-width', l.dataset.origStroke); });dots.forEach(function(d) { d.style.opacity = '0.2'; });legendItems.forEach(function(i) { i.style.opacity = '0.3'; i.style.transition = 'opacity 0.2s'; });if (line) {line.style.opacity = '1';line.setAttribute('stroke-width', '4');}productDots.forEach(function(d) { d.style.opacity = '1'; });item.style.opacity = '1';};var clearHighlight = function() {if (legend.querySelector('.isolated')) return;lines.forEach(function(l) { l.style.opacity = '1'; l.setAttribute('stroke-width', l.dataset.origStroke); });dots.forEach(function(d) { d.style.opacity = '1'; });legendItems.forEach(function(i) { i.style.opacity = '1'; });};var toggleIsolate = function() {var isIsolated = item.classList.contains('isolated');legendItems.forEach(function(i) { i.classList.remove('isolated'); });if (isIsolated) {lines.forEach(function(l) { l.style.opacity = '1'; l.setAttribute('stroke-width', l.dataset.origStroke); });dots.forEach(function(d) { d.style.opacity = '1'; });legendItems.forEach(function(i) { i.style.opacity = '1'; });} else {item.classList.add('isolated');lines.forEach(function(l) { l.style.opacity = '0.2'; l.setAttribute('stroke-width', l.dataset.origStroke); });dots.forEach(function(d) { d.style.opacity = '0.2'; });legendItems.forEach(function(i) { i.style.opacity = '0.3'; i.style.transition = 'opacity 0.2s'; });if (line) {line.style.opacity = '1';line.setAttribute('stroke-width', '4');}productDots.forEach(function(d) { d.style.opacity = '1'; });item.style.opacity = '1';}};item.addEventListener('mouseenter', highlight);item.addEventListener('focus', highlight);item.addEventListener('mouseleave', clearHighlight);item.addEventListener('blur', clearHighlight);item.addEventListener('click', toggleIsolate);if (line) {line.style.cursor = 'pointer';line.addEventListener('mouseenter', highlight);line.addEventListener('mouseleave', clearHighlight);line.addEventListener('click', toggleIsolate);}});});var versusCharts = chartWrapper.querySelectorAll('.fv-versus-chart');versusCharts.forEach(function(vc) {var dataJson = vc.getAttribute('data-versus-data');var leftColor = vc.getAttribute('data-left-color') || '#E53935';var rightColor = vc.getAttribute('data-right-color') || '#FFB300';if (!dataJson) return;var versusData = JSON.parse(dataJson);var leftSelect = vc.querySelector('.fv-select-left');var rightSelect = vc.querySelector('.fv-select-right');var rows = vc.querySelectorAll('.fv-versus-row');function updateVersusChart() {var leftProduct = leftSelect.value;var rightProduct = rightSelect.value;leftSelect.style.color = leftColor;leftSelect.style.borderColor = leftColor;rightSelect.style.color = rightColor;rightSelect.style.borderColor = rightColor;rows.forEach(function(row) {var index = parseInt(row.getAttribute('data-index'));var data = versusData[index];if (!data) return;var leftVal = data.productData[leftProduct] ? data.productData[leftProduct].value : undefined;var rightVal = data.productData[rightProduct] ? data.productData[rightProduct].value : undefined;var leftIsNum = typeof leftVal === 'number';var rightIsNum = typeof rightVal === 'number';var leftNum = leftIsNum ? leftVal : 0;var rightNum = rightIsNum ? rightVal : 0;var maxVal = Math.max(leftNum, rightNum, 0.0001);var leftWidth = leftIsNum ? (leftNum / maxVal) * 95 : 0;var rightWidth = rightIsNum ? (rightNum / maxVal) * 85 : 0;var winner = null;var pctDiffStr = null;if (leftIsNum && rightIsNum) {if (leftNum > rightNum) {winner = 'left';if (rightNum > 0) {var diff = Math.round(((leftNum - rightNum) / rightNum) * 100);pctDiffStr = '+' + diff.toLocaleString() + '%';}} else if (rightNum > leftNum) {winner = 'right';if (leftNum > 0) {var diff = Math.round(((rightNum - leftNum) / leftNum) * 100);pctDiffStr = '+' + diff.toLocaleString() + '%';}}}var leftDisplay = data.productData[leftProduct] && data.productData[leftProduct].displayValue !== undefined ? data.productData[leftProduct].displayValue : (leftIsNum ? leftNum.toLocaleString() : (leftVal !== undefined ? leftVal : '-'));var rightDisplay = data.productData[rightProduct] && data.productData[rightProduct].displayValue !== undefined ? data.productData[rightProduct].displayValue : (rightIsNum ? rightNum.toLocaleString() : (rightVal !== undefined ? rightVal : '-'));var unit = (data.productData[leftProduct] && data.productData[leftProduct].unit) ||(data.productData[rightProduct] && data.productData[rightProduct].unit) || '';var leftTextStr = leftDisplay;var rightTextStr = rightDisplay;var leftBar = row.querySelector('.fv-versus-bar-left');var rightBar = row.querySelector('.fv-versus-bar-right');var leftText = row.querySelector('.fv-inside-left');var rightText = row.querySelector('.fv-inside-right');var labelText = row.querySelector('.fv-versus-label span');var leftWrapper = row.querySelector('.fv-versus-bar-left-wrapper');var rightWrapper = row.querySelector('.fv-versus-bar-right-wrapper');var existingPctDiffs = row.querySelectorAll('.fv-versus-pct-diff');existingPctDiffs.forEach(function(el) { el.remove(); });if (winner === 'left' && pctDiffStr) {var pctSpan = document.createElement('span');pctSpan.className = 'fv-versus-pct-diff';pctSpan.style.color = 'rgba(255, 255, 255, 0.9)';pctSpan.textContent = pctDiffStr;if (leftBar) leftBar.insertBefore(pctSpan, leftBar.firstChild);} else if (winner === 'right' && pctDiffStr) {var pctSpan = document.createElement('span');pctSpan.className = 'fv-versus-pct-diff';pctSpan.style.color = 'rgba(255, 255, 255, 0.9)';pctSpan.textContent = pctDiffStr;if (rightBar) rightBar.appendChild(pctSpan);}if (leftBar) {leftBar.style.backgroundColor = leftColor;leftBar.dataset.targetWidth = leftWidth;leftBar.style.setProperty('--target-width', leftWidth + '%');leftBar.style.width = leftWidth + '%';}if (rightBar) {rightBar.style.backgroundColor = rightColor;rightBar.dataset.targetWidth = rightWidth;rightBar.style.setProperty('--target-width', rightWidth + '%');rightBar.style.width = rightWidth + '%';}if (leftText) {leftText.innerHTML = leftTextStr;}if (rightText) {rightText.innerHTML = rightTextStr;}if (labelText) {labelText.textContent = data.attribute + (unit ? ' (' + unit + ')' : '');}});}if (leftSelect) leftSelect.addEventListener('change', updateVersusChart);if (rightSelect) rightSelect.addEventListener('change', updateVersusChart);});var barRows = chartWrapper.querySelectorAll('.fv-bar-row');var globalCaptionEl = chartWrapper.querySelector('.rv-chart-caption');var fallbackCaptionHtml = globalCaptionEl ? globalCaptionEl.innerHTML : '';barRows.forEach(function(row) {var commentaryEl = row.querySelector('[data-commentary-key]');if (commentaryEl) {var commentaryText = commentaryEl.textContent;if (commentaryText && commentaryText.trim().length > 0) {row.addEventListener('mouseenter', function() {if (!chartWrapper.classList.contains('mobile-view') && globalCaptionEl) {globalCaptionEl.innerHTML = commentaryText;globalCaptionEl.classList.add('fv-bar-active-caption');}});row.addEventListener('mouseleave', function() {if (!chartWrapper.classList.contains('mobile-view') && globalCaptionEl) {globalCaptionEl.innerHTML = fallbackCaptionHtml;globalCaptionEl.classList.remove('fv-bar-active-caption');}});}}});var charts = chartWrapper.querySelectorAll('.fv-chart-item');var dropdown = chartWrapper.querySelector('.fv-dropdown-title');var prevBtn = chartWrapper.querySelector('.fv-carousel-nav-btn.prev');var nextBtn = chartWrapper.querySelector('.fv-carousel-nav-btn.next');var carouselTitle = chartWrapper.querySelector('.fv-carousel-title-controls .fv-benchmark-title');var counter = chartWrapper.querySelector('.fv-carousel-counter');var subheadEl = chartWrapper.querySelector('.fv-chart-subhead');var captionEl = chartWrapper.querySelector('.rv-chart-caption');var footerContentEl = chartWrapper.querySelector('.fv-footer-content');var bottomBarEl = chartWrapper.querySelector('.fv-bottom-bar');var logoEl = chartWrapper.querySelector('.fv-logo');if (charts.length > 1 && (dropdown || prevBtn)) {var currentChartIndex = 0;var titles = [];if (dropdown) {titles = Array.from(dropdown.options).map(function(o) { return o.text; });} else {charts.forEach(function(c) {titles.push(c.getAttribute('data-title') || '');});}function showInternalChart(index) {if (index < 0) index = charts.length - 1;if (index >= charts.length) index = 0;currentChartIndex = index;charts.forEach(function(c, i) {c.style.display = i === index ? 'block' : 'none';if (i === index) {var cType = c.dataset.chartType;if (cType === 'Line') {} else if (cType !== 'Pie') {window.fvAnimateCharts(chartWrapper);}var labelsOnTop = chartWrapper.dataset.barLabelsOnTop === 'true';if (labelsOnTop && (cType === 'Bar' || cType === 'Stacked Bar' || cType === 'Versus')) {chartWrapper.classList.add('labels-on-top');} else {chartWrapper.classList.remove('labels-on-top');}}});if (dropdown) dropdown.value = index;if (carouselTitle && titles[index]) carouselTitle.textContent = titles[index];if (counter) counter.textContent = (index + 1) + ' of ' + charts.length;var activeChart = charts[index];if (activeChart) {var newSubhead = activeChart.getAttribute('data-subhead');var newCaption = activeChart.getAttribute('data-caption');var currentChartType = activeChart.getAttribute('data-chart-type');var hideGlobalCaption = currentChartType === 'Countdown' || currentChartType === 'Image Comparison' || currentChartType === 'Shop the Collection';if (subheadEl) subheadEl.textContent = newSubhead || '';if (captionEl) {captionEl.textContent = newCaption || '';fallbackCaptionHtml = newCaption || '';}if (footerContentEl) {if (newCaption && newCaption.trim().length > 0 && !hideGlobalCaption) {footerContentEl.style.display = 'block';if (bottomBarEl) bottomBarEl.style.display = 'flex';} else {footerContentEl.style.display = 'none';if (bottomBarEl && !logoEl) {bottomBarEl.style.display = 'none';}}}}}if (dropdown) dropdown.addEventListener('change', function(e) { showInternalChart(parseInt(e.target.value)); });if (prevBtn) prevBtn.addEventListener('click', function() { showInternalChart(currentChartIndex - 1); });if (nextBtn) nextBtn.addEventListener('click', function() { showInternalChart(currentChartIndex + 1); });}var imageCompareWrappers = chartWrapper.querySelectorAll('.fv-image-compare-wrapper');imageCompareWrappers.forEach(function(wrapper) {var inner = wrapper.querySelector('.fv-image-compare-inner') || wrapper;var slider = wrapper.querySelector('.fv-image-compare-slider');var fgImage = wrapper.querySelector('.fv-image-compare-fg');var bgImage = wrapper.querySelector('.fv-image-compare-bg');var labelLeft = wrapper.querySelector('.fv-image-compare-label-left');var labelRight = wrapper.querySelector('.fv-image-compare-label-right');var isDragging = false;var scale = 1;var panX = 0;var panY = 0;var isPanning = false;var hasPanned = false;var lastClientX = 0;var lastClientY = 0;var initialDistance = null;var lastCenterX = null;var lastCenterY = null;function updateTransform() {if (wrapper.classList.contains('fv-image-compare-fullscreen')) {inner.style.setProperty('transform', 'translate(' + panX + 'px, ' + panY + 'px) scale(' + scale + ')', 'important');} else {inner.style.removeProperty('transform');scale = 1;panX = 0;panY = 0;}}function constrainPan() {var rect = wrapper.getBoundingClientRect();var maxPanX = Math.max(0, (rect.width * scale - rect.width) / 2);var maxPanY = Math.max(0, (rect.height * scale - rect.height) / 2);panX = Math.max(-maxPanX, Math.min(panX, maxPanX));panY = Math.max(-maxPanY, Math.min(panY, maxPanY));}wrapper.addEventListener('wheel', function(e) {if (!wrapper.classList.contains('fv-image-compare-fullscreen')) return;e.preventDefault();var zoomSensitivity = 0.005;var zoomFactor = Math.exp(-e.deltaY * zoomSensitivity);var newScale = Math.max(1, Math.min(scale * zoomFactor, 5));if (newScale === scale) return;var rect = wrapper.getBoundingClientRect();var mouseX = e.clientX - rect.left - rect.width / 2;var mouseY = e.clientY - rect.top - rect.height / 2;var ratio = newScale / scale;panX = mouseX - (mouseX - panX) * ratio;panY = mouseY - (mouseY - panY) * ratio;scale = newScale;constrainPan();updateTransform();}, { passive: false });wrapper.addEventListener('mousedown', function(e) {if (!wrapper.classList.contains('fv-image-compare-fullscreen') || scale <= 1) return;if (e.target.closest('.fv-image-compare-slider') || e.target.closest('button')) return;isPanning = true;hasPanned = false;lastClientX = e.clientX;lastClientY = e.clientY;});window.addEventListener('mousemove', function(e) {if (!isPanning) return;var dx = e.clientX - lastClientX;var dy = e.clientY - lastClientY;if (Math.abs(dx) > 2 || Math.abs(dy) > 2) {hasPanned = true;}lastClientX = e.clientX;lastClientY = e.clientY;panX += dx;panY += dy;constrainPan();updateTransform();});window.addEventListener('mouseup', function() {isPanning = false;});wrapper.addEventListener('touchstart', function(e) {if (!wrapper.classList.contains('fv-image-compare-fullscreen')) return;if (e.touches.length === 2) {e.preventDefault();var dx = e.touches[0].clientX - e.touches[1].clientX;var dy = e.touches[0].clientY - e.touches[1].clientY;initialDistance = Math.sqrt(dx * dx + dy * dy);var rect = wrapper.getBoundingClientRect();lastCenterX = (e.touches[0].clientX + e.touches[1].clientX) / 2 - rect.left - rect.width / 2;lastCenterY = (e.touches[0].clientY + e.touches[1].clientY) / 2 - rect.top - rect.height / 2;hasPanned = true;} else if (e.touches.length === 1 && scale > 1) {if (e.target.closest('.fv-image-compare-slider') || e.target.closest('button')) return;isPanning = true;hasPanned = false;lastClientX = e.touches[0].clientX;lastClientY = e.touches[0].clientY;}}, { passive: false });wrapper.addEventListener('touchmove', function(e) {if (!wrapper.classList.contains('fv-image-compare-fullscreen')) return;if (e.touches.length === 2 && initialDistance !== null) {e.preventDefault();var dx = e.touches[0].clientX - e.touches[1].clientX;var dy = e.touches[0].clientY - e.touches[1].clientY;var distance = Math.sqrt(dx * dx + dy * dy);if (initialDistance > 0) {var zoomFactor = distance / initialDistance;var newScale = Math.max(1, Math.min(scale * zoomFactor, 5));var rect = wrapper.getBoundingClientRect();var centerX = (e.touches[0].clientX + e.touches[1].clientX) / 2 - rect.left - rect.width / 2;var centerY = (e.touches[0].clientY + e.touches[1].clientY) / 2 - rect.top - rect.height / 2;var ratio = newScale / scale;panX = centerX - (centerX - panX) * ratio;panY = centerY - (centerY - panY) * ratio;if (lastCenterX !== null && lastCenterY !== null) {panX += (centerX - lastCenterX);panY += (centerY - lastCenterY);}scale = newScale;lastCenterX = centerX;lastCenterY = centerY;constrainPan();updateTransform();}initialDistance = distance;} else if (e.touches.length === 1 && isPanning) {e.preventDefault();var dx = e.touches[0].clientX - lastClientX;var dy = e.touches[0].clientY - lastClientY;if (Math.abs(dx) > 2 || Math.abs(dy) > 2) {hasPanned = true;}lastClientX = e.touches[0].clientX;lastClientY = e.touches[0].clientY;panX += dx;panY += dy;constrainPan();updateTransform();}}, { passive: false });wrapper.addEventListener('touchend', function(e) {if (e.touches.length < 2) {initialDistance = null;}if (e.touches.length === 0) {isPanning = false;}});function handleMove(clientX) {var rect = inner.getBoundingClientRect();var x = Math.max(0, Math.min(clientX - rect.left, rect.width));var percent = Math.max(0, Math.min((x / rect.width) * 100, 100));if (slider) slider.style.setProperty('left', percent + '%', 'important');if (fgImage) fgImage.style.setProperty('clip-path', 'polygon(0 0, ' + percent + '% 0, ' + percent + '% 100%, 0 100%)', 'important');if (labelLeft) {if (percent < 10) {labelLeft.style.setProperty('opacity', '0', 'important');} else {labelLeft.style.setProperty('opacity', '1', 'important');}}if (labelRight) {if (percent > 90) {labelRight.style.setProperty('opacity', '0', 'important');} else {labelRight.style.setProperty('opacity', '1', 'important');}}}function onMouseMove(e) {if (!isDragging) return;handleMove(e.clientX);}function onTouchMove(e) {if (!isDragging) return;e.preventDefault();handleMove(e.touches[0].clientX);}function stopDragging() {isDragging = false;window.removeEventListener('mousemove', onMouseMove);window.removeEventListener('mouseup', stopDragging);window.removeEventListener('touchmove', onTouchMove);window.removeEventListener('touchend', stopDragging);}if (slider) {var startDrag = function(clientX) {isDragging = true;handleMove(clientX);window.addEventListener('mousemove', onMouseMove);window.addEventListener('mouseup', stopDragging);};var startTouchDrag = function(clientX) {isDragging = true;handleMove(clientX);window.addEventListener('touchmove', onTouchMove, { passive: false });window.addEventListener('touchend', stopDragging);};slider.addEventListener('mousedown', function(e) {e.preventDefault();startDrag(e.clientX);});slider.addEventListener('touchstart', function(e) {e.preventDefault();startTouchDrag(e.touches[0].clientX);}, { passive: false });}var expandBtn = wrapper.querySelector('.fv-image-compare-expand-btn');var closeBtn = wrapper.querySelector('.fv-image-compare-close-btn');if (expandBtn) {if (window !== window.parent) {expandBtn.style.display = 'none';} else {expandBtn.addEventListener('click', function(e) {e.stopPropagation();wrapper.classList.add('fv-image-compare-fullscreen');document.body.style.overflow = 'hidden';if (fgImage && fgImage.dataset.highresSrc) {fgImage.src = fgImage.dataset.highresSrc;fgImage.removeAttribute('srcset');fgImage.removeAttribute('sizes');}if (bgImage && bgImage.dataset.highresSrc) {bgImage.src = bgImage.dataset.highresSrc;bgImage.removeAttribute('srcset');bgImage.removeAttribute('sizes');}});}}if (closeBtn) {closeBtn.addEventListener('click', function(e) {e.stopPropagation();wrapper.classList.remove('fv-image-compare-fullscreen');document.body.style.overflow = '';updateTransform();});}document.addEventListener('keydown', function(e) {if (e.key === 'Escape' && wrapper.classList.contains('fv-image-compare-fullscreen')) {wrapper.classList.remove('fv-image-compare-fullscreen');document.body.style.overflow = '';updateTransform();}});});var hotspots = chartWrapper.querySelectorAll('.fv-stl-hotspot-btn');var allProductsModal = chartWrapper.querySelector('.fv-stl-all-products-modal');var shopAllBtn = chartWrapper.querySelector('.fv-stl-shop-all-btn');var allProductsList = chartWrapper.querySelector('.fv-stl-all-products-list');var stlContainer = chartWrapper.querySelector('.fv-stl-container');function closeAllModals() {if (allProductsModal) {allProductsModal.classList.remove('is-active');var items = allProductsModal.querySelectorAll('.fv-stl-all-products-item');items.forEach(function(item) {item.classList.remove('is-highlighted');});if (stlContainer) {setTimeout(function() {if (!allProductsModal.classList.contains('is-active')) {stlContainer.style.minHeight = '';if ('parentIFrame' in window) {window.parentIFrame.size();}}}, 300);}}hotspots.forEach(function(btn) { btn.setAttribute('aria-expanded', 'false'); });if ('parentIFrame' in window) {window.parentIFrame.size();}}hotspots.forEach(function(btn) {btn.addEventListener('click', function(e) {e.stopPropagation();var hotspotId = btn.getAttribute('data-hotspot-id');var isExpanded = btn.getAttribute('aria-expanded') === 'true';closeAllModals();if (!isExpanded && allProductsModal) {btn.setAttribute('aria-expanded', 'true');allProductsModal.classList.add('is-active');var container = btn.closest('.fv-stl-container');if (container && container.offsetHeight < 450) {container.style.minHeight = '450px';}var targetItem = allProductsModal.querySelector('.fv-stl-all-products-item[data-product-id="' + hotspotId + '"]');if (targetItem) {targetItem.classList.add('is-highlighted');setTimeout(function() {targetItem.scrollIntoView({ behavior: 'smooth', block: 'center' });}, 100);}if ('parentIFrame' in window) {window.parentIFrame.size();}}});});if (shopAllBtn && allProductsModal) {shopAllBtn.addEventListener('click', function(e) {e.stopPropagation();closeAllModals();allProductsModal.classList.add('is-active');var container = shopAllBtn.closest('.fv-stl-container');if (container && container.offsetHeight < 450) {container.style.minHeight = '450px';}if ('parentIFrame' in window) {window.parentIFrame.size();}});}if (allProductsModal) {var closeAllBtn = allProductsModal.querySelector('.fv-stl-all-products-close');if (closeAllBtn) {closeAllBtn.addEventListener('click', function(e) {e.stopPropagation();closeAllModals();});}}chartWrapper.addEventListener('click', function(e) {if (!e.target.closest('.fv-stl-all-products-content')) {closeAllModals();}});if (allProductsModal) {allProductsModal.addEventListener('click', function(e) {if (!e.target.closest('.fv-stl-all-products-content')) {closeAllModals();}});}var iaNodes = chartWrapper.querySelectorAll('.fv-ia-node-button');var iaWrapper = chartWrapper.querySelector('.fv-ia-wrapper');var originalCaption = chartWrapper.querySelector('.fv-original-caption') || captionEl;var dynamicCaption = chartWrapper.querySelector('.fv-ia-dynamic-caption');var exploreBtn = chartWrapper.querySelector('.fv-ia-explore-btn');var currentIaIndex = -1;function closeAllIANodes() {iaNodes.forEach(function(btn) { btn.classList.remove('is-active'); });if (originalCaption) originalCaption.style.display = 'block';if (dynamicCaption) dynamicCaption.style.display = 'none';}function resetExploreBtn() {currentIaIndex = -1;if (exploreBtn) {var exploreSpan = exploreBtn.querySelector('span');if (exploreSpan) exploreSpan.textContent = 'Explore';}}iaNodes.forEach(function(btn, index) {btn.addEventListener('click', function(e) {e.stopPropagation();var isActive = btn.classList.contains('is-active');closeAllIANodes();if (!isActive) {currentIaIndex = index;if (exploreBtn) {var exploreSpan = exploreBtn.querySelector('span');if (exploreSpan) exploreSpan.textContent = 'Next';}btn.classList.add('is-active');if (dynamicCaption) {var title = btn.getAttribute('data-title') || '';var desc = btn.getAttribute('data-desc') || '';dynamicCaption.innerHTML = '';var strongTag = document.createElement('strong');strongTag.textContent = title;dynamicCaption.appendChild(strongTag);if (desc) {dynamicCaption.appendChild(document.createTextNode(' - ' + desc));}if (originalCaption) originalCaption.style.display = 'none';dynamicCaption.style.display = 'block';if (footerContentEl) footerContentEl.style.display = 'block';}} else {resetExploreBtn();}});});if (exploreBtn) {exploreBtn.addEventListener('click', function(e) {e.stopPropagation();if (iaNodes.length === 0) return;var nextIndex = currentIaIndex + 1;if (nextIndex >= iaNodes.length) {closeAllIANodes();resetExploreBtn();} else {currentIaIndex = nextIndex;var targetBtn = iaNodes[currentIaIndex];if (targetBtn) {if(targetBtn.classList.contains('is-active')) {targetBtn.click();}targetBtn.click();}}});}if (iaWrapper) {iaWrapper.addEventListener('click', function(e) {if (!e.target.closest('.fv-ia-node-button') && !e.target.closest('.fv-ia-explore-btn')) {closeAllIANodes();resetExploreBtn();}});}window.fvAnimateCharts(chartWrapper);var countdownContainer = chartWrapper.querySelector('.fv-countdown-container');if (countdownContainer) {var targetDateAttr = countdownContainer.getAttribute('data-target-date');if (targetDateAttr) {var targetDate = new Date(targetDateAttr);var primaryColor = countdownContainer.getAttribute('data-primary-color') || '#f97316';var subheadColor = countdownContainer.getAttribute('data-subhead-color') || '#ffffff';var pad = function(n) { return (n < 10 ? '0' : '') + n; };var updateCountdown = function() {var difference = +targetDate - +new Date();var d = 0, h = 0, m = 0, s = 0;if (difference > 0) {d = Math.floor(difference / (1000 * 60 * 60 * 24));h = Math.floor((difference / (1000 * 60 * 60)) % 24);m = Math.floor((difference / 1000 / 60) % 60);s = Math.floor((difference / 1000) % 60);}var daysEl = countdownContainer.querySelector('[data-time="days"]');var hoursEl = countdownContainer.querySelector('[data-time="hours"]');var minsEl = countdownContainer.querySelector('[data-time="minutes"]');var secsEl = countdownContainer.querySelector('[data-time="seconds"]');if (daysEl) daysEl.textContent = d;if (hoursEl) hoursEl.textContent = pad(h);if (minsEl) minsEl.textContent = pad(m);if (secsEl) secsEl.textContent = pad(s);};updateCountdown();setInterval(updateCountdown, 1000);}}}if (false) {var slideshowContainer = document.getElementById(uniqueId + '-slideshow');if (slideshowContainer) {var slides = slideshowContainer.querySelectorAll('.fv-slide');slides.forEach(function(slide) {setupWrapper(slide.querySelector('.fv-chart-wrapper'));});}} else {setupWrapper(root);}}if (document.readyState === 'loading') {document.addEventListener('DOMContentLoaded', function() { initialize('fv-chart-1790850863761-ex8omnlta', false); });} else {initialize('fv-chart-1790850863761-ex8omnlta', false);}})();</script></div><h3 class="article-body__section" id="section-also-tested"><span>Also tested</span></h3><div class="product"><a data-dimension112="fb1bf68e-a08e-11f1-a60a-31480ecc4697" data-action="Deal Block" data-label="Galaxy Tab S10 Plus" data-dimension48="Galaxy Tab S10 Plus" data-dimension25="$1059" href="https://www.walmart.com/ip/Samsung-Galaxy-Tab-S10-12-4-Tablet-256GB-Android-14-Moonstone-Gray-S-Pen-Included/8947900220" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="eHJ8YVR6nTn43UYum8KYqn" name="Samsung Galaxy Tab S10 Plus" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/eHJ8YVR6nTn43UYum8KYqn-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>(★★★★☆)</strong></p><p>Samsung's Galaxy Tab S10 Plus is every bit as premium as its high price makes it out to be. From its colorful, 12.4-inch AMOLED display and included (and handy) stylus to its lightweight yet sizeable, portable design. It's still a great tablet to pick up, even with the S11 now outpacing it. It's a tablet that can take full advantage of what Android has to offer, but even at this price, it can't beat what Apple's iPads are dishing out. Plus, it's only gone up in price, so you're better off grabbing the <a href="#elk-fb1befcc-a08e-11f1-8917-51123cd74262" data-dimension112="fb1bf68e-a08e-11f1-a60a-31480ecc4697" data-action="Deal Block" data-label="Galaxy Tab S10 Plus" data-dimension48="Galaxy Tab S10 Plus" data-dimension25="$1059">Galaxy Tab S10 FE Plus</a>.</p><p><strong>Read our full </strong><a href="https://www.tomsguide.com/tablets/android-tablets/samsung-galaxy-tab-s10-plus-review-watch-out-ipad-pro"><strong>Samsung Galaxy Tab S10 Plus review</strong></a><strong></strong><a class="view-deal button" href="https://www.walmart.com/ip/Samsung-Galaxy-Tab-S10-12-4-Tablet-256GB-Android-14-Moonstone-Gray-S-Pen-Included/8947900220" target="_blank" rel="nofollow" data-dimension112="fb1bf68e-a08e-11f1-a60a-31480ecc4697" data-action="Deal Block" data-label="Galaxy Tab S10 Plus" data-dimension48="Galaxy Tab S10 Plus" data-dimension25="$1059">View Deal</a></p></div><h2 class="article-body__section" id="section-best-samsung-tablet-frequently-asked-questions"><span>Best Samsung Tablet: Frequently Asked Questions</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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="veiVMHga9Zd599FSGxErrh" name="Samsung Galaxy Tab S12 Ultra-6" alt="Samsung Galaxy Tab S12 Ultra" src="https://cdn.mos.cms.futurecdn.net/veiVMHga9Zd599FSGxErrh-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><section class="article__schema-question"><h3>Why should I buy a Samsung tablet over an iPad?</h3><article class="article__schema-answer"><p>Samsung tablets deliver better value and flexibility, especially if you're already in Samsung's ecosystem. The premium S Pen stylus is typically included, saving you money, and you get more versatile storage options thanks to the standard microSD card slot.</p><p>For productivity, Samsung’s DeX mode transforms the tablet into a PC-like desktop environment with true multitasking and resizable windows. Furthermore, many Galaxy Tabs feature a superior AMOLED display for richer, more immersive movie watching with perfect blacks.</p></article></section><section class="article__schema-question"><h3>Do Samsung tablets come with an S Pen?</h3><article class="article__schema-answer"><p>Many Samsung Galaxy Tab models include an S Pen, but you should check the box contents for the exact model before buying. All the Samsung tablets in this guide come with an S Pen included, which is great for note-taking, sketching or just doodling.</p><p>Compared to many of the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a> and <a href="https://www.tomsguide.com/best-picks/best-ipad">best iPads</a>, the included pen makes a Galaxy Tab better value than a tablet that requires a separate stylus purchase.</p></article></section><section class="article__schema-question"><h3>Can a Samsung tablet replace a laptop for work?</h3><article class="article__schema-answer"><p>This depends on the work you will do on a Samsung tablet. It can replace a laptop for email, web work, video calls, note-taking, documents and light multitasking, especially when paired with a keyboard and Samsung DeX. The Galaxy Tab S12 Ultra is a great alternative with its 14-inch display and when paired with the $399 Pro Keyboard, but that will ramp up the price. </p><p>But it's not a complete replacement for every workflow, as it still uses Android OS. Check that the Android versions of your essential work apps meet your needs, and note that DeX and keyboard accessories still have limitations compared with a usual laptop.</p></article></section><section class="article__schema-question"><h3>Are Samsung tablets on Android?</h3><article class="article__schema-answer"><p>Yes, Samsung Galaxy Tab tablets run Android, with Samsung’s One UI software layered on top. That gives you access to the Google Play Store and Samsung-specific features such as DeX on compatible models, which provides a more desktop-like interface for multitasking.</p><p>That means you get the full Google Play Store just like any other Android tablet, although Samsung offers a number of unique features, like Galaxy AI, that other Android tablets can't match.</p></article></section><h2 class="article-body__section" id="section-how-we-test-the-best-samsung-tablets"><span>How we test the best Samsung tablets</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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wpfa6TAsVmJYEjHGgTSnmC" name="Samsung Galaxy Tab S12 Ultra-2" alt="Samsung Galaxy Tab S12 Ultra" src="https://cdn.mos.cms.futurecdn.net/wpfa6TAsVmJYEjHGgTSnmC-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>We put every tablet through real-world and lab testing to see how it holds up — not just to the hype, but to the competition. That means using each device like an actual owner would, while also digging into the data that matters.</p><ul><li><strong>Battery life</strong>: We run a web-surfing test over Wi-Fi with the screen set to a standard brightness to see how long it lasts on a full charge.</li><li><strong>Display quality</strong>: We measure screen brightness (in nits) and color accuracy (via sRGB) to gauge how good it’ll look for work and play.</li><li><strong>Performance</strong>: We run benchmarks like Geekbench to see how fast and powerful the tablet really is.</li><li><strong>Software experience</strong>: On Android tablets, we check app availability and whether you’re getting full access to the Google Play Store.</li><li><strong>Parental controls</strong>: If a tablet offers kid-safe features, we try to break them — so your kids don’t.</li><li><strong>Everyday use</strong>: We spend days weeks using each tablet like any buyer would; opening apps, watching videos, multitasking, and seeing how it all feels in the hand.</li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 9 best early Black Friday tablet deals I've seen so far ]]></title>
                                                                                                <dc:content><![CDATA[ <p>We're still weeks away from Thanksgiving, but that hasn't kept major retailers from rolling out the <a href="https://www.tomsguide.com/live/news/best-black-friday-deals-sales-picked-by-experts">Black Friday deals</a> early. I know that well because I cover tablets for a living here at Tom's Guide, and I've started seeing prices drop at Amazon, Apple, Samsung and more. </p><p>The most exciting discounts are on new high-end slates like the <a href="https://www.amazon.com/dp/B0D3J9SMLK" target="_blank" rel="nofollow">13" iPad Pro M4 for $200 off</a>. You can also get over $60 off the 11" iPad Pro M5 given that's the best iPad ever released and it just launched last month!</p><p>But if you prefer Amazon or Android tablets you're in luck, because they're even cheaper than the iPads and feature bigger savings. For example, the recently-released<a href="https://www.amazon.com/Samsung-Processor-Note-Taking-Manufacturer-Warranty/dp/B0DVZSB68P" target="_blank" rel="nofollow"><strong> </strong>Samsung Galaxy Tab S10 FE+ is nearly $100 off @ Amazon </a>while the <a href="https://www.amazon.com/Amazon_Fire_HD_10/dp/B0BHZT5S12" target="_blank" rel="nofollow">Amazon Fire HD 10 is 50% off</a>, dropping it to under $100.  </p><p>There are more slates on sale below, so scroll down to have a gander at the best tablet deals I've found all month. I expect to see even deeper discounts and more sales as we get closer to Black Friday, so make sure to bookmark this page and check back if you don't find what you're looking for today!</p><h3 class="article-body__section" id="section-quick-links"><span>Quick links</span></h3><ul><li><strong>Amazon Fire HD 10 (Wi-Fi/32GB): </strong><a href="https://www.amazon.com/Amazon_Fire_HD_10/dp/B0BHZT5S12" target="_blank" rel="nofollow"><strong>was $139 now $69 @ Amazon</strong></a></li><li><strong>Amazon Fire Max 11 (Wi-Fi/128GB): </strong><a href="https://www.amazon.com/Amazon-powerful-display-octa-core-processor/dp/B0B2SFTGQ6" target="_blank" rel="nofollow"><strong>was $279 now $189 @ Amazon</strong></a></li><li><strong>Samsung Galaxy Tab S6 Lite: </strong><a href="https://www.amazon.com/SAMSUNG-Android-Included-Expandable-Exclusive/dp/B0CWS7W8Q1" target="_blank" rel="nofollow"><strong>was $329 now $209 @ Amazon</strong></a></li><li><strong>Apple iPad (Wi-Fi/128GB):</strong> <a href="https://target.georiot.com/Proxy.ashx?tsid=45724&GR_URL=https%3A%2F%2Famazon.com%2Fdp%2FB0DZ75TN5F%3Ftag%3Dhawk-future-20%26ascsubtag%3Dtomsguide-us-1109442591589040568-20" target="_blank" rel="nofollow"><strong>was $349 now $324</strong> @<strong> Amazon</strong></a></li><li><strong>Apple iPad Air 11"(Wi-Fi/128GB):</strong> <a href="https://target.georiot.com/Proxy.ashx?tsid=45724&GR_URL=https%3A%2F%2Famazon.com%2FApple-11-inch-Intelligence-Display-All-Day%2Fdp%2FB0DZ76BN5D%3Ftag%3Dhawk-future-20%26ascsubtag%3Dtomsguide-us-9813713268992008056-20" target="_blank" rel="nofollow"><strong>was $599 now $559</strong> @<strong> Amazon</strong></a></li><li><strong>Samsung Galaxy Tab S10 FE+ (Wi-Fi/128GB): </strong><a href="https://www.amazon.com/Samsung-Processor-Note-Taking-Manufacturer-Warranty/dp/B0DVZSB68P"><strong>was $649 now $579 @ Amazon</strong></a></li><li><strong>Apple iPad Air 13" (Wi-Fi/128GB):</strong> <a href="https://target.georiot.com/Proxy.ashx?tsid=45724&GR_URL=https%3A%2F%2Famazon.com%2Fdp%2FB0DZ76QBLQ%3Ftag%3Dhawk-future-20%26ascsubtag%3Dtomsguide-us-5253735488779008472-20" target="_blank" rel="nofollow"><strong>was $799 now $719</strong> @<strong> Amazon</strong></a></li><li><strong>Apple iPad Pro 11" (Wi-Fi/256GB):</strong> <a href="https://target.georiot.com/Proxy.ashx?tsid=45724&GR_URL=https%3A%2F%2Famazon.com%2FApple-iPad-Pro-11-Inch-Intelligence%2Fdp%2FB0D3J9XDMQ%3Fth%3D1%26tag%3Dhawk-future-20%26ascsubtag%3Dtomsguide-us-6878393495702529742-20" target="_blank" rel="nofollow"><strong>was $999 now $899</strong> @<strong> Amazon</strong></a></li><li><strong>Apple iPad Pro 13" (Wi-Fi/256GB):</strong> <a href="https://target.georiot.com/Proxy.ashx?tsid=45724&GR_URL=https%3A%2F%2Famazon.com%2Fdp%2FB0D3J9SMLK%3Fth%3D1%26tag%3Dhawk-future-20%26ascsubtag%3Dtomsguide-us-1433656105248441109-20" target="_blank" rel="nofollow"><strong>was $1,299 now $1,099</strong> @<strong> Amazon</strong></a></li></ul><h3 class="article-body__section" id="section-best-ipad-deals"><span>Best iPad deals</span></h3><div class="product"><a data-dimension112="8d77353e-391b-4c65-acf8-daf0e4ed8adf" data-action="Deal Block" data-label="11" iPad (WiFi/128GB)" data-dimension48="11" iPad (WiFi/128GB)" data-dimension25="$324" href="https://www.amazon.com/dp/B0DZ75TN5F" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1325px;"><p class="vanilla-image-block" style="padding-top:113.21%;"><img id="oi25obYHzoyNfMHoycGamh" name="iPad 2022 Blue.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/oi25obYHzoyNfMHoycGamh-1920-80.jpg" mos="" align="middle" fullscreen="" width="1325" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/dp/B0DZ75TN5F" target="_blank" rel="nofollow" data-dimension112="8d77353e-391b-4c65-acf8-daf0e4ed8adf" data-action="Deal Block" data-label='11" iPad (WiFi/128GB)' data-dimension48='11" iPad (WiFi/128GB)' data-dimension25="$324">11" iPad (WiFi/128GB): was $349 now $324</a></strong><br>This is a nice discount on the base iPad with 128GB of storage, and it's one of the best iPads yet. In our <a href="https://www.tomsguide.com/computing/ipads/ipad-11-2025-review">iPad 11 review</a> we lauded this tablet for its improved speed, longer battery life and the fact Apple finally bumped it up to 128GB of storage by default. <a class="view-deal button" href="https://www.amazon.com/dp/B0DZ75TN5F" target="_blank" rel="nofollow" data-dimension112="8d77353e-391b-4c65-acf8-daf0e4ed8adf" data-action="Deal Block" data-label="11" iPad (WiFi/128GB)" data-dimension48="11" iPad (WiFi/128GB)" data-dimension25="$324">View Deal</a></p></div><div class="product"><a data-dimension112="7d252838-2150-47ed-94bb-8ff6aa3bdb1b" data-action="Deal Block" data-label="iPad mini 7 (Wi-Fi + Cellular/128GB)" data-dimension48="iPad mini 7 (Wi-Fi + Cellular/128GB)" data-dimension25="$607" href="https://www.amazon.com/New-Apple-iPad-Mini-A17/dp/B0DK3WJTNQ" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1203px;"><p class="vanilla-image-block" style="padding-top:124.69%;"><img id="G2PjHEjHsRfuddfWSzPBjd" name="iPad mini 2024 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/G2PjHEjHsRfuddfWSzPBjd-1920-80.jpg" mos="" align="middle" fullscreen="" width="1203" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/New-Apple-iPad-Mini-A17/dp/B0DK3WJTNQ" target="_blank" rel="nofollow" data-dimension112="7d252838-2150-47ed-94bb-8ff6aa3bdb1b" data-action="Deal Block" data-label="iPad mini 7 (Wi-Fi + Cellular/128GB)" data-dimension48="iPad mini 7 (Wi-Fi + Cellular/128GB)" data-dimension25="$607">iPad mini 7 (Wi-Fi + Cellular/128GB): was $649 now $607</a></strong><br>This is a nice savings on the iPad mini 7 with Wi-Fi + cellular radio, though you'll be limited to Wi-Fi unless you pay for a cell line. This is a remarkably fast little tablet thanks to Apple's A17 Pro chip, and movies and comics look gorgeous on the 8.3-inch (2,266 x 1,488) Liquid Retina display. You also get 12MP cameras on the front and back and Wi-Fi 6e support.<a class="view-deal button" href="https://www.amazon.com/New-Apple-iPad-Mini-A17/dp/B0DK3WJTNQ" target="_blank" rel="nofollow" data-dimension112="7d252838-2150-47ed-94bb-8ff6aa3bdb1b" data-action="Deal Block" data-label="iPad mini 7 (Wi-Fi + Cellular/128GB)" data-dimension48="iPad mini 7 (Wi-Fi + Cellular/128GB)" data-dimension25="$607">View Deal</a></p></div><div class="product"><a data-dimension112="1fcbd1d3-9e01-41f1-bea1-51c6ca3a060c" data-action="Deal Block" data-label="11" iPad Air (Wi-Fi/128GB)" data-dimension48="11" iPad Air (Wi-Fi/128GB)" data-dimension25="$559" href="https://www.amazon.com/Apple-11-inch-Intelligence-Display-All-Day/dp/B0DZ76BN5D" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1325px;"><p class="vanilla-image-block" style="padding-top:113.21%;"><img id="NVZkwX7FuVd3CYdiYHdsgm" name="iPad Air 11 2024 deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/NVZkwX7FuVd3CYdiYHdsgm-1920-80.jpg" mos="" align="middle" fullscreen="" width="1325" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Apple-11-inch-Intelligence-Display-All-Day/dp/B0DZ76BN5D" target="_blank" rel="nofollow" data-dimension112="1fcbd1d3-9e01-41f1-bea1-51c6ca3a060c" data-action="Deal Block" data-label='11" iPad Air (Wi-Fi/128GB)' data-dimension48='11" iPad Air (Wi-Fi/128GB)' data-dimension25="$559">11" iPad Air (Wi-Fi/128GB): was $599 now $559</a></strong><br>Here's a sweet discount on the latest 11" iPad Air packing Apple's M3 processor, an 11-inch LED (2360 x 1640) display and 128GB of storage. I think this is generally the best iPad for most people because it's better than the basic iPad but doesn't cost as much as the iPad Pro, yet offers nearly all the same features. Check out our <a href="https://www.tomsguide.com/tablets/ipads/ipad-air-m3-review">iPad Air M3 review</a> to see what I mean!<a class="view-deal button" href="https://www.amazon.com/Apple-11-inch-Intelligence-Display-All-Day/dp/B0DZ76BN5D" target="_blank" rel="nofollow" data-dimension112="1fcbd1d3-9e01-41f1-bea1-51c6ca3a060c" data-action="Deal Block" data-label="11" iPad Air (Wi-Fi/128GB)" data-dimension48="11" iPad Air (Wi-Fi/128GB)" data-dimension25="$559">View Deal</a></p></div><div class="product"><a data-dimension112="2bec2383-ede9-497b-940b-85d1c85bda70" data-action="Deal Block" data-label="13" iPad Air (Wi-Fi/128GB)" data-dimension48="13" iPad Air (Wi-Fi/128GB)" data-dimension25="$719" href="https://www.amazon.com/dp/B0DZ76QBLQ" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1368px;"><p class="vanilla-image-block" style="padding-top:109.65%;"><img id="5LtYHnqoh7QQJRLor82SEG" name="iPad Air 13 2024 deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/5LtYHnqoh7QQJRLor82SEG-1920-80.jpg" mos="" align="middle" fullscreen="" width="1368" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/dp/B0DZ76QBLQ" target="_blank" rel="nofollow" data-dimension112="2bec2383-ede9-497b-940b-85d1c85bda70" data-action="Deal Block" data-label='13" iPad Air (Wi-Fi/128GB)' data-dimension48='13" iPad Air (Wi-Fi/128GB)' data-dimension25="$719">13" iPad Air (Wi-Fi/128GB): was $799 now $719</a></strong><br>Here's a bigger discount on a larger version of the iPad Air M3 sporting a 13-inch LED (2732 x 2048) display. Otherwise, it packs the same 128GB of storage, 12MP rear camera, WiFi 6E support, and 12MP front camera. The larger screen is really worth it if you plan to watch a lot of videos, read a lot of comics or play a lot of games.<a class="view-deal button" href="https://www.amazon.com/dp/B0DZ76QBLQ" target="_blank" rel="nofollow" data-dimension112="2bec2383-ede9-497b-940b-85d1c85bda70" data-action="Deal Block" data-label="13" iPad Air (Wi-Fi/128GB)" data-dimension48="13" iPad Air (Wi-Fi/128GB)" data-dimension25="$719">View Deal</a></p></div><div class="product"><a data-dimension112="4f44c384-4b6a-4a2b-9f81-3c01af4713d6" data-action="Deal Block" data-label="11" iPad Pro M5 (Wi-Fi/256GB)" data-dimension48="11" iPad Pro M5 (Wi-Fi/256GB)" data-dimension25="$937" href="https://www.amazon.com/Apple-iPad-Pro-11-inch-Landscape/dp/B0FWCXJVHN" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1308px;"><p class="vanilla-image-block" style="padding-top:114.68%;"><img id="kVGdyTH2y4y4yS5Mwos2bg" name="iPad Pro M5 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/kVGdyTH2y4y4yS5Mwos2bg-1920-80.jpg" mos="" align="middle" fullscreen="" width="1308" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Apple-iPad-Pro-11-inch-Landscape/dp/B0FWCXJVHN" target="_blank" rel="nofollow" data-dimension112="4f44c384-4b6a-4a2b-9f81-3c01af4713d6" data-action="Deal Block" data-label='11" iPad Pro M5 (Wi-Fi/256GB)' data-dimension48='11" iPad Pro M5 (Wi-Fi/256GB)' data-dimension25="$937">11" iPad Pro M5 (Wi-Fi/256GB): was $999 now $937</a></strong><br>This isn't a huge discount, but it's amazing you can get one at all given the iPad Pro M5 just came out last month and is Apple's fasted tablet yet. Not only does it have Apple's fastest chip inside and 256GB of storage, it sports a lovely 11-inch Ultra Retina XDR OLED Display that makes everything you do on it look amazing. Check out our recent <a href="https://www.tomsguide.com/computing/ipads/ipad-pro-m5-review">iPad Pro M5 review</a> to see it in action!<a class="view-deal button" href="https://www.amazon.com/Apple-iPad-Pro-11-inch-Landscape/dp/B0FWCXJVHN" target="_blank" rel="nofollow" data-dimension112="4f44c384-4b6a-4a2b-9f81-3c01af4713d6" data-action="Deal Block" data-label="11" iPad Pro M5 (Wi-Fi/256GB)" data-dimension48="11" iPad Pro M5 (Wi-Fi/256GB)" data-dimension25="$937">View Deal</a></p></div><div class="product"><a data-dimension112="17bbeb84-b125-4c0e-ba09-e59decf98c4f" data-action="Deal Block" data-label="13" iPad Pro M4 (Wi-Fi/256GB)" data-dimension48="13" iPad Pro M4 (Wi-Fi/256GB)" data-dimension25="$1099" href="https://www.amazon.com/dp/B0D3J9SMLK?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:954px;"><p class="vanilla-image-block" style="padding-top:109.96%;"><img id="mDVBPrQDtsBwRgt9E49kE" name="6533540cv11d.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/mDVBPrQDtsBwRgt9E49kE-1920-80.jpg" mos="" align="middle" fullscreen="" width="954" height="1049" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/dp/B0D3J9SMLK?th=1" target="_blank" rel="nofollow" data-dimension112="17bbeb84-b125-4c0e-ba09-e59decf98c4f" data-action="Deal Block" data-label='13" iPad Pro M4 (Wi-Fi/256GB)' data-dimension48='13" iPad Pro M4 (Wi-Fi/256GB)' data-dimension25="$1099">13" iPad Pro M4 (Wi-Fi/256GB): was $1299 now $1099</a></strong><br>Here's a heftier discount on the slightly older iPad Pro M4, which is still a killer tablet that runs circles around most thanks to its Apple M4 chip. The extra-large 13-inch Ultra Retina XDR display makes this the biggest and most powerful iPad you can buy, so if you want one I'd buy while it's discounted!<a class="view-deal button" href="https://www.amazon.com/dp/B0D3J9SMLK?th=1" target="_blank" rel="nofollow" data-dimension112="17bbeb84-b125-4c0e-ba09-e59decf98c4f" data-action="Deal Block" data-label="13" iPad Pro M4 (Wi-Fi/256GB)" data-dimension48="13" iPad Pro M4 (Wi-Fi/256GB)" data-dimension25="$1099">View Deal</a></p></div><h3 class="article-body__section" id="section-best-android-tablet-deals"><span>Best Android tablet deals</span></h3><div class="product"><a data-dimension112="25117e7f-cd8f-4745-8216-a6a8f67a228d" data-action="Deal Block" data-label="Galaxy Tab S10 FE+" data-dimension48="Galaxy Tab S10 FE+" data-dimension25="$579" href="https://www.amazon.com/Samsung-Processor-Note-Taking-Manufacturer-Warranty/dp/B0DVZSRJ8Q" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1080px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="6MtzjCmXKf5yE6GBQhiVZK" name="Samsung Galaxy Tab S10 FE deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6MtzjCmXKf5yE6GBQhiVZK-1920-80.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Save a nice chunk of change on Samsung's Galaxy Tab S10 FE+, a mid-range tablet that just launched this year and offers a big, beautiful 13.1-inch LCD panel and a 15+ hours of tested battery life. Read all about it in our <a href="https://www.tomsguide.com/computing/android-tablets/samsung-galaxy-tab-s10-fe-plus-review" data-dimension112="25117e7f-cd8f-4745-8216-a6a8f67a228d" data-action="Deal Block" data-label="Galaxy Tab S10 FE+" data-dimension48="Galaxy Tab S10 FE+" data-dimension25="$579">Samsung Galaxy Tab S10 FE+ review</a>!<a class="view-deal button" href="https://www.amazon.com/Samsung-Processor-Note-Taking-Manufacturer-Warranty/dp/B0DVZSRJ8Q" target="_blank" rel="nofollow" data-dimension112="25117e7f-cd8f-4745-8216-a6a8f67a228d" data-action="Deal Block" data-label="Galaxy Tab S10 FE+" data-dimension48="Galaxy Tab S10 FE+" data-dimension25="$579">View Deal</a></p></div><div class="product"><a data-dimension112="17a08ed2-9de2-475e-b3f4-9a16ba8884c8" data-action="Deal Block" data-label="Galaxy Tab S6 Lite (Wi-Fi/64GB)" data-dimension48="Galaxy Tab S6 Lite (Wi-Fi/64GB)" data-dimension25="$209" href="https://www.amazon.com/SAMSUNG-Android-Included-Expandable-Exclusive/dp/B0CWS7W8Q1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="iu52xR9j9dbqUcXvPYdYXJ" name="samsung-galaxy-tab-s6-lite.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/iu52xR9j9dbqUcXvPYdYXJ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/SAMSUNG-Android-Included-Expandable-Exclusive/dp/B0CWS7W8Q1" target="_blank" rel="nofollow" data-dimension112="17a08ed2-9de2-475e-b3f4-9a16ba8884c8" data-action="Deal Block" data-label="Galaxy Tab S6 Lite (Wi-Fi/64GB)" data-dimension48="Galaxy Tab S6 Lite (Wi-Fi/64GB)" data-dimension25="$209">Galaxy Tab S6 Lite (Wi-Fi/64GB): was $329 now $209</a></strong><br>This is one of the cheapest Android tablets around right now, but that doesn't mean it's cheap. The Samsung Tab S6 Lite is a small, low-powered Android tablet that sports a crisp 10.4-inch display and comes with an S Pen included at no charge, making it ideal for students and anyone who want to sketch or take notes on the go.<a class="view-deal button" href="https://www.amazon.com/SAMSUNG-Android-Included-Expandable-Exclusive/dp/B0CWS7W8Q1" target="_blank" rel="nofollow" data-dimension112="17a08ed2-9de2-475e-b3f4-9a16ba8884c8" data-action="Deal Block" data-label="Galaxy Tab S6 Lite (Wi-Fi/64GB)" data-dimension48="Galaxy Tab S6 Lite (Wi-Fi/64GB)" data-dimension25="$209">View Deal</a></p></div><h3 class="article-body__section" id="section-best-amazon-fire-tablet-deals"><span>Best Amazon Fire tablet deals</span></h3><div class="product"><a data-dimension112="adfce41b-0295-4317-85dd-7d41d9895b40" data-action="Deal Block" data-label="Fire HD 8 (32GB)" data-dimension48="Fire HD 8 (32GB)" data-dimension25="$64" href="https://www.amazon.com/Fire-HD-8-Tablet-Black-32GB/dp/B0CVDN4QS6" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:61.12%;"><img id="c7scFvcqtXymm8gKhGQe8P" name="Fire HD 8" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/c7scFvcqtXymm8gKhGQe8P-1920-80.jpg" mos="" align="middle" fullscreen="" width="679" height="415" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Fire-HD-8-Tablet-Black-32GB/dp/B0CVDN4QS6" target="_blank" rel="nofollow" data-dimension112="adfce41b-0295-4317-85dd-7d41d9895b40" data-action="Deal Block" data-label="Fire HD 8 (32GB)" data-dimension48="Fire HD 8 (32GB)" data-dimension25="$64">Fire HD 8 (32GB): was $99 now $64</a></strong><br>The Fire HD 8 is the smallest Amazon Fire tablet I would recommend you buy, because the smaller Fire 7 has a far worse screen. The HD 8, by comparison, comes with 32GB of storage and offers a nice balance between price and performance, one that's even more appealing now that it's over 30% off. <a class="view-deal button" href="https://www.amazon.com/Fire-HD-8-Tablet-Black-32GB/dp/B0CVDN4QS6" target="_blank" rel="nofollow" data-dimension112="adfce41b-0295-4317-85dd-7d41d9895b40" data-action="Deal Block" data-label="Fire HD 8 (32GB)" data-dimension48="Fire HD 8 (32GB)" data-dimension25="$64">View Deal</a></p></div><div class="product"><a data-dimension112="f34a203d-2338-4729-89f4-7863ee355a4b" data-action="Deal Block" data-label="Fire HD 8 Kids Pro (32GB)" data-dimension48="Fire HD 8 Kids Pro (32GB)" data-dimension25="$84" href="https://www.amazon.com/Fire-HD-8-Kids-Pro-Tablet-Hello-Teal-32GB/dp/B0D1DMSV9G" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="wfVXyu6vVfuSfdRZTfKzM9" name="fire_hd.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/wfVXyu6vVfuSfdRZTfKzM9-1920-80.png" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Fire-HD-8-Kids-Pro-Tablet-Hello-Teal-32GB/dp/B0D1DMSV9G" target="_blank" rel="nofollow" data-dimension112="f34a203d-2338-4729-89f4-7863ee355a4b" data-action="Deal Block" data-label="Fire HD 8 Kids Pro (32GB)" data-dimension48="Fire HD 8 Kids Pro (32GB)" data-dimension25="$84">Fire HD 8 Kids Pro (32GB): was $139 now $84</a></strong><br>The Fire HD 8 Kids Pro is basically just the Fire HD 8 but with a kid-friendly case (to protect it against drops) and a free year of Amazon's Kids+, a subscription service that serves up kid-oriented books and other content. This is a great tablet for older kids that aren't teenagers yet, especially at this discounted price.<a class="view-deal button" href="https://www.amazon.com/Fire-HD-8-Kids-Pro-Tablet-Hello-Teal-32GB/dp/B0D1DMSV9G" target="_blank" rel="nofollow" data-dimension112="f34a203d-2338-4729-89f4-7863ee355a4b" data-action="Deal Block" data-label="Fire HD 8 Kids Pro (32GB)" data-dimension48="Fire HD 8 Kids Pro (32GB)" data-dimension25="$84">View Deal</a></p></div><div class="product"><a data-dimension112="bb10c0dd-cb45-4e3f-a104-a93960f16f96" data-action="Deal Block" data-label="Fire HD 10 (32GB)" data-dimension48="Fire HD 10 (32GB)" data-dimension25="$69" href="https://www.amazon.com/Amazon_Fire_HD_10/dp/B0BHZT5S12/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:62.15%;"><img id="TpirEEi3bsKZ757xACgtXn" name="Fire HD 10" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/TpirEEi3bsKZ757xACgtXn-1920-80.jpg" mos="" align="middle" fullscreen="" width="679" height="422" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Amazon_Fire_HD_10/dp/B0BHZT5S12/" target="_blank" rel="nofollow" data-dimension112="bb10c0dd-cb45-4e3f-a104-a93960f16f96" data-action="Deal Block" data-label="Fire HD 10 (32GB)" data-dimension48="Fire HD 10 (32GB)" data-dimension25="$69">Fire HD 10 (32GB): was $139 now $69</a></strong><br>The Fire HD 10 is an Amazon tablet that feels like a legit iPad alternative since it gives you a 10.1-inch screen driven by an octa-core CPU, admittedly with a paltry 3GB of RAM and 32GB of storage space. This is a nice discount on the cheaper HD 10 that comes with lockscreen ads, but you can pay a small fee to permanently remove them down the line if you get tired of them.<a class="view-deal button" href="https://www.amazon.com/Amazon_Fire_HD_10/dp/B0BHZT5S12/" target="_blank" rel="nofollow" data-dimension112="bb10c0dd-cb45-4e3f-a104-a93960f16f96" data-action="Deal Block" data-label="Fire HD 10 (32GB)" data-dimension48="Fire HD 10 (32GB)" data-dimension25="$69">View Deal</a></p></div><div class="product"><a data-dimension112="0e39ff65-cde8-47ca-91ab-1ca84d38da6c" data-action="Deal Block" data-label="Fire Max 11 (128GB)" data-dimension48="Fire Max 11 (128GB)" data-dimension25="$189" href="https://www.amazon.com/Amazon-powerful-display-octa-core-processor/dp/B0B2SFTGQ6" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:971px;"><p class="vanilla-image-block" style="padding-top:98.97%;"><img id="W32SXhGpu9zii4qV32cA8e" name="fire_max_11.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/W32SXhGpu9zii4qV32cA8e-1920-80.jpg" mos="" align="middle" fullscreen="" width="971" height="961" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Amazon-powerful-display-octa-core-processor/dp/B0B2SFTGQ6" target="_blank" rel="nofollow" data-dimension112="0e39ff65-cde8-47ca-91ab-1ca84d38da6c" data-action="Deal Block" data-label="Fire Max 11 (128GB)" data-dimension48="Fire Max 11 (128GB)" data-dimension25="$189">Fire Max 11 (128GB): was $279 now $189</a></strong><br>The Fire Max 11 is the biggest and fastest Amazon Fire tablet you can buy, and right now you can get one for over 30% off. Like all Fire tablets this slate runs on FireOS (which is more limited than Android) and sports a bright 11-inch 2K screen powered by a 2.2GHz octa-core Mediatek MT8188J CPU, 4GB RAM and 64GB of storage. In our <a href="https://www.tomsguide.com/reviews/amazon-fire-max-11">Fire Max 11 review </a>we called it Amazon's best Fire tablet yet, and if you act fast you can score one for a killer discount!<a class="view-deal button" href="https://www.amazon.com/Amazon-powerful-display-octa-core-processor/dp/B0B2SFTGQ6" target="_blank" rel="nofollow" data-dimension112="0e39ff65-cde8-47ca-91ab-1ca84d38da6c" data-action="Deal Block" data-label="Fire Max 11 (128GB)" data-dimension48="Fire Max 11 (128GB)" data-dimension25="$189">View Deal</a></p></div><div data-model-name="Apple iPad Air (2024),OnePlus Pad,Amazon Fire 7 (2022),Samsung Galaxy Tab S9 Ultra,Apple iPad Pro M5,Microsoft Surface Pro 11th Generation" data-widget-type="multimodelreview" data-widget-title="Today’s tablet deals"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/tablets/9-best-early-black-friday-tablet-deals-ive-seen-so-far</link>
                                                                            <description>
                            <![CDATA[ Black Friday sales now last at least a month, and it felt like the best early Black Friday tablet deals started dropping as soon as Halloween ended. I've been skimming prices all month, and for my money these are the best Black Friday tablet deals you can get! ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">ejvCEenHqLoNw4nB6gPa8L</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/o88WLrmwEfRmkZwtUg52VN-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 13 Nov 2025 11:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                                                                <author><![CDATA[ alex.wawro@futurenet.com (Alex Wawro) ]]></author>                    <dc:creator><![CDATA[ Alex Wawro ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/Y4wW9n7CZrNzgofqVkGA5J-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Alex Wawro was a senior editor for computing at Tom’s Guide. A lifelong tech and games enthusiast, he has more than a decade of experience covering both for outlets like Game Developer, Black Hat, and PC World magazine. &lt;/p&gt;&lt;p&gt;  &lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/o88WLrmwEfRmkZwtUg52VN-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple iPad tablet held up with best Black Friday tablet deals badge superimposed]]></media:description>                                                            <media:text><![CDATA[Apple iPad tablet held up with best Black Friday tablet deals badge superimposed]]></media:text>
                                <media:title type="plain"><![CDATA[Apple iPad tablet held up with best Black Friday tablet deals badge superimposed]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/o88WLrmwEfRmkZwtUg52VN-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>We're still weeks away from Thanksgiving, but that hasn't kept major retailers from rolling out the <a href="https://www.tomsguide.com/live/news/best-black-friday-deals-sales-picked-by-experts">Black Friday deals</a> early. I know that well because I cover tablets for a living here at Tom's Guide, and I've started seeing prices drop at Amazon, Apple, Samsung and more. </p><p>The most exciting discounts are on new high-end slates like the <a href="https://www.amazon.com/dp/B0D3J9SMLK" target="_blank" rel="nofollow">13" iPad Pro M4 for $200 off</a>. You can also get over $60 off the 11" iPad Pro M5 given that's the best iPad ever released and it just launched last month!</p><p>But if you prefer Amazon or Android tablets you're in luck, because they're even cheaper than the iPads and feature bigger savings. For example, the recently-released<a href="https://www.amazon.com/Samsung-Processor-Note-Taking-Manufacturer-Warranty/dp/B0DVZSB68P" target="_blank" rel="nofollow"><strong> </strong>Samsung Galaxy Tab S10 FE+ is nearly $100 off @ Amazon </a>while the <a href="https://www.amazon.com/Amazon_Fire_HD_10/dp/B0BHZT5S12" target="_blank" rel="nofollow">Amazon Fire HD 10 is 50% off</a>, dropping it to under $100.  </p><p>There are more slates on sale below, so scroll down to have a gander at the best tablet deals I've found all month. I expect to see even deeper discounts and more sales as we get closer to Black Friday, so make sure to bookmark this page and check back if you don't find what you're looking for today!</p><h3 class="article-body__section" id="section-quick-links"><span>Quick links</span></h3><ul><li><strong>Amazon Fire HD 10 (Wi-Fi/32GB): </strong><a href="https://www.amazon.com/Amazon_Fire_HD_10/dp/B0BHZT5S12" target="_blank" rel="nofollow"><strong>was $139 now $69 @ Amazon</strong></a></li><li><strong>Amazon Fire Max 11 (Wi-Fi/128GB): </strong><a href="https://www.amazon.com/Amazon-powerful-display-octa-core-processor/dp/B0B2SFTGQ6" target="_blank" rel="nofollow"><strong>was $279 now $189 @ Amazon</strong></a></li><li><strong>Samsung Galaxy Tab S6 Lite: </strong><a href="https://www.amazon.com/SAMSUNG-Android-Included-Expandable-Exclusive/dp/B0CWS7W8Q1" target="_blank" rel="nofollow"><strong>was $329 now $209 @ Amazon</strong></a></li><li><strong>Apple iPad (Wi-Fi/128GB):</strong> <a href="https://target.georiot.com/Proxy.ashx?tsid=45724&GR_URL=https%3A%2F%2Famazon.com%2Fdp%2FB0DZ75TN5F%3Ftag%3Dhawk-future-20%26ascsubtag%3Dtomsguide-us-1109442591589040568-20" target="_blank" rel="nofollow"><strong>was $349 now $324</strong> @<strong> Amazon</strong></a></li><li><strong>Apple iPad Air 11"(Wi-Fi/128GB):</strong> <a href="https://target.georiot.com/Proxy.ashx?tsid=45724&GR_URL=https%3A%2F%2Famazon.com%2FApple-11-inch-Intelligence-Display-All-Day%2Fdp%2FB0DZ76BN5D%3Ftag%3Dhawk-future-20%26ascsubtag%3Dtomsguide-us-9813713268992008056-20" target="_blank" rel="nofollow"><strong>was $599 now $559</strong> @<strong> Amazon</strong></a></li><li><strong>Samsung Galaxy Tab S10 FE+ (Wi-Fi/128GB): </strong><a href="https://www.amazon.com/Samsung-Processor-Note-Taking-Manufacturer-Warranty/dp/B0DVZSB68P"><strong>was $649 now $579 @ Amazon</strong></a></li><li><strong>Apple iPad Air 13" (Wi-Fi/128GB):</strong> <a href="https://target.georiot.com/Proxy.ashx?tsid=45724&GR_URL=https%3A%2F%2Famazon.com%2Fdp%2FB0DZ76QBLQ%3Ftag%3Dhawk-future-20%26ascsubtag%3Dtomsguide-us-5253735488779008472-20" target="_blank" rel="nofollow"><strong>was $799 now $719</strong> @<strong> Amazon</strong></a></li><li><strong>Apple iPad Pro 11" (Wi-Fi/256GB):</strong> <a href="https://target.georiot.com/Proxy.ashx?tsid=45724&GR_URL=https%3A%2F%2Famazon.com%2FApple-iPad-Pro-11-Inch-Intelligence%2Fdp%2FB0D3J9XDMQ%3Fth%3D1%26tag%3Dhawk-future-20%26ascsubtag%3Dtomsguide-us-6878393495702529742-20" target="_blank" rel="nofollow"><strong>was $999 now $899</strong> @<strong> Amazon</strong></a></li><li><strong>Apple iPad Pro 13" (Wi-Fi/256GB):</strong> <a href="https://target.georiot.com/Proxy.ashx?tsid=45724&GR_URL=https%3A%2F%2Famazon.com%2Fdp%2FB0D3J9SMLK%3Fth%3D1%26tag%3Dhawk-future-20%26ascsubtag%3Dtomsguide-us-1433656105248441109-20" target="_blank" rel="nofollow"><strong>was $1,299 now $1,099</strong> @<strong> Amazon</strong></a></li></ul><h3 class="article-body__section" id="section-best-ipad-deals"><span>Best iPad deals</span></h3><div class="product"><a data-dimension112="8d77353e-391b-4c65-acf8-daf0e4ed8adf" data-action="Deal Block" data-label="11" iPad (WiFi/128GB)" data-dimension48="11" iPad (WiFi/128GB)" data-dimension25="$324" href="https://www.amazon.com/dp/B0DZ75TN5F" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1325px;"><p class="vanilla-image-block" style="padding-top:113.21%;"><img id="oi25obYHzoyNfMHoycGamh" name="iPad 2022 Blue.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/oi25obYHzoyNfMHoycGamh-1920-80.jpg" mos="" align="middle" fullscreen="" width="1325" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/dp/B0DZ75TN5F" target="_blank" rel="nofollow" data-dimension112="8d77353e-391b-4c65-acf8-daf0e4ed8adf" data-action="Deal Block" data-label='11" iPad (WiFi/128GB)' data-dimension48='11" iPad (WiFi/128GB)' data-dimension25="$324">11" iPad (WiFi/128GB): was $349 now $324</a></strong><br>This is a nice discount on the base iPad with 128GB of storage, and it's one of the best iPads yet. In our <a href="https://www.tomsguide.com/computing/ipads/ipad-11-2025-review">iPad 11 review</a> we lauded this tablet for its improved speed, longer battery life and the fact Apple finally bumped it up to 128GB of storage by default. <a class="view-deal button" href="https://www.amazon.com/dp/B0DZ75TN5F" target="_blank" rel="nofollow" data-dimension112="8d77353e-391b-4c65-acf8-daf0e4ed8adf" data-action="Deal Block" data-label="11" iPad (WiFi/128GB)" data-dimension48="11" iPad (WiFi/128GB)" data-dimension25="$324">View Deal</a></p></div><div class="product"><a data-dimension112="7d252838-2150-47ed-94bb-8ff6aa3bdb1b" data-action="Deal Block" data-label="iPad mini 7 (Wi-Fi + Cellular/128GB)" data-dimension48="iPad mini 7 (Wi-Fi + Cellular/128GB)" data-dimension25="$607" href="https://www.amazon.com/New-Apple-iPad-Mini-A17/dp/B0DK3WJTNQ" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1203px;"><p class="vanilla-image-block" style="padding-top:124.69%;"><img id="G2PjHEjHsRfuddfWSzPBjd" name="iPad mini 2024 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/G2PjHEjHsRfuddfWSzPBjd-1920-80.jpg" mos="" align="middle" fullscreen="" width="1203" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/New-Apple-iPad-Mini-A17/dp/B0DK3WJTNQ" target="_blank" rel="nofollow" data-dimension112="7d252838-2150-47ed-94bb-8ff6aa3bdb1b" data-action="Deal Block" data-label="iPad mini 7 (Wi-Fi + Cellular/128GB)" data-dimension48="iPad mini 7 (Wi-Fi + Cellular/128GB)" data-dimension25="$607">iPad mini 7 (Wi-Fi + Cellular/128GB): was $649 now $607</a></strong><br>This is a nice savings on the iPad mini 7 with Wi-Fi + cellular radio, though you'll be limited to Wi-Fi unless you pay for a cell line. This is a remarkably fast little tablet thanks to Apple's A17 Pro chip, and movies and comics look gorgeous on the 8.3-inch (2,266 x 1,488) Liquid Retina display. You also get 12MP cameras on the front and back and Wi-Fi 6e support.<a class="view-deal button" href="https://www.amazon.com/New-Apple-iPad-Mini-A17/dp/B0DK3WJTNQ" target="_blank" rel="nofollow" data-dimension112="7d252838-2150-47ed-94bb-8ff6aa3bdb1b" data-action="Deal Block" data-label="iPad mini 7 (Wi-Fi + Cellular/128GB)" data-dimension48="iPad mini 7 (Wi-Fi + Cellular/128GB)" data-dimension25="$607">View Deal</a></p></div><div class="product"><a data-dimension112="1fcbd1d3-9e01-41f1-bea1-51c6ca3a060c" data-action="Deal Block" data-label="11" iPad Air (Wi-Fi/128GB)" data-dimension48="11" iPad Air (Wi-Fi/128GB)" data-dimension25="$559" href="https://www.amazon.com/Apple-11-inch-Intelligence-Display-All-Day/dp/B0DZ76BN5D" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1325px;"><p class="vanilla-image-block" style="padding-top:113.21%;"><img id="NVZkwX7FuVd3CYdiYHdsgm" name="iPad Air 11 2024 deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/NVZkwX7FuVd3CYdiYHdsgm-1920-80.jpg" mos="" align="middle" fullscreen="" width="1325" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Apple-11-inch-Intelligence-Display-All-Day/dp/B0DZ76BN5D" target="_blank" rel="nofollow" data-dimension112="1fcbd1d3-9e01-41f1-bea1-51c6ca3a060c" data-action="Deal Block" data-label='11" iPad Air (Wi-Fi/128GB)' data-dimension48='11" iPad Air (Wi-Fi/128GB)' data-dimension25="$559">11" iPad Air (Wi-Fi/128GB): was $599 now $559</a></strong><br>Here's a sweet discount on the latest 11" iPad Air packing Apple's M3 processor, an 11-inch LED (2360 x 1640) display and 128GB of storage. I think this is generally the best iPad for most people because it's better than the basic iPad but doesn't cost as much as the iPad Pro, yet offers nearly all the same features. Check out our <a href="https://www.tomsguide.com/tablets/ipads/ipad-air-m3-review">iPad Air M3 review</a> to see what I mean!<a class="view-deal button" href="https://www.amazon.com/Apple-11-inch-Intelligence-Display-All-Day/dp/B0DZ76BN5D" target="_blank" rel="nofollow" data-dimension112="1fcbd1d3-9e01-41f1-bea1-51c6ca3a060c" data-action="Deal Block" data-label="11" iPad Air (Wi-Fi/128GB)" data-dimension48="11" iPad Air (Wi-Fi/128GB)" data-dimension25="$559">View Deal</a></p></div><div class="product"><a data-dimension112="2bec2383-ede9-497b-940b-85d1c85bda70" data-action="Deal Block" data-label="13" iPad Air (Wi-Fi/128GB)" data-dimension48="13" iPad Air (Wi-Fi/128GB)" data-dimension25="$719" href="https://www.amazon.com/dp/B0DZ76QBLQ" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1368px;"><p class="vanilla-image-block" style="padding-top:109.65%;"><img id="5LtYHnqoh7QQJRLor82SEG" name="iPad Air 13 2024 deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/5LtYHnqoh7QQJRLor82SEG-1920-80.jpg" mos="" align="middle" fullscreen="" width="1368" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/dp/B0DZ76QBLQ" target="_blank" rel="nofollow" data-dimension112="2bec2383-ede9-497b-940b-85d1c85bda70" data-action="Deal Block" data-label='13" iPad Air (Wi-Fi/128GB)' data-dimension48='13" iPad Air (Wi-Fi/128GB)' data-dimension25="$719">13" iPad Air (Wi-Fi/128GB): was $799 now $719</a></strong><br>Here's a bigger discount on a larger version of the iPad Air M3 sporting a 13-inch LED (2732 x 2048) display. Otherwise, it packs the same 128GB of storage, 12MP rear camera, WiFi 6E support, and 12MP front camera. The larger screen is really worth it if you plan to watch a lot of videos, read a lot of comics or play a lot of games.<a class="view-deal button" href="https://www.amazon.com/dp/B0DZ76QBLQ" target="_blank" rel="nofollow" data-dimension112="2bec2383-ede9-497b-940b-85d1c85bda70" data-action="Deal Block" data-label="13" iPad Air (Wi-Fi/128GB)" data-dimension48="13" iPad Air (Wi-Fi/128GB)" data-dimension25="$719">View Deal</a></p></div><div class="product"><a data-dimension112="4f44c384-4b6a-4a2b-9f81-3c01af4713d6" data-action="Deal Block" data-label="11" iPad Pro M5 (Wi-Fi/256GB)" data-dimension48="11" iPad Pro M5 (Wi-Fi/256GB)" data-dimension25="$937" href="https://www.amazon.com/Apple-iPad-Pro-11-inch-Landscape/dp/B0FWCXJVHN" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1308px;"><p class="vanilla-image-block" style="padding-top:114.68%;"><img id="kVGdyTH2y4y4yS5Mwos2bg" name="iPad Pro M5 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/kVGdyTH2y4y4yS5Mwos2bg-1920-80.jpg" mos="" align="middle" fullscreen="" width="1308" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Apple-iPad-Pro-11-inch-Landscape/dp/B0FWCXJVHN" target="_blank" rel="nofollow" data-dimension112="4f44c384-4b6a-4a2b-9f81-3c01af4713d6" data-action="Deal Block" data-label='11" iPad Pro M5 (Wi-Fi/256GB)' data-dimension48='11" iPad Pro M5 (Wi-Fi/256GB)' data-dimension25="$937">11" iPad Pro M5 (Wi-Fi/256GB): was $999 now $937</a></strong><br>This isn't a huge discount, but it's amazing you can get one at all given the iPad Pro M5 just came out last month and is Apple's fasted tablet yet. Not only does it have Apple's fastest chip inside and 256GB of storage, it sports a lovely 11-inch Ultra Retina XDR OLED Display that makes everything you do on it look amazing. Check out our recent <a href="https://www.tomsguide.com/computing/ipads/ipad-pro-m5-review">iPad Pro M5 review</a> to see it in action!<a class="view-deal button" href="https://www.amazon.com/Apple-iPad-Pro-11-inch-Landscape/dp/B0FWCXJVHN" target="_blank" rel="nofollow" data-dimension112="4f44c384-4b6a-4a2b-9f81-3c01af4713d6" data-action="Deal Block" data-label="11" iPad Pro M5 (Wi-Fi/256GB)" data-dimension48="11" iPad Pro M5 (Wi-Fi/256GB)" data-dimension25="$937">View Deal</a></p></div><div class="product"><a data-dimension112="17bbeb84-b125-4c0e-ba09-e59decf98c4f" data-action="Deal Block" data-label="13" iPad Pro M4 (Wi-Fi/256GB)" data-dimension48="13" iPad Pro M4 (Wi-Fi/256GB)" data-dimension25="$1099" href="https://www.amazon.com/dp/B0D3J9SMLK?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:954px;"><p class="vanilla-image-block" style="padding-top:109.96%;"><img id="mDVBPrQDtsBwRgt9E49kE" name="6533540cv11d.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/mDVBPrQDtsBwRgt9E49kE-1920-80.jpg" mos="" align="middle" fullscreen="" width="954" height="1049" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/dp/B0D3J9SMLK?th=1" target="_blank" rel="nofollow" data-dimension112="17bbeb84-b125-4c0e-ba09-e59decf98c4f" data-action="Deal Block" data-label='13" iPad Pro M4 (Wi-Fi/256GB)' data-dimension48='13" iPad Pro M4 (Wi-Fi/256GB)' data-dimension25="$1099">13" iPad Pro M4 (Wi-Fi/256GB): was $1299 now $1099</a></strong><br>Here's a heftier discount on the slightly older iPad Pro M4, which is still a killer tablet that runs circles around most thanks to its Apple M4 chip. The extra-large 13-inch Ultra Retina XDR display makes this the biggest and most powerful iPad you can buy, so if you want one I'd buy while it's discounted!<a class="view-deal button" href="https://www.amazon.com/dp/B0D3J9SMLK?th=1" target="_blank" rel="nofollow" data-dimension112="17bbeb84-b125-4c0e-ba09-e59decf98c4f" data-action="Deal Block" data-label="13" iPad Pro M4 (Wi-Fi/256GB)" data-dimension48="13" iPad Pro M4 (Wi-Fi/256GB)" data-dimension25="$1099">View Deal</a></p></div><h3 class="article-body__section" id="section-best-android-tablet-deals"><span>Best Android tablet deals</span></h3><div class="product"><a data-dimension112="25117e7f-cd8f-4745-8216-a6a8f67a228d" data-action="Deal Block" data-label="Galaxy Tab S10 FE+" data-dimension48="Galaxy Tab S10 FE+" data-dimension25="$579" href="https://www.amazon.com/Samsung-Processor-Note-Taking-Manufacturer-Warranty/dp/B0DVZSRJ8Q" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1080px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="6MtzjCmXKf5yE6GBQhiVZK" name="Samsung Galaxy Tab S10 FE deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6MtzjCmXKf5yE6GBQhiVZK-1920-80.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Save a nice chunk of change on Samsung's Galaxy Tab S10 FE+, a mid-range tablet that just launched this year and offers a big, beautiful 13.1-inch LCD panel and a 15+ hours of tested battery life. Read all about it in our <a href="https://www.tomsguide.com/computing/android-tablets/samsung-galaxy-tab-s10-fe-plus-review" data-dimension112="25117e7f-cd8f-4745-8216-a6a8f67a228d" data-action="Deal Block" data-label="Galaxy Tab S10 FE+" data-dimension48="Galaxy Tab S10 FE+" data-dimension25="$579">Samsung Galaxy Tab S10 FE+ review</a>!<a class="view-deal button" href="https://www.amazon.com/Samsung-Processor-Note-Taking-Manufacturer-Warranty/dp/B0DVZSRJ8Q" target="_blank" rel="nofollow" data-dimension112="25117e7f-cd8f-4745-8216-a6a8f67a228d" data-action="Deal Block" data-label="Galaxy Tab S10 FE+" data-dimension48="Galaxy Tab S10 FE+" data-dimension25="$579">View Deal</a></p></div><div class="product"><a data-dimension112="17a08ed2-9de2-475e-b3f4-9a16ba8884c8" data-action="Deal Block" data-label="Galaxy Tab S6 Lite (Wi-Fi/64GB)" data-dimension48="Galaxy Tab S6 Lite (Wi-Fi/64GB)" data-dimension25="$209" href="https://www.amazon.com/SAMSUNG-Android-Included-Expandable-Exclusive/dp/B0CWS7W8Q1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="iu52xR9j9dbqUcXvPYdYXJ" name="samsung-galaxy-tab-s6-lite.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/iu52xR9j9dbqUcXvPYdYXJ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/SAMSUNG-Android-Included-Expandable-Exclusive/dp/B0CWS7W8Q1" target="_blank" rel="nofollow" data-dimension112="17a08ed2-9de2-475e-b3f4-9a16ba8884c8" data-action="Deal Block" data-label="Galaxy Tab S6 Lite (Wi-Fi/64GB)" data-dimension48="Galaxy Tab S6 Lite (Wi-Fi/64GB)" data-dimension25="$209">Galaxy Tab S6 Lite (Wi-Fi/64GB): was $329 now $209</a></strong><br>This is one of the cheapest Android tablets around right now, but that doesn't mean it's cheap. The Samsung Tab S6 Lite is a small, low-powered Android tablet that sports a crisp 10.4-inch display and comes with an S Pen included at no charge, making it ideal for students and anyone who want to sketch or take notes on the go.<a class="view-deal button" href="https://www.amazon.com/SAMSUNG-Android-Included-Expandable-Exclusive/dp/B0CWS7W8Q1" target="_blank" rel="nofollow" data-dimension112="17a08ed2-9de2-475e-b3f4-9a16ba8884c8" data-action="Deal Block" data-label="Galaxy Tab S6 Lite (Wi-Fi/64GB)" data-dimension48="Galaxy Tab S6 Lite (Wi-Fi/64GB)" data-dimension25="$209">View Deal</a></p></div><h3 class="article-body__section" id="section-best-amazon-fire-tablet-deals"><span>Best Amazon Fire tablet deals</span></h3><div class="product"><a data-dimension112="adfce41b-0295-4317-85dd-7d41d9895b40" data-action="Deal Block" data-label="Fire HD 8 (32GB)" data-dimension48="Fire HD 8 (32GB)" data-dimension25="$64" href="https://www.amazon.com/Fire-HD-8-Tablet-Black-32GB/dp/B0CVDN4QS6" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:61.12%;"><img id="c7scFvcqtXymm8gKhGQe8P" name="Fire HD 8" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/c7scFvcqtXymm8gKhGQe8P-1920-80.jpg" mos="" align="middle" fullscreen="" width="679" height="415" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Fire-HD-8-Tablet-Black-32GB/dp/B0CVDN4QS6" target="_blank" rel="nofollow" data-dimension112="adfce41b-0295-4317-85dd-7d41d9895b40" data-action="Deal Block" data-label="Fire HD 8 (32GB)" data-dimension48="Fire HD 8 (32GB)" data-dimension25="$64">Fire HD 8 (32GB): was $99 now $64</a></strong><br>The Fire HD 8 is the smallest Amazon Fire tablet I would recommend you buy, because the smaller Fire 7 has a far worse screen. The HD 8, by comparison, comes with 32GB of storage and offers a nice balance between price and performance, one that's even more appealing now that it's over 30% off. <a class="view-deal button" href="https://www.amazon.com/Fire-HD-8-Tablet-Black-32GB/dp/B0CVDN4QS6" target="_blank" rel="nofollow" data-dimension112="adfce41b-0295-4317-85dd-7d41d9895b40" data-action="Deal Block" data-label="Fire HD 8 (32GB)" data-dimension48="Fire HD 8 (32GB)" data-dimension25="$64">View Deal</a></p></div><div class="product"><a data-dimension112="f34a203d-2338-4729-89f4-7863ee355a4b" data-action="Deal Block" data-label="Fire HD 8 Kids Pro (32GB)" data-dimension48="Fire HD 8 Kids Pro (32GB)" data-dimension25="$84" href="https://www.amazon.com/Fire-HD-8-Kids-Pro-Tablet-Hello-Teal-32GB/dp/B0D1DMSV9G" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="wfVXyu6vVfuSfdRZTfKzM9" name="fire_hd.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/wfVXyu6vVfuSfdRZTfKzM9-1920-80.png" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Fire-HD-8-Kids-Pro-Tablet-Hello-Teal-32GB/dp/B0D1DMSV9G" target="_blank" rel="nofollow" data-dimension112="f34a203d-2338-4729-89f4-7863ee355a4b" data-action="Deal Block" data-label="Fire HD 8 Kids Pro (32GB)" data-dimension48="Fire HD 8 Kids Pro (32GB)" data-dimension25="$84">Fire HD 8 Kids Pro (32GB): was $139 now $84</a></strong><br>The Fire HD 8 Kids Pro is basically just the Fire HD 8 but with a kid-friendly case (to protect it against drops) and a free year of Amazon's Kids+, a subscription service that serves up kid-oriented books and other content. This is a great tablet for older kids that aren't teenagers yet, especially at this discounted price.<a class="view-deal button" href="https://www.amazon.com/Fire-HD-8-Kids-Pro-Tablet-Hello-Teal-32GB/dp/B0D1DMSV9G" target="_blank" rel="nofollow" data-dimension112="f34a203d-2338-4729-89f4-7863ee355a4b" data-action="Deal Block" data-label="Fire HD 8 Kids Pro (32GB)" data-dimension48="Fire HD 8 Kids Pro (32GB)" data-dimension25="$84">View Deal</a></p></div><div class="product"><a data-dimension112="bb10c0dd-cb45-4e3f-a104-a93960f16f96" data-action="Deal Block" data-label="Fire HD 10 (32GB)" data-dimension48="Fire HD 10 (32GB)" data-dimension25="$69" href="https://www.amazon.com/Amazon_Fire_HD_10/dp/B0BHZT5S12/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:62.15%;"><img id="TpirEEi3bsKZ757xACgtXn" name="Fire HD 10" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/TpirEEi3bsKZ757xACgtXn-1920-80.jpg" mos="" align="middle" fullscreen="" width="679" height="422" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Amazon_Fire_HD_10/dp/B0BHZT5S12/" target="_blank" rel="nofollow" data-dimension112="bb10c0dd-cb45-4e3f-a104-a93960f16f96" data-action="Deal Block" data-label="Fire HD 10 (32GB)" data-dimension48="Fire HD 10 (32GB)" data-dimension25="$69">Fire HD 10 (32GB): was $139 now $69</a></strong><br>The Fire HD 10 is an Amazon tablet that feels like a legit iPad alternative since it gives you a 10.1-inch screen driven by an octa-core CPU, admittedly with a paltry 3GB of RAM and 32GB of storage space. This is a nice discount on the cheaper HD 10 that comes with lockscreen ads, but you can pay a small fee to permanently remove them down the line if you get tired of them.<a class="view-deal button" href="https://www.amazon.com/Amazon_Fire_HD_10/dp/B0BHZT5S12/" target="_blank" rel="nofollow" data-dimension112="bb10c0dd-cb45-4e3f-a104-a93960f16f96" data-action="Deal Block" data-label="Fire HD 10 (32GB)" data-dimension48="Fire HD 10 (32GB)" data-dimension25="$69">View Deal</a></p></div><div class="product"><a data-dimension112="0e39ff65-cde8-47ca-91ab-1ca84d38da6c" data-action="Deal Block" data-label="Fire Max 11 (128GB)" data-dimension48="Fire Max 11 (128GB)" data-dimension25="$189" href="https://www.amazon.com/Amazon-powerful-display-octa-core-processor/dp/B0B2SFTGQ6" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:971px;"><p class="vanilla-image-block" style="padding-top:98.97%;"><img id="W32SXhGpu9zii4qV32cA8e" name="fire_max_11.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/W32SXhGpu9zii4qV32cA8e-1920-80.jpg" mos="" align="middle" fullscreen="" width="971" height="961" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Amazon-powerful-display-octa-core-processor/dp/B0B2SFTGQ6" target="_blank" rel="nofollow" data-dimension112="0e39ff65-cde8-47ca-91ab-1ca84d38da6c" data-action="Deal Block" data-label="Fire Max 11 (128GB)" data-dimension48="Fire Max 11 (128GB)" data-dimension25="$189">Fire Max 11 (128GB): was $279 now $189</a></strong><br>The Fire Max 11 is the biggest and fastest Amazon Fire tablet you can buy, and right now you can get one for over 30% off. Like all Fire tablets this slate runs on FireOS (which is more limited than Android) and sports a bright 11-inch 2K screen powered by a 2.2GHz octa-core Mediatek MT8188J CPU, 4GB RAM and 64GB of storage. In our <a href="https://www.tomsguide.com/reviews/amazon-fire-max-11">Fire Max 11 review </a>we called it Amazon's best Fire tablet yet, and if you act fast you can score one for a killer discount!<a class="view-deal button" href="https://www.amazon.com/Amazon-powerful-display-octa-core-processor/dp/B0B2SFTGQ6" target="_blank" rel="nofollow" data-dimension112="0e39ff65-cde8-47ca-91ab-1ca84d38da6c" data-action="Deal Block" data-label="Fire Max 11 (128GB)" data-dimension48="Fire Max 11 (128GB)" data-dimension25="$189">View Deal</a></p></div><div data-model-name="Apple iPad Air (2024),OnePlus Pad,Amazon Fire 7 (2022),Samsung Galaxy Tab S9 Ultra,Apple iPad Pro M5,Microsoft Surface Pro 11th Generation" data-widget-type="multimodelreview" data-widget-title="Today’s tablet deals"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tested the Samsung Galaxy Tab S11 Ultra for a week — here’s what I like and what I don’t ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Samsung Galaxy Tab S11 Ultra ($1,199 to start) is just as imposing as its super-sized predecessors. If you’re looking for the biggest tablet possible, this enormous slate will certainly meet that demand. While it has the same slim design and gorgeous OLED we’ve come to love, this tablet isn’t quite the laptop replacement it’s billed as.</p><p>The 14.6-inch OLED panel is still the star of the show. While I find the <a href="https://www.tomsguide.com/computing/ipads/ipad-pro-m5-review">iPad Pro M5</a>’s 13-inch tandem OLED panel more impressive, Samsung’s slate has the edge in terms of sheer size. Watching videos and playing games on such a large canvas is incredible.</p><p>Despite the Galaxy Tab S11 Ultra’s large footprint, it’s surprisingly thin and light. You might forget you’re carrying it in your backpack. However, the tablet’s size can also make it uncomfortable to hold for long periods.</p><p>The new MediaTek Dimensity 9400+ processor gives the Tab S11 Ultra plenty of power to run all your favorite apps. Whether it’s writing on Google Docs or playing an Android game, you’ll have an overall smooth experience. <a href="https://www.tomsguide.com/phones/android-phones/ive-been-using-android-16-for-two-weeks-heres-why-im-so-underwhelmed">Android 16</a> is also the most responsive version of the OS I’ve tested on a tablet.</p><p>Though there’s a lot to like about the Galaxy Tab S11 Ultra, it has some trade-offs. The biggest issue is that DeX Mode isn’t as functional as before. I also dislike how the Book Cover Keyboard doesn't have a touchpad, which forces you to use touch controls or a wireless mouse.</p><p>Even if it makes for a lackluster laptop replacement, the Samsung Galaxy Tab S11 Ultra still impresses thanks to its nearly 15-inch OLED panel and slim design. It's certainly one of the <a href="https://www.tomsguide.com/best-picks/best-android-tablets">best Android tablets</a>. But unless you’re a hardcore Android or Samsung fan, it’s difficult to recommend this slate over the iPad Pro M5 or one of the <a href="https://www.tomsguide.com/best-picks/best-laptops">best laptops</a>. Find out why in my full review.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s11-ultra-review-cheat-sheet"><span>Samsung Galaxy Tab S11 Ultra review: Cheat sheet</span></h3><ul><li><strong>What is it?</strong> The Galaxy Tab S11 Ultra is the latest iteration of Samsung’s super-sized Android tablet, featuring a new MediaTek Dimensity processor.</li><li><strong>Who is it for?</strong> For anyone looking for a nearly 15-inch OLED tablet that can (somewhat) double as a laptop replacement.</li><li><strong>How much does it cost?</strong> The Samsung Galaxy Tab S11 Ultra starts at $1,199 on <a href="https://www.samsung.com/us/tablets/galaxy-tab-s11/buy/galaxy-tab-s11-ultra-256gb-gray-wi-fi-sku-sm-x930nzaaxar/" target="_blank" rel="nofollow"><u>Samsung’s website</u></a> for a model with 256GB of storage. Expect to pay $1,619 for a 1TB model.</li><li><strong>What do we like?</strong> We like the vivid 14.6-inch OLED panel, lightweight design, strong performance and long battery life.</li><li><strong>What don’t we like?</strong> The tablet is uncomfortable to hold for long periods and DeX Mode isn’t as useful as before.</li></ul><h3 class="article-body__section" id="section-samsung-galaxy-tab-s11-ultra-review-specs"><span>Samsung Galaxy Tab S11 Ultra review: Specs</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Samsung Galaxy Tab S11 Ultra</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$1,199</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>14.6-inch AMOLED (2960 x 1848)</p></td></tr><tr><td class="firstcol " ><p><strong>Chip</strong></p></td><td  ><p>MediaTek Dimensity 9400+</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>12GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>256GB</p></td></tr><tr><td class="firstcol " ><p><strong>Cameras</strong></p></td><td  ><p>12MP FF + Ultrawide (front), 13MP AF + 8MP UW (rear)</p></td></tr><tr><td class="firstcol " ><p><strong>Wireless</strong></p></td><td  ><p>Wi-Fi 7, Bluetooth 5.4</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>12.8 x 8.2 x 0.2 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>1.5 pounds</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-samsung-galaxy-tab-s11-ultra-review-the-ups"><span>Samsung Galaxy Tab S11 Ultra review: The ups</span></h3><p>There’s a lot to like about the Samsung Galaxy Tab S11 Ultra besides its gorgeous OLED panel, such as the lightweight design, strong performance and long battery life.</p><h2 id="lightweight-design-2">Lightweight 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="SC4XJF8scGovGXEUiHFRL" name="Samsung Galaxy Tab S11 Ultra-11" alt="Samsung Galaxy Tab S11 Ultra" src="https://cdn.mos.cms.futurecdn.net/SC4XJF8scGovGXEUiHFRL-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Samsung didn’t redesign the Galaxy Tab S11 Ultra. As before, it’s a Moses-worthy tablet thanks to its enormous 12.8 x 8.2 x 0.2 size. Despite being huge, it weighs only 1.6 pounds. The fact that such a big tablet can be so thin and light is still impressive. There’s a drawback to this, but we’ll cover that soon.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6qB6BXFCxg86UajnmCw6p8" name="Samsung Galaxy Tab S11 Ultra-12" alt="Samsung Galaxy Tab S11 Ultra" src="https://cdn.mos.cms.futurecdn.net/6qB6BXFCxg86UajnmCw6p8-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>You’ll find the power and volume buttons on the tablet’s top left-hand side (when held horizontally). There’s also a microSD card slot on the top right side. Over on the back, you’ll find two rear-facing cameras. The quad speakers inside pump out sound through the grilles flanking the tablet’s sides. There’s a lone USB-C port on the right-hand side and no headphone jack.</p><p>While the Galaxy Tab S11 Ultra looks the same as ever, that’s not a bad thing since it’s still an elegant and sturdy piece of aluminum that’s easy to travel with.</p><h2 id="vivid-oled-panel">Vivid OLED panel</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hEXgYzPtuLUb8jzEsQieHN" name="Samsung Galaxy Tab S11 Ultra-10" alt="Samsung Galaxy Tab S11 Ultra" src="https://cdn.mos.cms.futurecdn.net/hEXgYzPtuLUb8jzEsQieHN-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Galaxy Tab S11 Ultra’s 14.6-inch panel is a marvel to behold. Thanks to its size and sharp 2960 x 1848 resolution, it’s easy to see even the smallest details in videos and games. The OLED panel also does a superb job of delivering inky blacks and eye-scorching whites. Your eyes won’t be disappointed when viewing anything on this tablet.</p><p>Our lab tests confirm my experience. As you can see in the table below, the Galaxy Tab S11 Ultra can get very bright, especially when displaying HDR content. It also has oversaturated color representation (sRGB and DCI-P3) and good color accuracy (Delta-E).</p><div ><table><caption>Display benchmarks</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Samsung Galaxy Tab S11 Ultra</strong></p></td><td  ><p><strong>iPad Pro M5</strong></p></td><td  ><p><strong>OnePlus Pad 3</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Nits (brightness)</strong></p></td><td  ><p>401 (SDR) | 897 (HDR)</p></td><td  ><p>561 (SDR) | 965 (HDR)</p></td><td  ><p>530 (SDR)</p></td></tr><tr><td class="firstcol " ><p><strong>sRGB</strong></p></td><td  ><p>157.3%</p></td><td  ><p>116%</p></td><td  ><p>111.4</p></td></tr><tr><td class="firstcol " ><p><strong>DCI-P3</strong></p></td><td  ><p>111.4%</p></td><td  ><p>82.1%</p></td><td  ><p>78.9</p></td></tr><tr><td class="firstcol " ><p><strong>Delta-E</strong></p></td><td  ><p>0.25</p></td><td  ><p>0.27</p></td><td  ><p>0.23</p></td></tr></tbody></table></div><p>How does that compare to the competition? The displays on the iPad Pro M5 and <a href="https://www.tomsguide.com/computing/android-tablets/oneplus-pad-3">OnePlus Pad 3</a> can get brighter SDR, but the latter lacks HDR. While Samsung’s tablet can deliver HDR, Apple’s slate can get brighter in this area. Colors can look richer on the Galaxy Tab S11 Ultra, though the displays on its competitors have more naturalistic hues.</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="6C94K27KgXdt3rEQtdstwU" name="Samsung Galaxy Tab S11 Ultra-02" alt="Samsung Galaxy Tab S11 Ultra" src="https://cdn.mos.cms.futurecdn.net/6C94K27KgXdt3rEQtdstwU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Galaxy Tab S11 Ultra runs on the MediaTek Dimensity 9400+ processor and packs 12GB of RAM. Thanks to these components, you get a tablet offering great performance for multitasking and gaming.</p><p>I used the Galaxy Tab S11 Ultra as a laptop replacement (more on that in a bit), and it handled my usual workflow without slowing down. Watching videos and multitasking between apps is a breeze thanks to updated components and the responsive Android 16 operating system. However, Samsung’s premium tablet isn’t as powerful as the new iPad Pro M5.</p><p>On the Geekbench 6 CPU test, the Tab S11 Ultra performed slightly better than the Snapdragon 8 Elite-powered OnePlus Pad 3. It also just slightly edged out OnePlus’ slate in the 3DMark graphics test. But as you can see below, the iPad Pro M5 demolished both Android tablets in these performance tests.</p><div ><table><caption>Performance benchmarks</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Samsung Galaxy Tab S11 Ultra</strong></p></td><td  ><p><strong>iPad Pro M5</strong></p></td><td  ><p><strong>OnePlus Pad 3</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong></p></td><td  ><p>MediaTek Dimensity 9400+</p></td><td  ><p>Apple M5</p></td><td  ><p>Snapdragon 8 Elite</p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6 score (single-core / multi-core)</strong></p></td><td  ><p>2811 / 9126</p></td><td  ><p>4,155 / 16,517</p></td><td  ><p>2,980 / 8,993</p></td></tr><tr><td class="firstcol " ><p><strong>3DMark Wild Life Extreme Unlimited (score / fps)</strong></p></td><td  ><p>6575 / 39</p></td><td  ><p>9,934 / 59 fps</p></td><td  ><p>6,410 / 38.38</p></td></tr></tbody></table></div><p>Apple’s M5 chip is an absolute beast of a processor, but you’ll still have a generally smooth time using the Tab S11 Ultra for everyday tasks and when playing Android games.</p><h2 id="long-battery-life-2">Long battery life</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wjdvDsGeHJoRoa7Eb822rb" name="Samsung Galaxy Tab S11 Ultra-03" alt="Samsung Galaxy Tab S11 Ultra" src="https://cdn.mos.cms.futurecdn.net/wjdvDsGeHJoRoa7Eb822rb-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Galaxy Tab S11 Ultra is a big tablet that delivers equally big battery life.</p><p>In our battery life test, which involves continuous web surfing over Wi-Fi with the display set to 150 nits of brightness, the Galaxy Tab S11 Ultra lasted for 12 hours and 13 minutes. That’s almost three hours longer than its predecessor, which is extremely impressive.</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>Samsung Galaxy Tab S11 Ultra</strong></p></td><td  ><p>12:03</p></td></tr><tr><td class="firstcol " ><p><strong>iPad Pro M5</strong></p></td><td  ><p>13:16</p></td></tr><tr><td class="firstcol " ><p><strong>OnePlus Pad 3</strong></p></td><td  ><p>16:21</p></td></tr></tbody></table></div><p>How does the Tab S11 Ultra’s endurance compare to its rivals? The iPad Pro M5 lasted for over an hour longer in the same test, but the OnePlus Pad 3 outlasted them both. While there are longer-lasting tablets available, it’s hard to complain about the Tab S11 Ultra’s strong battery life.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s11-ultra-review-the-downs"><span>Samsung Galaxy Tab S11 Ultra review: The downs</span></h3><p>The Samsung Galaxy Tab S11 Ultra is an impressive tablet, but it has some notable downsides holding it back.</p><h2 id="too-big">Too big</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qg7o3Nzz4ogBSzKrGC4C7j" name="Samsung Galaxy Tab S11 Ultra-04" alt="Samsung Galaxy Tab S11 Ultra" src="https://cdn.mos.cms.futurecdn.net/qg7o3Nzz4ogBSzKrGC4C7j-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Galaxy Tab S11 Ultra’s size is a double-edged sword. While it’s certainly thin and light, you’ll likely have a hard time holding it for extended periods, even with two hands. That’s inconvenient when you’re trying to immerse yourself in a book or graphic novel.</p><p>Since this slate is so cumbersome to hold, you’ll need to prop it up against something like a couch arm or a pillow. I used the new Book Cover Keyboard that Samsung sent with our Tab S11 Ultra review unit, and it’s great for viewing videos in landscape mode. But if you want to look at anything in portrait mode, prepare for some frustration. Sometimes, you can have too much of a good thing!</p><h2 id="downgraded-dex-mode">Downgraded DeX 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6BDFip7XzaVhXzyK8UpCnh" name="Tab S11 Ultra DeX Mode--6" alt="Samsung Galaxy Tab S11 Ultra" src="https://cdn.mos.cms.futurecdn.net/6BDFip7XzaVhXzyK8UpCnh-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Samsung’s DeX Mode has been around for several years and is meant to turn a tablet or phone’s UI into something more like a Windows 11 desktop. The feature has never been the greatest, but it mostly functioned as advertised. Samsung has redesigned DeX Mode with a brand-new layout and features. Unfortunately, it’s not as functional as before.</p><p>As I wrote about when <a href="https://www.tomsguide.com/computing/android-tablets/i-ditched-my-laptop-for-the-samsung-galaxy-tab-s11-ultra-heres-what-happened">I ditched my laptop for the Samsung Galaxy Tab S11 Ultra</a>, the new Dex Mode no longer has a Windows-like taskbar on the actual tablet. You only get this specific taskbar when connected to an external display. You get a semblance of the taskbar on the tablet itself, but it’s not the same.</p><p>To be truly productive on the Galaxy Tab S11 Ultra, you’ll need to connect to an external monitor and also connect a wireless mouse since the Book Cover Keyboard lacks a touchpad. If you need so many peripherals and devices to replicate a laptop experience, you’re better off getting an actual laptop. Not only will it streamline things, but it’ll be more affordable overall.</p><h2 id="new-book-cover-keyboard">New Book Cover Keyboard</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="fBU9uiZeHqPAoiosNvR7dC" name="Samsung Galaxy Tab S11 Ultra-08" alt="Samsung Galaxy Tab S11 Ultra" src="https://cdn.mos.cms.futurecdn.net/fBU9uiZeHqPAoiosNvR7dC-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Let me start with the good before I get to the bad. The Tab S11 Ultra’s Book Cover Case improves on its predecessors thanks to its sturdiness. You can actually walk around with the tablet propped up, which is something you couldn’t do with the flimsy old covers. Since the new cover is thicker, typing on it is more comfortable and enjoyable.</p><p>That’s where my praise ends. As I said above, the Book Cover Keyboard does not have a touchpad! Yes, you can use the tablet’s touch controls to open apps and move them around. However, if you want to resize windows or move apps from the tablet to an external monitor (or vice versa), you’re going to have a difficult time.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="pSyTDZG8cq2E9R8bN8U6nK" name="Samsung Galaxy Tab S11 Ultra-14" alt="Samsung Galaxy Tab S11 Ultra" src="https://cdn.mos.cms.futurecdn.net/pSyTDZG8cq2E9R8bN8U6nK-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I’m also not a fan of the new S Pen. Instead of a rounded stylus like before, the S Pen is hexagonal like a pencil. While some might favor that design, I don’t. The new S Pen also feels lighter than previous versions, which makes it seem plasticky. That said, the stylus is as responsive as ever, so it’s not a complete wash.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s11-ultra-review-verdict"><span>Samsung Galaxy Tab S11 Ultra review: Verdict</span></h3><p>If you’re looking for an Android tablet with a super-sized OLED panel and long-lasting battery life, you can’t go wrong with the Samsung Galaxy Tab S11 Ultra. It’s effectively the same tablet as previous models, only with a faster processor, but that’s not altogether bad since it’s still a lovely slate with a gorgeous screen.</p><p>Though the Galaxy Tab S11 Ultra is brilliant on its own and wonderful for watching videos and movies, it can’t function as a laptop replacement due to the less effective DeX Mode and touchpad-less keyboard peripheral. You’re better off with the <a href="https://www.tomsguide.com/computing/laptops/samsung-galaxy-book-5-pro-review">Samsung Galaxy Book Pro 5</a> that’s <a href="https://click.linksynergy.com/deeplink?id=kXQk6%2AivFEQ&mid=47773&u1=tomsguide-us-2863743840346207052&murl=https%3A%2F%2Fwww.samsung.com%2Fus%2Fbusiness%2Fcomputing%2Fgalaxy-books%2Fgalaxy-book5-series%2Fbuy%2Fgalaxy-book5-pro-14-0-intel-core-ultra-7-512gb-gray-np944xha-kg2us%2F" target="_blank" rel="nofollow">currently on sale for $1,149</a>. The pricier iPad Pro M5 is also a stronger option if you want a tablet to double as a laptop.</p><p>The Samsung Galaxy Tab S11 Ultra is less of a laptop replacement than its predecessors, but as a tablet, it’s still worth checking out.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/android-tablets/samsung-galaxy-tab-s11-ultra-review</link>
                                                                            <description>
                            <![CDATA[ The Samsung Galaxy Tab S11 Ultra might not be the best laptop replacement, but it's still an excellent Android tablet thanks to its 14.6-inch OLED panel, strong performance, long battery life and lightweight design. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">ZGcE3F7tbciX2GrtCuPRzE</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/BSFUWF36Lqg2VyNcZosr9a-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 01 Nov 2025 12:01:00 +0000</pubDate>                                                                                                                                <updated>Thu, 26 Mar 2026 10:31:06 +0000</updated>
                                                                                                                                            <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                <author><![CDATA[ tony.polanco@futurenet.com (Tony Polanco) ]]></author>                    <dc:creator><![CDATA[ Tony Polanco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/atzRNqFt5wYgEUPBDahWsD-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/BSFUWF36Lqg2VyNcZosr9a-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Tab S11 Ultra]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Tab S11 Ultra]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Tab S11 Ultra]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/BSFUWF36Lqg2VyNcZosr9a-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Samsung Galaxy Tab S11 Ultra ($1,199 to start) is just as imposing as its super-sized predecessors. If you’re looking for the biggest tablet possible, this enormous slate will certainly meet that demand. While it has the same slim design and gorgeous OLED we’ve come to love, this tablet isn’t quite the laptop replacement it’s billed as.</p><p>The 14.6-inch OLED panel is still the star of the show. While I find the <a href="https://www.tomsguide.com/computing/ipads/ipad-pro-m5-review">iPad Pro M5</a>’s 13-inch tandem OLED panel more impressive, Samsung’s slate has the edge in terms of sheer size. Watching videos and playing games on such a large canvas is incredible.</p><p>Despite the Galaxy Tab S11 Ultra’s large footprint, it’s surprisingly thin and light. You might forget you’re carrying it in your backpack. However, the tablet’s size can also make it uncomfortable to hold for long periods.</p><p>The new MediaTek Dimensity 9400+ processor gives the Tab S11 Ultra plenty of power to run all your favorite apps. Whether it’s writing on Google Docs or playing an Android game, you’ll have an overall smooth experience. <a href="https://www.tomsguide.com/phones/android-phones/ive-been-using-android-16-for-two-weeks-heres-why-im-so-underwhelmed">Android 16</a> is also the most responsive version of the OS I’ve tested on a tablet.</p><p>Though there’s a lot to like about the Galaxy Tab S11 Ultra, it has some trade-offs. The biggest issue is that DeX Mode isn’t as functional as before. I also dislike how the Book Cover Keyboard doesn't have a touchpad, which forces you to use touch controls or a wireless mouse.</p><p>Even if it makes for a lackluster laptop replacement, the Samsung Galaxy Tab S11 Ultra still impresses thanks to its nearly 15-inch OLED panel and slim design. It's certainly one of the <a href="https://www.tomsguide.com/best-picks/best-android-tablets">best Android tablets</a>. But unless you’re a hardcore Android or Samsung fan, it’s difficult to recommend this slate over the iPad Pro M5 or one of the <a href="https://www.tomsguide.com/best-picks/best-laptops">best laptops</a>. Find out why in my full review.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s11-ultra-review-cheat-sheet"><span>Samsung Galaxy Tab S11 Ultra review: Cheat sheet</span></h3><ul><li><strong>What is it?</strong> The Galaxy Tab S11 Ultra is the latest iteration of Samsung’s super-sized Android tablet, featuring a new MediaTek Dimensity processor.</li><li><strong>Who is it for?</strong> For anyone looking for a nearly 15-inch OLED tablet that can (somewhat) double as a laptop replacement.</li><li><strong>How much does it cost?</strong> The Samsung Galaxy Tab S11 Ultra starts at $1,199 on <a href="https://www.samsung.com/us/tablets/galaxy-tab-s11/buy/galaxy-tab-s11-ultra-256gb-gray-wi-fi-sku-sm-x930nzaaxar/" target="_blank" rel="nofollow"><u>Samsung’s website</u></a> for a model with 256GB of storage. Expect to pay $1,619 for a 1TB model.</li><li><strong>What do we like?</strong> We like the vivid 14.6-inch OLED panel, lightweight design, strong performance and long battery life.</li><li><strong>What don’t we like?</strong> The tablet is uncomfortable to hold for long periods and DeX Mode isn’t as useful as before.</li></ul><h3 class="article-body__section" id="section-samsung-galaxy-tab-s11-ultra-review-specs"><span>Samsung Galaxy Tab S11 Ultra review: Specs</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Samsung Galaxy Tab S11 Ultra</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$1,199</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>14.6-inch AMOLED (2960 x 1848)</p></td></tr><tr><td class="firstcol " ><p><strong>Chip</strong></p></td><td  ><p>MediaTek Dimensity 9400+</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>12GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>256GB</p></td></tr><tr><td class="firstcol " ><p><strong>Cameras</strong></p></td><td  ><p>12MP FF + Ultrawide (front), 13MP AF + 8MP UW (rear)</p></td></tr><tr><td class="firstcol " ><p><strong>Wireless</strong></p></td><td  ><p>Wi-Fi 7, Bluetooth 5.4</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>12.8 x 8.2 x 0.2 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>1.5 pounds</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-samsung-galaxy-tab-s11-ultra-review-the-ups"><span>Samsung Galaxy Tab S11 Ultra review: The ups</span></h3><p>There’s a lot to like about the Samsung Galaxy Tab S11 Ultra besides its gorgeous OLED panel, such as the lightweight design, strong performance and long battery life.</p><h2 id="lightweight-design-2">Lightweight 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="SC4XJF8scGovGXEUiHFRL" name="Samsung Galaxy Tab S11 Ultra-11" alt="Samsung Galaxy Tab S11 Ultra" src="https://cdn.mos.cms.futurecdn.net/SC4XJF8scGovGXEUiHFRL-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Samsung didn’t redesign the Galaxy Tab S11 Ultra. As before, it’s a Moses-worthy tablet thanks to its enormous 12.8 x 8.2 x 0.2 size. Despite being huge, it weighs only 1.6 pounds. The fact that such a big tablet can be so thin and light is still impressive. There’s a drawback to this, but we’ll cover that soon.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6qB6BXFCxg86UajnmCw6p8" name="Samsung Galaxy Tab S11 Ultra-12" alt="Samsung Galaxy Tab S11 Ultra" src="https://cdn.mos.cms.futurecdn.net/6qB6BXFCxg86UajnmCw6p8-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>You’ll find the power and volume buttons on the tablet’s top left-hand side (when held horizontally). There’s also a microSD card slot on the top right side. Over on the back, you’ll find two rear-facing cameras. The quad speakers inside pump out sound through the grilles flanking the tablet’s sides. There’s a lone USB-C port on the right-hand side and no headphone jack.</p><p>While the Galaxy Tab S11 Ultra looks the same as ever, that’s not a bad thing since it’s still an elegant and sturdy piece of aluminum that’s easy to travel with.</p><h2 id="vivid-oled-panel">Vivid OLED panel</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hEXgYzPtuLUb8jzEsQieHN" name="Samsung Galaxy Tab S11 Ultra-10" alt="Samsung Galaxy Tab S11 Ultra" src="https://cdn.mos.cms.futurecdn.net/hEXgYzPtuLUb8jzEsQieHN-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Galaxy Tab S11 Ultra’s 14.6-inch panel is a marvel to behold. Thanks to its size and sharp 2960 x 1848 resolution, it’s easy to see even the smallest details in videos and games. The OLED panel also does a superb job of delivering inky blacks and eye-scorching whites. Your eyes won’t be disappointed when viewing anything on this tablet.</p><p>Our lab tests confirm my experience. As you can see in the table below, the Galaxy Tab S11 Ultra can get very bright, especially when displaying HDR content. It also has oversaturated color representation (sRGB and DCI-P3) and good color accuracy (Delta-E).</p><div ><table><caption>Display benchmarks</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Samsung Galaxy Tab S11 Ultra</strong></p></td><td  ><p><strong>iPad Pro M5</strong></p></td><td  ><p><strong>OnePlus Pad 3</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Nits (brightness)</strong></p></td><td  ><p>401 (SDR) | 897 (HDR)</p></td><td  ><p>561 (SDR) | 965 (HDR)</p></td><td  ><p>530 (SDR)</p></td></tr><tr><td class="firstcol " ><p><strong>sRGB</strong></p></td><td  ><p>157.3%</p></td><td  ><p>116%</p></td><td  ><p>111.4</p></td></tr><tr><td class="firstcol " ><p><strong>DCI-P3</strong></p></td><td  ><p>111.4%</p></td><td  ><p>82.1%</p></td><td  ><p>78.9</p></td></tr><tr><td class="firstcol " ><p><strong>Delta-E</strong></p></td><td  ><p>0.25</p></td><td  ><p>0.27</p></td><td  ><p>0.23</p></td></tr></tbody></table></div><p>How does that compare to the competition? The displays on the iPad Pro M5 and <a href="https://www.tomsguide.com/computing/android-tablets/oneplus-pad-3">OnePlus Pad 3</a> can get brighter SDR, but the latter lacks HDR. While Samsung’s tablet can deliver HDR, Apple’s slate can get brighter in this area. Colors can look richer on the Galaxy Tab S11 Ultra, though the displays on its competitors have more naturalistic hues.</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="6C94K27KgXdt3rEQtdstwU" name="Samsung Galaxy Tab S11 Ultra-02" alt="Samsung Galaxy Tab S11 Ultra" src="https://cdn.mos.cms.futurecdn.net/6C94K27KgXdt3rEQtdstwU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Galaxy Tab S11 Ultra runs on the MediaTek Dimensity 9400+ processor and packs 12GB of RAM. Thanks to these components, you get a tablet offering great performance for multitasking and gaming.</p><p>I used the Galaxy Tab S11 Ultra as a laptop replacement (more on that in a bit), and it handled my usual workflow without slowing down. Watching videos and multitasking between apps is a breeze thanks to updated components and the responsive Android 16 operating system. However, Samsung’s premium tablet isn’t as powerful as the new iPad Pro M5.</p><p>On the Geekbench 6 CPU test, the Tab S11 Ultra performed slightly better than the Snapdragon 8 Elite-powered OnePlus Pad 3. It also just slightly edged out OnePlus’ slate in the 3DMark graphics test. But as you can see below, the iPad Pro M5 demolished both Android tablets in these performance tests.</p><div ><table><caption>Performance benchmarks</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Samsung Galaxy Tab S11 Ultra</strong></p></td><td  ><p><strong>iPad Pro M5</strong></p></td><td  ><p><strong>OnePlus Pad 3</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong></p></td><td  ><p>MediaTek Dimensity 9400+</p></td><td  ><p>Apple M5</p></td><td  ><p>Snapdragon 8 Elite</p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6 score (single-core / multi-core)</strong></p></td><td  ><p>2811 / 9126</p></td><td  ><p>4,155 / 16,517</p></td><td  ><p>2,980 / 8,993</p></td></tr><tr><td class="firstcol " ><p><strong>3DMark Wild Life Extreme Unlimited (score / fps)</strong></p></td><td  ><p>6575 / 39</p></td><td  ><p>9,934 / 59 fps</p></td><td  ><p>6,410 / 38.38</p></td></tr></tbody></table></div><p>Apple’s M5 chip is an absolute beast of a processor, but you’ll still have a generally smooth time using the Tab S11 Ultra for everyday tasks and when playing Android games.</p><h2 id="long-battery-life-2">Long battery life</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wjdvDsGeHJoRoa7Eb822rb" name="Samsung Galaxy Tab S11 Ultra-03" alt="Samsung Galaxy Tab S11 Ultra" src="https://cdn.mos.cms.futurecdn.net/wjdvDsGeHJoRoa7Eb822rb-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Galaxy Tab S11 Ultra is a big tablet that delivers equally big battery life.</p><p>In our battery life test, which involves continuous web surfing over Wi-Fi with the display set to 150 nits of brightness, the Galaxy Tab S11 Ultra lasted for 12 hours and 13 minutes. That’s almost three hours longer than its predecessor, which is extremely impressive.</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>Samsung Galaxy Tab S11 Ultra</strong></p></td><td  ><p>12:03</p></td></tr><tr><td class="firstcol " ><p><strong>iPad Pro M5</strong></p></td><td  ><p>13:16</p></td></tr><tr><td class="firstcol " ><p><strong>OnePlus Pad 3</strong></p></td><td  ><p>16:21</p></td></tr></tbody></table></div><p>How does the Tab S11 Ultra’s endurance compare to its rivals? The iPad Pro M5 lasted for over an hour longer in the same test, but the OnePlus Pad 3 outlasted them both. While there are longer-lasting tablets available, it’s hard to complain about the Tab S11 Ultra’s strong battery life.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s11-ultra-review-the-downs"><span>Samsung Galaxy Tab S11 Ultra review: The downs</span></h3><p>The Samsung Galaxy Tab S11 Ultra is an impressive tablet, but it has some notable downsides holding it back.</p><h2 id="too-big">Too big</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qg7o3Nzz4ogBSzKrGC4C7j" name="Samsung Galaxy Tab S11 Ultra-04" alt="Samsung Galaxy Tab S11 Ultra" src="https://cdn.mos.cms.futurecdn.net/qg7o3Nzz4ogBSzKrGC4C7j-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Galaxy Tab S11 Ultra’s size is a double-edged sword. While it’s certainly thin and light, you’ll likely have a hard time holding it for extended periods, even with two hands. That’s inconvenient when you’re trying to immerse yourself in a book or graphic novel.</p><p>Since this slate is so cumbersome to hold, you’ll need to prop it up against something like a couch arm or a pillow. I used the new Book Cover Keyboard that Samsung sent with our Tab S11 Ultra review unit, and it’s great for viewing videos in landscape mode. But if you want to look at anything in portrait mode, prepare for some frustration. Sometimes, you can have too much of a good thing!</p><h2 id="downgraded-dex-mode">Downgraded DeX 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6BDFip7XzaVhXzyK8UpCnh" name="Tab S11 Ultra DeX Mode--6" alt="Samsung Galaxy Tab S11 Ultra" src="https://cdn.mos.cms.futurecdn.net/6BDFip7XzaVhXzyK8UpCnh-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Samsung’s DeX Mode has been around for several years and is meant to turn a tablet or phone’s UI into something more like a Windows 11 desktop. The feature has never been the greatest, but it mostly functioned as advertised. Samsung has redesigned DeX Mode with a brand-new layout and features. Unfortunately, it’s not as functional as before.</p><p>As I wrote about when <a href="https://www.tomsguide.com/computing/android-tablets/i-ditched-my-laptop-for-the-samsung-galaxy-tab-s11-ultra-heres-what-happened">I ditched my laptop for the Samsung Galaxy Tab S11 Ultra</a>, the new Dex Mode no longer has a Windows-like taskbar on the actual tablet. You only get this specific taskbar when connected to an external display. You get a semblance of the taskbar on the tablet itself, but it’s not the same.</p><p>To be truly productive on the Galaxy Tab S11 Ultra, you’ll need to connect to an external monitor and also connect a wireless mouse since the Book Cover Keyboard lacks a touchpad. If you need so many peripherals and devices to replicate a laptop experience, you’re better off getting an actual laptop. Not only will it streamline things, but it’ll be more affordable overall.</p><h2 id="new-book-cover-keyboard">New Book Cover Keyboard</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="fBU9uiZeHqPAoiosNvR7dC" name="Samsung Galaxy Tab S11 Ultra-08" alt="Samsung Galaxy Tab S11 Ultra" src="https://cdn.mos.cms.futurecdn.net/fBU9uiZeHqPAoiosNvR7dC-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Let me start with the good before I get to the bad. The Tab S11 Ultra’s Book Cover Case improves on its predecessors thanks to its sturdiness. You can actually walk around with the tablet propped up, which is something you couldn’t do with the flimsy old covers. Since the new cover is thicker, typing on it is more comfortable and enjoyable.</p><p>That’s where my praise ends. As I said above, the Book Cover Keyboard does not have a touchpad! Yes, you can use the tablet’s touch controls to open apps and move them around. However, if you want to resize windows or move apps from the tablet to an external monitor (or vice versa), you’re going to have a difficult time.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="pSyTDZG8cq2E9R8bN8U6nK" name="Samsung Galaxy Tab S11 Ultra-14" alt="Samsung Galaxy Tab S11 Ultra" src="https://cdn.mos.cms.futurecdn.net/pSyTDZG8cq2E9R8bN8U6nK-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I’m also not a fan of the new S Pen. Instead of a rounded stylus like before, the S Pen is hexagonal like a pencil. While some might favor that design, I don’t. The new S Pen also feels lighter than previous versions, which makes it seem plasticky. That said, the stylus is as responsive as ever, so it’s not a complete wash.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s11-ultra-review-verdict"><span>Samsung Galaxy Tab S11 Ultra review: Verdict</span></h3><p>If you’re looking for an Android tablet with a super-sized OLED panel and long-lasting battery life, you can’t go wrong with the Samsung Galaxy Tab S11 Ultra. It’s effectively the same tablet as previous models, only with a faster processor, but that’s not altogether bad since it’s still a lovely slate with a gorgeous screen.</p><p>Though the Galaxy Tab S11 Ultra is brilliant on its own and wonderful for watching videos and movies, it can’t function as a laptop replacement due to the less effective DeX Mode and touchpad-less keyboard peripheral. You’re better off with the <a href="https://www.tomsguide.com/computing/laptops/samsung-galaxy-book-5-pro-review">Samsung Galaxy Book Pro 5</a> that’s <a href="https://click.linksynergy.com/deeplink?id=kXQk6%2AivFEQ&mid=47773&u1=tomsguide-us-2863743840346207052&murl=https%3A%2F%2Fwww.samsung.com%2Fus%2Fbusiness%2Fcomputing%2Fgalaxy-books%2Fgalaxy-book5-series%2Fbuy%2Fgalaxy-book5-pro-14-0-intel-core-ultra-7-512gb-gray-np944xha-kg2us%2F" target="_blank" rel="nofollow">currently on sale for $1,149</a>. The pricier iPad Pro M5 is also a stronger option if you want a tablet to double as a laptop.</p><p>The Samsung Galaxy Tab S11 Ultra is less of a laptop replacement than its predecessors, but as a tablet, it’s still worth checking out.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I just tried Samsung’s new Dex Mode on the Galaxy Tab S11 Ultra — and I don’t think it can replace your laptop (yet) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The new Samsung Galaxy Tab S11 Ultra just arrived on my desk, and I’ve been testing the enormous tablet in preparation for my full review. One thing I’ve spent a lot of time with is Samsung’s DeX Mode, which exists to turn the tablet into a laptop replacement.</p><p>DeX Mode itself isn’t new, but it has recently been updated with a brand-new UI and features. I usually reserve my thoughts on DeX Mode for my Galaxy Tab S reviews, but given how differently this feature now functions, I wanted to spotlight it.</p><p>I review the <a href="https://www.tomsguide.com/best-picks/best-laptops">best laptops</a> and the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a> for a living, so do I think the new DeX Mode makes the Samsung Galaxy Tab S11 Ultra into an effective laptop replacement? Read on to find out!</p><h2 id="a-major-change-for-dex">A major change for DeX</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="AaiVixneNU37iLEdbERNuG" name="Tab S11 Ultra DeX Mode--7" alt="Samsung Galaxy Tab S11 Ultra" src="https://cdn.mos.cms.futurecdn.net/AaiVixneNU37iLEdbERNuG-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The new DeX Mode borrows many features from <a href="https://www.tomsguide.com/phones/samsung-phones/samsungs-one-ui-8-update-starts-its-global-rollout-heres-when-its-expected-to-reach-the-us">Samsung’s One UI 8</a> and reimagines the UI to be more like <a href="https://www.tomsguide.com/phones/android-phones/android-16-desktop-mode-googles-best-kept-secret-got-a-quiet-reveal-at-i-o">Android Desktop Mode</a>. Some new features include support for up to four virtual desktops, a dedicated full-screen button, a new settings menu, easier window management and more.</p><p>The most controversial change that <a href="https://www.reddit.com/r/SamsungDex/comments/1np2gyv/new_dex_is_garbage/">some Redditors</a> (and I) aren’t happy about is that DeX Mode no longer has a Windows-like taskbar on the tablet. You only see this specific taskbar when connected to an external display. You get a semblance of the taskbar on the tablet itself, but it’s not the same.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="g2ejoa4xxmscMu2wfTfN7T" name="Tab S11 Ultra DeX Mode--8" alt="Samsung Galaxy Tab S11 Ultra" src="https://cdn.mos.cms.futurecdn.net/g2ejoa4xxmscMu2wfTfN7T-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>You can still access the aforementioned features, such as virtual desktops, if you’re only using the tablet. However, if you want DeX Mode to function more like it used to, you’ll need an external monitor.</p><h2 id="the-new-experience">The new experience</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6BDFip7XzaVhXzyK8UpCnh" name="Tab S11 Ultra DeX Mode--6" alt="Samsung Galaxy Tab S11 Ultra" src="https://cdn.mos.cms.futurecdn.net/6BDFip7XzaVhXzyK8UpCnh-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>To get the most from DeX Mode, I connected the Galaxy Tab S11 Ultra to a monitor in our office. Doing this gave me the old DeX Mode taskbar on the monitor, but not on the tablet. That’s not too bad once you get used to it, but a new problem quickly presented itself.</p><p>The new Book Cover Keyboard for the Tab S11 Ultra is much sturdier than previous versions, and you can actually walk around with the tablet propped up without fear of it falling. I also find its keys comfortable to type on.</p><p>Unfortunately, the Book Cover Keyboard <em>doesn’t</em> have a touchpad. While you can use the tablet’s touch controls to open and select apps easily enough, resizing windows or moving apps from the tablet to the monitor (and vice versa) is nearly impossible with your fingers. Because of that, I had to use a wireless mouse to get work done.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Mxvn8QHRYZcRuogZi9DQgM" name="Tab S11 Ultra DeX Mode--5" alt="Samsung Galaxy Tab S11 Ultra" src="https://cdn.mos.cms.futurecdn.net/Mxvn8QHRYZcRuogZi9DQgM-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>In short, to truly be productive on the Galaxy Tab S11 Ultra, you’ll need to connect to an external monitor and also connect a wireless mouse. I don’t know about you, but that doesn’t sound like a laptop experience at all.</p><p>If you’re going to go through all that trouble, you could instead get the <a href="https://www.tomsguide.com/computing/laptops/samsung-galaxy-book-5-pro-review">Samsung Galaxy Book Pro 5</a>, which <a href="https://www.samsung.com/us/business/computing/galaxy-books/galaxy-book5-series/buy/galaxy-book5-pro-14-0-intel-core-ultra-7-512gb-gray-np944xha-kg2us/" target="_blank" rel="nofollow">Samsung is currently selling for $1,149</a>, which is less than what you’d pay for the entry-level Tab S11 Ultra and the $200 Book Cover Keyboard (not to mention an external monitor).</p><h2 id="the-positives">The positives</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2960px;"><p class="vanilla-image-block" style="padding-top:62.43%;"><img id="QoQS2P5ZV3RoGmnN5YSAt8" name="Screenshot_20251029_121229_One UI Home" alt="Samsung Galaxy Tab S11 Ultra" src="https://cdn.mos.cms.futurecdn.net/QoQS2P5ZV3RoGmnN5YSAt8-1920-80.jpg" mos="" align="middle" fullscreen="" width="2960" height="1848" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / Samsung)</span></figcaption></figure><p>Before you think I’m dragging the new DeX Mode too hard, I should point out some of its useful qualities.</p><p>I’ve used prior versions of DeX Mode, and I can safely say this is the snappiest and most responsive version yet. This is especially true when switching between DeX Mode and the standard Android UI, which used to take several seconds. Now, you’re in either mode the instant you tap the DeX Button on the drop-down menu or press the keyboard’s dedicated DeX Button.</p><p>Flipping between your virtual desktops is also seamless, as is setting up each desktop with specific apps. For instance, I can have one desktop with the Google apps I need for work, while another desktop can have a YouTube video and Google Gemini if I have to research something. You’re limited to four virtual desktops, even if you’re connected to an external monitor, but four desktops are plenty for my purposes.</p><h2 id="outlook">Outlook</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/computing/ipads/apple-just-tipped-to-bring-this-long-overdue-upgrade-to-new-ipads-and-macbooks-starting-with-ipad-mini-8">Apple is bringing this long-overdue upgrade to new iPads and MacBooks</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/heres-our-first-look-at-the-samsung-galaxy-tri-fold-and-everything-we-can-figure-out-from-it">Here's our first look at the Samsung Galaxy Tri-Fold</a></li><li><a href="https://www.tomsguide.com/computing/mobile-apps/i-love-google-maps-but-it-sucks-for-hiking-heres-the-app-i-use-to-avoid-getting-lost-in-the-woods">I love Google Maps, but it sucks for hiking</a></li></ul><div data-model-name="Apple 13" MacBook Air M4 (2025),Apple 15" MacBook Air M4 (2025),Dell XPS 13,Lenovo Yoga Slim 7x (14-inch Snapdragon),Lenovo Chromebook Plus 14,Asus ROG Zephyrus G14 (2025)" data-widget-type="comparison"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/android-tablets/i-ditched-my-laptop-for-the-samsung-galaxy-tab-s11-ultra-heres-what-happened</link>
                                                                            <description>
                            <![CDATA[ Does the new DeX Mode help make the Samsung Galaxy Tab S11 Ultra a laptop replacement? I went in-depth with this feature to find out. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">2QA2tk2wLhAf4PrnYCuVMV</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/LtvbytM2iuAFQbgU4wyk77-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 30 Oct 2025 05:30:00 +0000</pubDate>                                                                                                                                <updated>Thu, 30 Oct 2025 18:15:29 +0000</updated>
                                                                                                                                            <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                <author><![CDATA[ tony.polanco@futurenet.com (Tony Polanco) ]]></author>                    <dc:creator><![CDATA[ Tony Polanco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/atzRNqFt5wYgEUPBDahWsD-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/LtvbytM2iuAFQbgU4wyk77-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Tab S11 Ultra]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Tab S11 Ultra]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Tab S11 Ultra]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/LtvbytM2iuAFQbgU4wyk77-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The new Samsung Galaxy Tab S11 Ultra just arrived on my desk, and I’ve been testing the enormous tablet in preparation for my full review. One thing I’ve spent a lot of time with is Samsung’s DeX Mode, which exists to turn the tablet into a laptop replacement.</p><p>DeX Mode itself isn’t new, but it has recently been updated with a brand-new UI and features. I usually reserve my thoughts on DeX Mode for my Galaxy Tab S reviews, but given how differently this feature now functions, I wanted to spotlight it.</p><p>I review the <a href="https://www.tomsguide.com/best-picks/best-laptops">best laptops</a> and the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a> for a living, so do I think the new DeX Mode makes the Samsung Galaxy Tab S11 Ultra into an effective laptop replacement? Read on to find out!</p><h2 id="a-major-change-for-dex">A major change for DeX</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="AaiVixneNU37iLEdbERNuG" name="Tab S11 Ultra DeX Mode--7" alt="Samsung Galaxy Tab S11 Ultra" src="https://cdn.mos.cms.futurecdn.net/AaiVixneNU37iLEdbERNuG-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The new DeX Mode borrows many features from <a href="https://www.tomsguide.com/phones/samsung-phones/samsungs-one-ui-8-update-starts-its-global-rollout-heres-when-its-expected-to-reach-the-us">Samsung’s One UI 8</a> and reimagines the UI to be more like <a href="https://www.tomsguide.com/phones/android-phones/android-16-desktop-mode-googles-best-kept-secret-got-a-quiet-reveal-at-i-o">Android Desktop Mode</a>. Some new features include support for up to four virtual desktops, a dedicated full-screen button, a new settings menu, easier window management and more.</p><p>The most controversial change that <a href="https://www.reddit.com/r/SamsungDex/comments/1np2gyv/new_dex_is_garbage/">some Redditors</a> (and I) aren’t happy about is that DeX Mode no longer has a Windows-like taskbar on the tablet. You only see this specific taskbar when connected to an external display. You get a semblance of the taskbar on the tablet itself, but it’s not the same.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="g2ejoa4xxmscMu2wfTfN7T" name="Tab S11 Ultra DeX Mode--8" alt="Samsung Galaxy Tab S11 Ultra" src="https://cdn.mos.cms.futurecdn.net/g2ejoa4xxmscMu2wfTfN7T-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>You can still access the aforementioned features, such as virtual desktops, if you’re only using the tablet. However, if you want DeX Mode to function more like it used to, you’ll need an external monitor.</p><h2 id="the-new-experience">The new experience</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6BDFip7XzaVhXzyK8UpCnh" name="Tab S11 Ultra DeX Mode--6" alt="Samsung Galaxy Tab S11 Ultra" src="https://cdn.mos.cms.futurecdn.net/6BDFip7XzaVhXzyK8UpCnh-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>To get the most from DeX Mode, I connected the Galaxy Tab S11 Ultra to a monitor in our office. Doing this gave me the old DeX Mode taskbar on the monitor, but not on the tablet. That’s not too bad once you get used to it, but a new problem quickly presented itself.</p><p>The new Book Cover Keyboard for the Tab S11 Ultra is much sturdier than previous versions, and you can actually walk around with the tablet propped up without fear of it falling. I also find its keys comfortable to type on.</p><p>Unfortunately, the Book Cover Keyboard <em>doesn’t</em> have a touchpad. While you can use the tablet’s touch controls to open and select apps easily enough, resizing windows or moving apps from the tablet to the monitor (and vice versa) is nearly impossible with your fingers. Because of that, I had to use a wireless mouse to get work done.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Mxvn8QHRYZcRuogZi9DQgM" name="Tab S11 Ultra DeX Mode--5" alt="Samsung Galaxy Tab S11 Ultra" src="https://cdn.mos.cms.futurecdn.net/Mxvn8QHRYZcRuogZi9DQgM-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>In short, to truly be productive on the Galaxy Tab S11 Ultra, you’ll need to connect to an external monitor and also connect a wireless mouse. I don’t know about you, but that doesn’t sound like a laptop experience at all.</p><p>If you’re going to go through all that trouble, you could instead get the <a href="https://www.tomsguide.com/computing/laptops/samsung-galaxy-book-5-pro-review">Samsung Galaxy Book Pro 5</a>, which <a href="https://www.samsung.com/us/business/computing/galaxy-books/galaxy-book5-series/buy/galaxy-book5-pro-14-0-intel-core-ultra-7-512gb-gray-np944xha-kg2us/" target="_blank" rel="nofollow">Samsung is currently selling for $1,149</a>, which is less than what you’d pay for the entry-level Tab S11 Ultra and the $200 Book Cover Keyboard (not to mention an external monitor).</p><h2 id="the-positives">The positives</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2960px;"><p class="vanilla-image-block" style="padding-top:62.43%;"><img id="QoQS2P5ZV3RoGmnN5YSAt8" name="Screenshot_20251029_121229_One UI Home" alt="Samsung Galaxy Tab S11 Ultra" src="https://cdn.mos.cms.futurecdn.net/QoQS2P5ZV3RoGmnN5YSAt8-1920-80.jpg" mos="" align="middle" fullscreen="" width="2960" height="1848" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / Samsung)</span></figcaption></figure><p>Before you think I’m dragging the new DeX Mode too hard, I should point out some of its useful qualities.</p><p>I’ve used prior versions of DeX Mode, and I can safely say this is the snappiest and most responsive version yet. This is especially true when switching between DeX Mode and the standard Android UI, which used to take several seconds. Now, you’re in either mode the instant you tap the DeX Button on the drop-down menu or press the keyboard’s dedicated DeX Button.</p><p>Flipping between your virtual desktops is also seamless, as is setting up each desktop with specific apps. For instance, I can have one desktop with the Google apps I need for work, while another desktop can have a YouTube video and Google Gemini if I have to research something. You’re limited to four virtual desktops, even if you’re connected to an external monitor, but four desktops are plenty for my purposes.</p><h2 id="outlook">Outlook</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/computing/ipads/apple-just-tipped-to-bring-this-long-overdue-upgrade-to-new-ipads-and-macbooks-starting-with-ipad-mini-8">Apple is bringing this long-overdue upgrade to new iPads and MacBooks</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/heres-our-first-look-at-the-samsung-galaxy-tri-fold-and-everything-we-can-figure-out-from-it">Here's our first look at the Samsung Galaxy Tri-Fold</a></li><li><a href="https://www.tomsguide.com/computing/mobile-apps/i-love-google-maps-but-it-sucks-for-hiking-heres-the-app-i-use-to-avoid-getting-lost-in-the-woods">I love Google Maps, but it sucks for hiking</a></li></ul><div data-model-name="Apple 13" MacBook Air M4 (2025),Apple 15" MacBook Air M4 (2025),Dell XPS 13,Lenovo Yoga Slim 7x (14-inch Snapdragon),Lenovo Chromebook Plus 14,Asus ROG Zephyrus G14 (2025)" data-widget-type="comparison"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Screen recording on Android is getting major upgrades — including a taskbar, new UI and more ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Screen recording can come in very handy for Android users, but the options tend to be limited. However, in celebration of <a href="https://www.tomsguide.com/computing/chromebooks/googles-combining-chrome-os-and-android-and-its-the-smartest-move-its-made-in-years">Android coming to computers,</a> Google is reportedly working on new features for <a href="https://www.tomsguide.com/how-to/how-to-screen-record">screen recording on Android devices. </a></p><p>A recent report from <a href="https://www.androidauthority.com/android-screen-recorder-toolbar-rumor-3608449/" target="_blank">Android Authority</a> has detailed all the potential changes coming to Android devices. In the new version, tapping the Quick Settings tile will launch the new toolbar to appear over your screen. </p><p>While this new bar apparently can’t be moved or resized, the screenshots make it appear noticeably smaller than the current dialogue box. The reported new look also doesn't darken the content behind the dialogue box, making it much easier to see what's on the screen.  </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="oV3q2C2527gQSJApt9gpK6" name="Google screen recorder.JPEG" alt="Google screen recorder new task bar" src="https://cdn.mos.cms.futurecdn.net/oV3q2C2527gQSJApt9gpK6-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Android authority)</span></figcaption></figure><p>The new toolbar also shows some added options, including a toggle for the selfie camera. While we can't say for certain what this will do, it will likely allow users to capture simultaneous footage from the screen and selfie cam. If accurate, then this would be a real boon for content creators looking to record tutorials or<a href="https://www.tomsguide.com/us/twitch-streaming-guide,review-3009.html"> Twitch streaming. </a></p><p>The toolbar keeps many of the current options, including showing user inputs on the recording. However, Google has apparently tweaked some of the audio settings, with the new version listing the options as separate toggles.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="QqNi4QXfLSz4hHUdybFvBK" name="Google screen recorder 2.JPEG" alt="Google screen recorder post options" src="https://cdn.mos.cms.futurecdn.net/QqNi4QXfLSz4hHUdybFvBK-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Android Authority)</span></figcaption></figure><p>Google is also working to change its post-capture experience for a later update by adding a new UI after you're done recording. In the current version, your device will send a notification when you finish recording, which prompts you to open the file in a video player app. </p><p>The new notification will launch a new screen that includes a basic video player that has a seekbar, play pause buttons and a mute button. It’s also stated to feature an option to retake, edit, delete or share the footage. </p><h2 id="when-are-all-of-these-changes-coming">When are all of these changes 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="gPy9ykDaLykmigSuuNn9Uj" name="pixeltablet_lifestyle3.jpg" alt="Google Pixel Tablet in use out in public promo image" src="https://cdn.mos.cms.futurecdn.net/gPy9ykDaLykmigSuuNn9Uj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Google)</span></figcaption></figure><p>These additions could make using, editing and improving screen recording much easier. Considering Android devices didn’t have a native means to screen record for most of their lifetime, this is great to see. Originally, users had to rely on third-party apps, which were often limited due to various factors and access permissions. </p><p>Android eventually released a native screen recording feature for <a href="https://www.tomsguide.com/reference/android-11">Android 11</a> in 2020, but it could only capture the entire screen. Then, with the release of <a href="https://www.tomsguide.com/news/android-14">Android 14</a>, Google added the option to capture a single app, increasing the feature's usability. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cDP4TxoaL2qGYh6GwwdbzW" name="Android-15-LIST.jpg" alt="Android 15" src="https://cdn.mos.cms.futurecdn.net/cDP4TxoaL2qGYh6GwwdbzW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href=""><strong>The big Apple Intelligence upgrade to Siri is still on the way, but Apple's own testers are raising the alarm</strong></a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-just-tipped-for-a-2-month-delay-but-it-wont-be-getting-that-crazy-name-change"><strong>Samsung Galaxy S26 just tipped for a 2-month delay — but it won't be getting that crazy name change</strong></a></li><li><a href="https://www.tomsguide.com/phones/google-pixel-phones/the-google-pixel-10-pro-fold-is-my-new-favorite-foldable-phone-and-its-all-because-of-this-one-feature"><strong>The Google Pixel 10 Pro Fold is my new favorite foldable phone — and it’s all because of this one feature</strong></a></li></ul><div data-widget-type="merchantlink" data-model-name="Google Pixel Tablet"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/android-phones/screen-recording-on-android-is-getting-major-upgrades-including-a-taskbar-new-ui-and-more</link>
                                                                            <description>
                            <![CDATA[ Google is working on a new update to improve screen recording on some of the best Android devices. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">CszQYcn4Po3rYUAXkBDZLG</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/FehK9Usox3xuxqqZcn8vRE-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 20 Oct 2025 12:00:16 +0000</pubDate>                                                                                                                                <updated>Mon, 20 Oct 2025 12:00:23 +0000</updated>
                                                                                                                                            <category><![CDATA[Android Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ josh.render@futurenet.com (Josh Render) ]]></author>                    <dc:creator><![CDATA[ Josh Render ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/KC66jeFVj9pkfXKGSojaoW-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Josh Render is a UK-based staff writer at Tom&#039;s Guides covering news and features focusing primarily on mobile phones and their workings. Josh has been around phones for many years, having worked in a few different second-hand retailers. He knows the ins and outs of most phones, including how to repair many of them. Meanwhile, he has worked as a freelance journalist for several publications which range over a bunch of different tech aspects. Josh is also a fan of pairing people with the right tech and helping people understand the more nuanced aspects of their latest purchases. Outside of phones Josh is a fan of video games, novels, and Warhammer and has worked around all three to some degree.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Josh has a degree in Film Production from the University of Central Lancashire and has worked for publications such as GameGrin and CBR as well as a few smaller independent outfits. He is often found trying to paint models, completing levels, reading books, or figuring out the next best gaming app to invest his time in.&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/FehK9Usox3xuxqqZcn8vRE-1920-80.jpg">
                                                            <media:credit><![CDATA[Bangla Press / Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Android 16 logo next to promotion to &quot;Check Out the Latest Android features&quot;]]></media:description>                                                            <media:text><![CDATA[Android 16 logo next to promotion to &quot;Check Out the Latest Android features&quot;]]></media:text>
                                <media:title type="plain"><![CDATA[Android 16 logo next to promotion to &quot;Check Out the Latest Android features&quot;]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/FehK9Usox3xuxqqZcn8vRE-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Screen recording can come in very handy for Android users, but the options tend to be limited. However, in celebration of <a href="https://www.tomsguide.com/computing/chromebooks/googles-combining-chrome-os-and-android-and-its-the-smartest-move-its-made-in-years">Android coming to computers,</a> Google is reportedly working on new features for <a href="https://www.tomsguide.com/how-to/how-to-screen-record">screen recording on Android devices. </a></p><p>A recent report from <a href="https://www.androidauthority.com/android-screen-recorder-toolbar-rumor-3608449/" target="_blank">Android Authority</a> has detailed all the potential changes coming to Android devices. In the new version, tapping the Quick Settings tile will launch the new toolbar to appear over your screen. </p><p>While this new bar apparently can’t be moved or resized, the screenshots make it appear noticeably smaller than the current dialogue box. The reported new look also doesn't darken the content behind the dialogue box, making it much easier to see what's on the screen.  </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="oV3q2C2527gQSJApt9gpK6" name="Google screen recorder.JPEG" alt="Google screen recorder new task bar" src="https://cdn.mos.cms.futurecdn.net/oV3q2C2527gQSJApt9gpK6-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Android authority)</span></figcaption></figure><p>The new toolbar also shows some added options, including a toggle for the selfie camera. While we can't say for certain what this will do, it will likely allow users to capture simultaneous footage from the screen and selfie cam. If accurate, then this would be a real boon for content creators looking to record tutorials or<a href="https://www.tomsguide.com/us/twitch-streaming-guide,review-3009.html"> Twitch streaming. </a></p><p>The toolbar keeps many of the current options, including showing user inputs on the recording. However, Google has apparently tweaked some of the audio settings, with the new version listing the options as separate toggles.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="QqNi4QXfLSz4hHUdybFvBK" name="Google screen recorder 2.JPEG" alt="Google screen recorder post options" src="https://cdn.mos.cms.futurecdn.net/QqNi4QXfLSz4hHUdybFvBK-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Android Authority)</span></figcaption></figure><p>Google is also working to change its post-capture experience for a later update by adding a new UI after you're done recording. In the current version, your device will send a notification when you finish recording, which prompts you to open the file in a video player app. </p><p>The new notification will launch a new screen that includes a basic video player that has a seekbar, play pause buttons and a mute button. It’s also stated to feature an option to retake, edit, delete or share the footage. </p><h2 id="when-are-all-of-these-changes-coming">When are all of these changes 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="gPy9ykDaLykmigSuuNn9Uj" name="pixeltablet_lifestyle3.jpg" alt="Google Pixel Tablet in use out in public promo image" src="https://cdn.mos.cms.futurecdn.net/gPy9ykDaLykmigSuuNn9Uj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Google)</span></figcaption></figure><p>These additions could make using, editing and improving screen recording much easier. Considering Android devices didn’t have a native means to screen record for most of their lifetime, this is great to see. Originally, users had to rely on third-party apps, which were often limited due to various factors and access permissions. </p><p>Android eventually released a native screen recording feature for <a href="https://www.tomsguide.com/reference/android-11">Android 11</a> in 2020, but it could only capture the entire screen. Then, with the release of <a href="https://www.tomsguide.com/news/android-14">Android 14</a>, Google added the option to capture a single app, increasing the feature's usability. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cDP4TxoaL2qGYh6GwwdbzW" name="Android-15-LIST.jpg" alt="Android 15" src="https://cdn.mos.cms.futurecdn.net/cDP4TxoaL2qGYh6GwwdbzW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href=""><strong>The big Apple Intelligence upgrade to Siri is still on the way, but Apple's own testers are raising the alarm</strong></a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-just-tipped-for-a-2-month-delay-but-it-wont-be-getting-that-crazy-name-change"><strong>Samsung Galaxy S26 just tipped for a 2-month delay — but it won't be getting that crazy name change</strong></a></li><li><a href="https://www.tomsguide.com/phones/google-pixel-phones/the-google-pixel-10-pro-fold-is-my-new-favorite-foldable-phone-and-its-all-because-of-this-one-feature"><strong>The Google Pixel 10 Pro Fold is my new favorite foldable phone — and it’s all because of this one feature</strong></a></li></ul><div data-widget-type="merchantlink" data-model-name="Google Pixel Tablet"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Act fast! Google Pixel Tablet just hit an all-time low price — it's $150 off ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Google Pixel Tablet is a versatile device, and it just so happens to be a great iPad alternative for anyone who doesn't want Apple's offering. </p><p>Usually, the Pixel Tablet is relatively competitive with the iPad in pricing, but Amazon is currently offering a post-Prime Day deal that'll get you the <a href="https://www.amazon.com/Google-Pixel-Tablet-Extra-Long-Porcelain/dp/B0CZMFZMR8" target="_blank" rel="nofollow">Pixel Tablet for $249</a>, which is quite reasonable for all the device can do. It's worth noting that this deal doesn't include the Pixel Tablet speaker dock, but you can snag the <a href="https://www.amazon.com/gp/aw/d/B0CZM9N4ZS" target="_blank" rel="nofollow">Pixel Tablet with 256GB pf space for $309</a>, which is only $60 more. </p><div class="product"><a data-dimension112="deb9ee79-3ec1-4646-bb4d-10afe7846945" data-action="Deal Block" data-label="Pixel Tablet (128GB)" data-dimension48="Pixel Tablet (128GB)" data-dimension25="$249" href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZMFZ84J" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="jJFW9x8Ji4jgNdto5SGnLD" name="google pixel tablet deal image" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/jJFW9x8Ji4jgNdto5SGnLD-1920-80.png" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZMFZ84J" target="_blank" rel="nofollow" data-dimension112="deb9ee79-3ec1-4646-bb4d-10afe7846945" data-action="Deal Block" data-label="Pixel Tablet (128GB)" data-dimension48="Pixel Tablet (128GB)" data-dimension25="$249">Pixel Tablet (128GB): was $399 now $249</a></strong><br>Save $150 on Google's Pixel tablet over at Amazon. With it comes excellent screen quality, solid battery life and the ability to control your smart home. You get 128GB of storage, which is enough for most users' needs. For Android fans, you can't go wrong with this deal.<a class="view-deal button" href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZMFZ84J" target="_blank" rel="nofollow" data-dimension112="deb9ee79-3ec1-4646-bb4d-10afe7846945" data-action="Deal Block" data-label="Pixel Tablet (128GB)" data-dimension48="Pixel Tablet (128GB)" data-dimension25="$249">View Deal</a></p></div><div class="product"><a data-dimension112="60bdef9d-1b35-4761-bbf2-dedc9f60dea2" data-action="Deal Block" data-label="Pixel Tablet (256GB)" data-dimension48="Pixel Tablet (256GB)" data-dimension25="$309" href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZM9N4ZS" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:683px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="EDWTJxZzCV6P2ULKZr8bhU" name="google pixel tablet" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/EDWTJxZzCV6P2ULKZr8bhU-1920-80.png" mos="" align="middle" fullscreen="" width="683" height="683" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZM9N4ZS" target="_blank" rel="nofollow" data-dimension112="60bdef9d-1b35-4761-bbf2-dedc9f60dea2" data-action="Deal Block" data-label="Pixel Tablet (256GB)" data-dimension48="Pixel Tablet (256GB)" data-dimension25="$309">Pixel Tablet (256GB): was $499 now $309</a></strong><br>Since Pixel devices don't support microSD cards, you might want to pay for a little bit more storage. The 256GB Pixel Tablet is the exact same device, just with double the free space. Save 38% off the regular price, which is an all-time low price.<a class="view-deal button" href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZM9N4ZS" target="_blank" rel="nofollow" data-dimension112="60bdef9d-1b35-4761-bbf2-dedc9f60dea2" data-action="Deal Block" data-label="Pixel Tablet (256GB)" data-dimension48="Pixel Tablet (256GB)" data-dimension25="$309">View Deal</a></p></div><p>The Google Pixel Tablet isn't a perfect device, but it's a very good one for sure. In fact, in our <a href="https://www.tomsguide.com/reviews/google-pixel-tablet">Pixel Tablet review</a>, we gave it a respectable 4-star rating. </p><p>Our U.S. Editor in Chief, Mike Prospero, said in the review that "The Google Pixel Tablet is a good tablet to have around the house — especially with its speaker dock/charging station. But you’ll want to look elsewhere if you’re looking for a laptop replacement." </p><p>Personally, I don't think using a tablet as a laptop replacement is really a viable option, regardless of whether it's an iPad, Pixel Tablet or something else entirely. We've tested using an <a href="https://www.tomsguide.com/tablets/android-tablets/i-replaced-my-work-laptop-with-the-biggest-android-tablet-you-can-get-3-lessons-i-learned">Android tablet as a laptop replacement</a> here at Tom's Guide in the past, and we found it to be pretty good, so while it's not ideal, it's doable.</p><p>Either way, with the Pixel Tablet, you're getting a device with solid specs (whether you choose the 128GB or 256GB versions) and a big, vibrant screen. And when you add the option to get the speaker dock, it becomes a very cool device to keep around.</p><p>Not the mention this being the lowest price ever offered for Google's tablet.</p><p><em>For more great discounts, be sure to check out our </em><a href="https://www.tomsguide.com/live/news/ive-picked-the-best-october-prime-day-deals-2025#mrfhud=true" target="_blank"><em>Amazon Prime Day deals live blog</em></a><em> right now.</em></p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/android-tablets/act-fast-google-pixel-tablet-just-hit-an-all-time-low-price-its-usd150-off</link>
                                                                            <description>
                            <![CDATA[ This deal on the Google Pixel tablet is absolutely fantastic and selling at an all-time price low Just note that it doesn't come with the speaker dock. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">zirL7BN75drt6T9HzyspFB</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/33iysgTujDKY2mEG8i2xu7-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 09 Oct 2025 21:17:32 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                <author><![CDATA[ dave.leclair@futurenet.com (Dave LeClair) ]]></author>                    <dc:creator><![CDATA[ Dave LeClair ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/fyx7qYdxPMTNBhdnMfNmaB-320-70.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Dave LeClair is the Managing News Editor for Tom&#039;s Guide, keeping his finger on the pulse of all things technology. He loves taking the complicated happenings in the tech world and explaining why they matter. Whether Apple is announcing the next big thing in the mobile space or a small startup advancing generative AI, Dave will apply his experience to help you figure out what&#039;s happening and why it&#039;s relevant to your life.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Before Tom&#039;s Guide, Dave worked for publications like PCMag, Pocket-lint, MUO, How-To Geek, Digital Trends, and others. He started writing about technology professionally for MUO in 2011 and hasn&#039;t looked back since. In addition to news, you can find reviews, how-to pieces, shopping guides, and many other types of content with Dave&#039;s name attached.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/33iysgTujDKY2mEG8i2xu7-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[google pixel tablet held in hand with deal tag]]></media:description>                                                            <media:text><![CDATA[google pixel tablet held in hand with deal tag]]></media:text>
                                <media:title type="plain"><![CDATA[google pixel tablet held in hand with deal tag]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/33iysgTujDKY2mEG8i2xu7-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Google Pixel Tablet is a versatile device, and it just so happens to be a great iPad alternative for anyone who doesn't want Apple's offering. </p><p>Usually, the Pixel Tablet is relatively competitive with the iPad in pricing, but Amazon is currently offering a post-Prime Day deal that'll get you the <a href="https://www.amazon.com/Google-Pixel-Tablet-Extra-Long-Porcelain/dp/B0CZMFZMR8" target="_blank" rel="nofollow">Pixel Tablet for $249</a>, which is quite reasonable for all the device can do. It's worth noting that this deal doesn't include the Pixel Tablet speaker dock, but you can snag the <a href="https://www.amazon.com/gp/aw/d/B0CZM9N4ZS" target="_blank" rel="nofollow">Pixel Tablet with 256GB pf space for $309</a>, which is only $60 more. </p><div class="product"><a data-dimension112="deb9ee79-3ec1-4646-bb4d-10afe7846945" data-action="Deal Block" data-label="Pixel Tablet (128GB)" data-dimension48="Pixel Tablet (128GB)" data-dimension25="$249" href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZMFZ84J" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="jJFW9x8Ji4jgNdto5SGnLD" name="google pixel tablet deal image" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/jJFW9x8Ji4jgNdto5SGnLD-1920-80.png" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZMFZ84J" target="_blank" rel="nofollow" data-dimension112="deb9ee79-3ec1-4646-bb4d-10afe7846945" data-action="Deal Block" data-label="Pixel Tablet (128GB)" data-dimension48="Pixel Tablet (128GB)" data-dimension25="$249">Pixel Tablet (128GB): was $399 now $249</a></strong><br>Save $150 on Google's Pixel tablet over at Amazon. With it comes excellent screen quality, solid battery life and the ability to control your smart home. You get 128GB of storage, which is enough for most users' needs. For Android fans, you can't go wrong with this deal.<a class="view-deal button" href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZMFZ84J" target="_blank" rel="nofollow" data-dimension112="deb9ee79-3ec1-4646-bb4d-10afe7846945" data-action="Deal Block" data-label="Pixel Tablet (128GB)" data-dimension48="Pixel Tablet (128GB)" data-dimension25="$249">View Deal</a></p></div><div class="product"><a data-dimension112="60bdef9d-1b35-4761-bbf2-dedc9f60dea2" data-action="Deal Block" data-label="Pixel Tablet (256GB)" data-dimension48="Pixel Tablet (256GB)" data-dimension25="$309" href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZM9N4ZS" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:683px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="EDWTJxZzCV6P2ULKZr8bhU" name="google pixel tablet" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/EDWTJxZzCV6P2ULKZr8bhU-1920-80.png" mos="" align="middle" fullscreen="" width="683" height="683" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZM9N4ZS" target="_blank" rel="nofollow" data-dimension112="60bdef9d-1b35-4761-bbf2-dedc9f60dea2" data-action="Deal Block" data-label="Pixel Tablet (256GB)" data-dimension48="Pixel Tablet (256GB)" data-dimension25="$309">Pixel Tablet (256GB): was $499 now $309</a></strong><br>Since Pixel devices don't support microSD cards, you might want to pay for a little bit more storage. The 256GB Pixel Tablet is the exact same device, just with double the free space. Save 38% off the regular price, which is an all-time low price.<a class="view-deal button" href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZM9N4ZS" target="_blank" rel="nofollow" data-dimension112="60bdef9d-1b35-4761-bbf2-dedc9f60dea2" data-action="Deal Block" data-label="Pixel Tablet (256GB)" data-dimension48="Pixel Tablet (256GB)" data-dimension25="$309">View Deal</a></p></div><p>The Google Pixel Tablet isn't a perfect device, but it's a very good one for sure. In fact, in our <a href="https://www.tomsguide.com/reviews/google-pixel-tablet">Pixel Tablet review</a>, we gave it a respectable 4-star rating. </p><p>Our U.S. Editor in Chief, Mike Prospero, said in the review that "The Google Pixel Tablet is a good tablet to have around the house — especially with its speaker dock/charging station. But you’ll want to look elsewhere if you’re looking for a laptop replacement." </p><p>Personally, I don't think using a tablet as a laptop replacement is really a viable option, regardless of whether it's an iPad, Pixel Tablet or something else entirely. We've tested using an <a href="https://www.tomsguide.com/tablets/android-tablets/i-replaced-my-work-laptop-with-the-biggest-android-tablet-you-can-get-3-lessons-i-learned">Android tablet as a laptop replacement</a> here at Tom's Guide in the past, and we found it to be pretty good, so while it's not ideal, it's doable.</p><p>Either way, with the Pixel Tablet, you're getting a device with solid specs (whether you choose the 128GB or 256GB versions) and a big, vibrant screen. And when you add the option to get the speaker dock, it becomes a very cool device to keep around.</p><p>Not the mention this being the lowest price ever offered for Google's tablet.</p><p><em>For more great discounts, be sure to check out our </em><a href="https://www.tomsguide.com/live/news/ive-picked-the-best-october-prime-day-deals-2025#mrfhud=true" target="_blank"><em>Amazon Prime Day deals live blog</em></a><em> right now.</em></p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The iPad mini has more competition than ever and this tablet proves it — just with one almighty, unavoidable catch ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Xiaomi is a company you probably don't come across that often, which is fair. It's got almost no market penetration in the U.S., and while adoption is higher in my native U.K., it's certainly not a household name. </p><p>However, the <a href="https://gs.statcounter.com/vendor-market-share/mobile" target="_blank">most recent stats</a> suggest it has 10% of the worldwide smartphone market — because in China, the company is <em>massive</em>. Domestically, around 97 million people carry a Xiaomi phone. That's not far off the 130 million people in the U.S. <a href="https://www.demandsage.com/iphone-user-statistics/" target="_blank">reportedly using an iPhone</a>. And it doesn't <a href="https://www.tomsguide.com/phones/android-phones/forget-iphone-17-pro-xiaomi-17-pro-just-put-a-second-screen-on-the-back">just make smartphones</a> — Xiaomi makes tablets, smart home tech and even electric cars.</p><p>So, when I heard the company was releasing compact tablet to rival the <a href="https://www.tomsguide.com/tablets/ipads/ipad-mini-7-review">iPad mini 7</a> — complete with a performant chipset, 165Hz adaptive screen and accessories like a stylus — I was interested to see the result. For background, I <a href="https://www.tomsguide.com/tablets/my-favorite-ipad-just-fell-to-its-lowest-ever-price-20-percent-off-the-ipad-mini-7"><em>love</em> the iPad mini</a> and I recently finished <a href="https://www.tomsguide.com/computing/android-tablets/forget-the-ipad-mini-this-9-inch-oled-android-tablet-is-way-better-for-gaming">reviewing the RedMagic Astra</a>, which — spoiler alert — I love even more.</p><p>Small tablets are brilliant. They take up less space than bigger devices and they're way cheaper than the <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldable phones</a>. For someone like me who loves nothing more than battered paperbacks and Moleskine notebooks, they're the perfect form factor. So the prospect of trying the Xiaomi Pad Mini for myself had me pretty excited.</p><p>But before we go any further, let me deliver the bad news first: <strong>Xiaomi isn't selling the Pad Mini in the United States, the United Kingdom or Europe</strong>. According to the company's representatives, it'll only be available in China, the Middle East and Southeast Asia. And that sucks, because it's a solid mini tablet. </p><p>(Why the company sent me one to test out, knowing I won't be able to buy it, is a mystery to me as much as it is to you. Kinda rubs salt in the wound, doesn't it?) </p><h2 id="429-for-a-tablet-you-can-t-buy">$429 for a tablet you can't buy</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5712px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PbQfF2yJx4HctuicgSuTeS" name="Xiaomi Pad Mini" alt="The Xiaomi Pad Mini" src="https://cdn.mos.cms.futurecdn.net/PbQfF2yJx4HctuicgSuTeS-1920-80.jpg" mos="" align="middle" fullscreen="" width="5712" height="3213" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Xiaomi is selling the Pad Mini in those above regions for a starting price of $429 in U.S. dollars. Which is a good deal when you start listing the device's specs: 8.8-inch LCD (3,008 x 1,880) display with up to 165Hz refresh rate, 8GB RAM, 256GB storage and a MediaTek Dimensity 9400+ processor.</p><p>A look around at the competition shows this price isn't too bad, especially given the impact of global tariffs on consumer technology right now. The iPad mini 7 starts at $499/ £499 but that's only for 128GB of storage. Apple's pricing increases to $799 if you want 512GB of storage on the iPad mini 7</p><p>On the Android side, the RedMagic Astra has a higher starting price of $699/ £499 for 256GB of storage that gets even higher ($799 / £699) if you push it up to 16GB/512GB.         </p><h2 id="but-my-dreams-aren-t-dead">But my dreams aren't dead</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5712px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YZMfMJi6NvpCrK6ud5sRfS" name="Xiaomi Pad Mini" alt="The Xiaomi Pad Mini" src="https://cdn.mos.cms.futurecdn.net/YZMfMJi6NvpCrK6ud5sRfS-1920-80.jpg" mos="" align="middle" fullscreen="" width="5712" height="3213" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Okay, so the Xiaomi Pad Mini won't be available at Best Buy or Currys anytime soon, but never say never. It could still see a global release and at the very least, the fact it exists in some form is a reason for folks like me to celebrate. </p><p>See, I grew up in the time when small gadgets were <em>cool</em>. I'll never choose an <a href="https://www.tomsguide.com/phones/iphones/iphone-17-pro-max-review">iPhone 17 Pro Max</a> over the regular <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-17-pro-review">iPhone 17 Pro</a> because I don't want to walk around with a phone the size of a dinner plate. Yes, the <a href="https://www.tomsguide.com/news/iphone-flip-everything-we-know-about-apples-foldable-phone-plans">iPhone Fold</a> is on the horizon and <a href="https://www.tomsguide.com/phones/iphones/iphone-air-could-lend-its-ultra-thin-design-to-iphone-fold-what-we-know">that's very exciting</a> — but unless I get a hefty raise between now and next September, it's not on my shopping list.</p><div><blockquote><p>I'll never choose an iPhone 17 Pro Max over the regular iPhone 17 Pro because I don't want to walk around with a phone the size of a dinner plate.</p></blockquote></div><p>But smaller tech that doesn't skimp on power has always faced battery issues. That's being dealt with in two ways: firstly, the likes of TSMC’s 3nm process means we get smaller chips that are more densely packed together and therefore offer better performance without using as much power. The MediaTek Dimensity 9400+ (along with its rival, the <a href="https://www.tomsguide.com/phones/android-phones/qualcomms-snapdragon-8-elite-gen-5-promises-big-performance-and-ai-upgrades-and-we-could-see-them-in-the-galaxy-s26-ultra">Snapdragon 8 Elite</a>) is an example of this.</p><p>Secondly, consumer electronics will soon start benefiting from <a href="https://www.tomsguide.com/news/forget-lithium-ion-worlds-first-silicon-carbon-battery-blows-that-tech-away">silicon-carbon batteries</a> where silicon anodes replace the graphite ones in lithium-ion. They're reportedly up to 10x denser than lithium ions, which means you can fit more battery capacity in the same physical space. That's great if, like the Xiaomi Pad Mini, you have a footprint of 205.13 x 132.03 x 6.46 mm to work with.</p><p>So the future is looking bright for <a href="https://www.tomsguide.com/tablets/i-spent-two-weeks-with-the-ipad-mini-7-and-it-reignited-my-love-for-smaller-tablets">anyone who wants smaller tech</a> that doesn't compromise on power or longevity. Better yet, as these components become cheaper, the price we'll pay as consumers will also hopefully go down. Barring any crazy geopolitics, of course.  </p><h2 id="bottom-line-2">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:5712px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uYqeiQCtdiiPiFqDrTioeS" name="Xiaomi Pad Mini" alt="The Xiaomi Pad Mini" src="https://cdn.mos.cms.futurecdn.net/uYqeiQCtdiiPiFqDrTioeS-1920-80.jpg" mos="" align="middle" fullscreen="" width="5712" height="3213" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/tablets/i-ditched-the-ipad-mini-for-an-android-alternative-and-this-one-feature-means-i-might-not-go-back">I ditched the iPad mini for an Android alternative — and this one feature means I might not go back</a></li><li><a href="https://www.tomsguide.com/tablets/i-spent-two-weeks-with-the-ipad-mini-7-and-it-reignited-my-love-for-smaller-tablets">I spent two weeks with the iPad mini 7 and it reignited my love for smaller tablets</a></li><li><a href="https://www.tomsguide.com/computing/ipads/ipad-mini-8-rumors-everything-we-know-so-far">iPad mini 8 rumors: Everything we know so far</a></li></ul><div data-widget-type="review" data-model-name="Apple iPad mini 7 (2024)"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/android-tablets/the-ipad-mini-has-more-competition-than-ever-and-this-tablet-proves-it-just-with-one-almighty-unavoidable-catch</link>
                                                                            <description>
                            <![CDATA[ The Xiaomi Pad Mini is a worthy iPad mini rival. Too bad you won't be able to buy it. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">26YKp9k9fbLsLony2QDk4f</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Vo768vSmShuwFTeNUtd6eS-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 28 Sep 2025 06:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></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-320-70.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/Vo768vSmShuwFTeNUtd6eS-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Xiaomi Pad Mini]]></media:description>                                                            <media:text><![CDATA[The Xiaomi Pad Mini]]></media:text>
                                <media:title type="plain"><![CDATA[The Xiaomi Pad Mini]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Vo768vSmShuwFTeNUtd6eS-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Xiaomi is a company you probably don't come across that often, which is fair. It's got almost no market penetration in the U.S., and while adoption is higher in my native U.K., it's certainly not a household name. </p><p>However, the <a href="https://gs.statcounter.com/vendor-market-share/mobile" target="_blank">most recent stats</a> suggest it has 10% of the worldwide smartphone market — because in China, the company is <em>massive</em>. Domestically, around 97 million people carry a Xiaomi phone. That's not far off the 130 million people in the U.S. <a href="https://www.demandsage.com/iphone-user-statistics/" target="_blank">reportedly using an iPhone</a>. And it doesn't <a href="https://www.tomsguide.com/phones/android-phones/forget-iphone-17-pro-xiaomi-17-pro-just-put-a-second-screen-on-the-back">just make smartphones</a> — Xiaomi makes tablets, smart home tech and even electric cars.</p><p>So, when I heard the company was releasing compact tablet to rival the <a href="https://www.tomsguide.com/tablets/ipads/ipad-mini-7-review">iPad mini 7</a> — complete with a performant chipset, 165Hz adaptive screen and accessories like a stylus — I was interested to see the result. For background, I <a href="https://www.tomsguide.com/tablets/my-favorite-ipad-just-fell-to-its-lowest-ever-price-20-percent-off-the-ipad-mini-7"><em>love</em> the iPad mini</a> and I recently finished <a href="https://www.tomsguide.com/computing/android-tablets/forget-the-ipad-mini-this-9-inch-oled-android-tablet-is-way-better-for-gaming">reviewing the RedMagic Astra</a>, which — spoiler alert — I love even more.</p><p>Small tablets are brilliant. They take up less space than bigger devices and they're way cheaper than the <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldable phones</a>. For someone like me who loves nothing more than battered paperbacks and Moleskine notebooks, they're the perfect form factor. So the prospect of trying the Xiaomi Pad Mini for myself had me pretty excited.</p><p>But before we go any further, let me deliver the bad news first: <strong>Xiaomi isn't selling the Pad Mini in the United States, the United Kingdom or Europe</strong>. According to the company's representatives, it'll only be available in China, the Middle East and Southeast Asia. And that sucks, because it's a solid mini tablet. </p><p>(Why the company sent me one to test out, knowing I won't be able to buy it, is a mystery to me as much as it is to you. Kinda rubs salt in the wound, doesn't it?) </p><h2 id="429-for-a-tablet-you-can-t-buy">$429 for a tablet you can't buy</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5712px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PbQfF2yJx4HctuicgSuTeS" name="Xiaomi Pad Mini" alt="The Xiaomi Pad Mini" src="https://cdn.mos.cms.futurecdn.net/PbQfF2yJx4HctuicgSuTeS-1920-80.jpg" mos="" align="middle" fullscreen="" width="5712" height="3213" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Xiaomi is selling the Pad Mini in those above regions for a starting price of $429 in U.S. dollars. Which is a good deal when you start listing the device's specs: 8.8-inch LCD (3,008 x 1,880) display with up to 165Hz refresh rate, 8GB RAM, 256GB storage and a MediaTek Dimensity 9400+ processor.</p><p>A look around at the competition shows this price isn't too bad, especially given the impact of global tariffs on consumer technology right now. The iPad mini 7 starts at $499/ £499 but that's only for 128GB of storage. Apple's pricing increases to $799 if you want 512GB of storage on the iPad mini 7</p><p>On the Android side, the RedMagic Astra has a higher starting price of $699/ £499 for 256GB of storage that gets even higher ($799 / £699) if you push it up to 16GB/512GB.         </p><h2 id="but-my-dreams-aren-t-dead">But my dreams aren't dead</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5712px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YZMfMJi6NvpCrK6ud5sRfS" name="Xiaomi Pad Mini" alt="The Xiaomi Pad Mini" src="https://cdn.mos.cms.futurecdn.net/YZMfMJi6NvpCrK6ud5sRfS-1920-80.jpg" mos="" align="middle" fullscreen="" width="5712" height="3213" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Okay, so the Xiaomi Pad Mini won't be available at Best Buy or Currys anytime soon, but never say never. It could still see a global release and at the very least, the fact it exists in some form is a reason for folks like me to celebrate. </p><p>See, I grew up in the time when small gadgets were <em>cool</em>. I'll never choose an <a href="https://www.tomsguide.com/phones/iphones/iphone-17-pro-max-review">iPhone 17 Pro Max</a> over the regular <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-17-pro-review">iPhone 17 Pro</a> because I don't want to walk around with a phone the size of a dinner plate. Yes, the <a href="https://www.tomsguide.com/news/iphone-flip-everything-we-know-about-apples-foldable-phone-plans">iPhone Fold</a> is on the horizon and <a href="https://www.tomsguide.com/phones/iphones/iphone-air-could-lend-its-ultra-thin-design-to-iphone-fold-what-we-know">that's very exciting</a> — but unless I get a hefty raise between now and next September, it's not on my shopping list.</p><div><blockquote><p>I'll never choose an iPhone 17 Pro Max over the regular iPhone 17 Pro because I don't want to walk around with a phone the size of a dinner plate.</p></blockquote></div><p>But smaller tech that doesn't skimp on power has always faced battery issues. That's being dealt with in two ways: firstly, the likes of TSMC’s 3nm process means we get smaller chips that are more densely packed together and therefore offer better performance without using as much power. The MediaTek Dimensity 9400+ (along with its rival, the <a href="https://www.tomsguide.com/phones/android-phones/qualcomms-snapdragon-8-elite-gen-5-promises-big-performance-and-ai-upgrades-and-we-could-see-them-in-the-galaxy-s26-ultra">Snapdragon 8 Elite</a>) is an example of this.</p><p>Secondly, consumer electronics will soon start benefiting from <a href="https://www.tomsguide.com/news/forget-lithium-ion-worlds-first-silicon-carbon-battery-blows-that-tech-away">silicon-carbon batteries</a> where silicon anodes replace the graphite ones in lithium-ion. They're reportedly up to 10x denser than lithium ions, which means you can fit more battery capacity in the same physical space. That's great if, like the Xiaomi Pad Mini, you have a footprint of 205.13 x 132.03 x 6.46 mm to work with.</p><p>So the future is looking bright for <a href="https://www.tomsguide.com/tablets/i-spent-two-weeks-with-the-ipad-mini-7-and-it-reignited-my-love-for-smaller-tablets">anyone who wants smaller tech</a> that doesn't compromise on power or longevity. Better yet, as these components become cheaper, the price we'll pay as consumers will also hopefully go down. Barring any crazy geopolitics, of course.  </p><h2 id="bottom-line-2">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:5712px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uYqeiQCtdiiPiFqDrTioeS" name="Xiaomi Pad Mini" alt="The Xiaomi Pad Mini" src="https://cdn.mos.cms.futurecdn.net/uYqeiQCtdiiPiFqDrTioeS-1920-80.jpg" mos="" align="middle" fullscreen="" width="5712" height="3213" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/tablets/i-ditched-the-ipad-mini-for-an-android-alternative-and-this-one-feature-means-i-might-not-go-back">I ditched the iPad mini for an Android alternative — and this one feature means I might not go back</a></li><li><a href="https://www.tomsguide.com/tablets/i-spent-two-weeks-with-the-ipad-mini-7-and-it-reignited-my-love-for-smaller-tablets">I spent two weeks with the iPad mini 7 and it reignited my love for smaller tablets</a></li><li><a href="https://www.tomsguide.com/computing/ipads/ipad-mini-8-rumors-everything-we-know-so-far">iPad mini 8 rumors: Everything we know so far</a></li></ul><div data-widget-type="review" data-model-name="Apple iPad mini 7 (2024)"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Epic Lenovo sale — 11 budget-friendly picks under $300 on tablets, monitors and more ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Whether at home, at school, or in the workplace, investing in tech can totally transform the way you execute your day-to-day tasks. And right now, Lenovo is offering some huge discounts across tablets, monitors, wireless accessories and more.</p><p>And while I love a sales event, it can still feel like a pricey commitment, especially when it comes to tech. That's why I've browsed the <a href="https://www.lenovo.com/us/en/d/deals/doorbusters/?sortBy=Recommended" target="_blank" rel="nofollow">entire Lenovo sale</a> and picked the 11 budget-friendly options that won't cost you more than $300.</p><p>From <a href="https://www.lenovo.com/us/en/p/accessories-and-software/audio/audio_earbuds/78810053" target="_blank" rel="nofollow">JLab Go Pop Earbuds for just $24</a> to the <a href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/home/66e4ucc1us" target="_blank" rel="nofollow">Lenovo 15.6" FHD Portable Monitor at almost $100 off</a>, there's plenty to choose from that won't break the bank. So, upgrade your setup for less with these top picks. (For more ways to save, check out our guide to the best <a href="https://www.tomsguide.com/computing/lenovo-coupon-codes">Lenovo coupon codes</a>).</p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><strong></strong><a href="https://www.lenovo.com/us/en/d/deals/doorbusters/?sortBy=Recommended" target="_blank" rel="nofollow"><strong>Shop all Lenovo deals</strong></a><strong></strong></li><li><strong>Lenovo 400 Wireless Mouse: </strong><a href="https://www.lenovo.com/us/en/p/accessories-and-software/keyboards-and-mice/mice/gy50r91293" target="_blank" rel="nofollow"><strong>was $18 now $8</strong></a><strong></strong></li><li><strong>Lenovo JLab Go Pop Earbuds: </strong><a href="https://www.lenovo.com/us/en/p/accessories-and-software/audio/audio_earbuds/78810053" target="_blank" rel="nofollow"><strong>was $29 now $24</strong></a><strong></strong></li><li><strong>Lenovo JLab Go Wireless Headset: </strong><a href="https://www.lenovo.com/us/en/p/accessories-and-software/audio/headsets/78318751" target="_blank" rel="nofollow"><strong>was $49 now $44</strong></a><strong></strong></li><li><strong>Lenovo Go Wireless Split Keyboard: </strong><a href="https://www.lenovo.com/us/en/p/accessories-and-software/keyboards-and-mice/keyboards/4y41c33748" target="_blank" rel="nofollow"><strong>was $114 now $71</strong></a><strong></strong></li><li><strong>Lenovo Tab One: </strong><a href="https://www.lenovo.com/us/en/p/tablets/android-tablets/lenovo-tab-series/lenovo-tab-one/zaf00008us" target="_blank" rel="nofollow"><strong>was $149 now $99</strong></a><strong></strong></li><li><strong>Lenovo Tab M11: </strong><a href="https://www.lenovo.com/us/en/p/tablets/android-tablets/lenovo-tab-series/lenovo-tab-m11-11-inch-mtk/zada0019us" target="_blank" rel="nofollow"><strong>was $119 now $119</strong></a><strong></strong></li><li><strong>Lenovo 15.6” FHD Portable Monitor: </strong><a href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/home/66e4ucc1us" target="_blank" rel="nofollow"><strong>was $239 now $149</strong></a><strong></strong></li><li><strong>Lenovo 27” QHD USB-C Monitor: </strong><a href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/home/67c0ucc6us" target="_blank" rel="nofollow"><strong>was $294 now $220</strong></a><strong></strong></li><li><strong>Lenovo ThinkVision 14” Portable Monitor: </strong><a href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/office/63aauar6us" target="_blank" rel="nofollow"><strong>was $327 now $219</strong></a><strong></strong></li><li><strong>Lenovo Mobile Pixels 15.6” Stackable Monitor: </strong><a href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/monitors_portable/78695992" target="_blank" rel="nofollow"><strong>was $299 now $254</strong></a><strong></strong></li><li><strong>Lenovo Idea Tab Pro: </strong><a href="https://www.lenovo.com/us/en/p/tablets/android-tablets/idea-tab-series/lenovo-idea-tab-pro/zae40136us" target="_blank" rel="nofollow"><strong>was $389 now $289</strong></a><strong></strong></li></ul><h3 class="article-body__section" id="section-best-lenovo-deals-under-300"><span>Best Lenovo deals under $300</span></h3><div class="product"><a data-dimension112="23b1c7ea-5147-4733-a805-0b1b2b78a04f" data-action="Deal Block" data-label="400 Wireless Mouse" data-dimension48="400 Wireless Mouse" data-dimension25="$8" href="https://www.lenovo.com/us/en/p/accessories-and-software/keyboards-and-mice/mice/gy50r91293" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1354px;"><p class="vanilla-image-block" style="padding-top:77.55%;"><img id="SGzX27P8G5Fv9f7HURfSbf" name="Lenovo 400 Wireless Mouse" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/SGzX27P8G5Fv9f7HURfSbf-1920-80.png" mos="" align="middle" fullscreen="" width="1354" height="1050" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.lenovo.com/us/en/p/accessories-and-software/keyboards-and-mice/mice/gy50r91293" target="_blank" rel="nofollow" data-dimension112="23b1c7ea-5147-4733-a805-0b1b2b78a04f" data-action="Deal Block" data-label="400 Wireless Mouse" data-dimension48="400 Wireless Mouse" data-dimension25="$8">400 Wireless Mouse: was $18 now $8</a></strong><br>With over 1,000 reviews and a 4.6/5 rating, this wireless mouse is a popular pick for an easy-to-use, plug in and go solution. It's also incredibly lightweight for travel, weighing in at just 65g, and boasts an excellent battery life, which Lenovo says "lasts up to 12 months" depending on usage. Now over half off!<a class="view-deal button" href="https://www.lenovo.com/us/en/p/accessories-and-software/keyboards-and-mice/mice/gy50r91293" target="_blank" rel="nofollow" data-dimension112="23b1c7ea-5147-4733-a805-0b1b2b78a04f" data-action="Deal Block" data-label="400 Wireless Mouse" data-dimension48="400 Wireless Mouse" data-dimension25="$8">View Deal</a></p></div><div class="product"><a data-dimension112="7b09fdbb-3254-45a0-adcc-3221f42c7558" data-action="Deal Block" data-label="JLab Go Pop Earbuds" data-dimension48="JLab Go Pop Earbuds" data-dimension25="$24" href="https://www.lenovo.com/us/en/p/accessories-and-software/audio/audio_earbuds/78810053" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1202px;"><p class="vanilla-image-block" style="padding-top:90.35%;"><img id="f4CzMjtNg2ihye9gSS77cf" name="Lenovo JLab Go Pop Earbuds" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/f4CzMjtNg2ihye9gSS77cf-1920-80.png" mos="" align="middle" fullscreen="" width="1202" height="1086" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.lenovo.com/us/en/p/accessories-and-software/audio/audio_earbuds/78810053" target="_blank" rel="nofollow" data-dimension112="7b09fdbb-3254-45a0-adcc-3221f42c7558" data-action="Deal Block" data-label="JLab Go Pop Earbuds" data-dimension48="JLab Go Pop Earbuds" data-dimension25="$24">JLab Go Pop Earbuds: was $29 now $24</a></strong><br>If you're looking for affordable wireless buds, these are a solid choice if you're on-the-go, whether heading out for a walk or going to the gym. Plus, with a lightweight, sweat-proof design, you'll find they're comfortable as well as secure when getting in your cardio. Alongside this Translucent Teal, there's also five other colorways to choose from, all at the same excellent discount.<a class="view-deal button" href="https://www.lenovo.com/us/en/p/accessories-and-software/audio/audio_earbuds/78810053" target="_blank" rel="nofollow" data-dimension112="7b09fdbb-3254-45a0-adcc-3221f42c7558" data-action="Deal Block" data-label="JLab Go Pop Earbuds" data-dimension48="JLab Go Pop Earbuds" data-dimension25="$24">View Deal</a></p></div><div class="product"><a data-dimension112="66739fd0-8559-4edf-ac24-aa9136f87cd4" data-action="Deal Block" data-label="JLab Go Wireless Headset" data-dimension48="JLab Go Wireless Headset" data-dimension25="$44" href="https://www.lenovo.com/us/en/p/accessories-and-software/audio/headsets/78318751" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:970px;"><p class="vanilla-image-block" style="padding-top:101.44%;"><img id="wDsMssSsMxn92KMPf8kVZf" name="Lenovo JLab Go Wireless Headset" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/wDsMssSsMxn92KMPf8kVZf-1920-80.png" mos="" align="middle" fullscreen="" width="970" height="984" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.lenovo.com/us/en/p/accessories-and-software/audio/headsets/78318751" target="_blank" rel="nofollow" data-dimension112="66739fd0-8559-4edf-ac24-aa9136f87cd4" data-action="Deal Block" data-label="JLab Go Wireless Headset" data-dimension48="JLab Go Wireless Headset" data-dimension25="$44">JLab Go Wireless Headset: was $49 now $44</a></strong><br>Level up your work-from-home setup with the Go Work wireless on-ear headset packed with features, including Bluetooth Multipoint for connecting to multiple devices at once, 45 hours of battery life, a quick mute function and comfy Cloud Foam earcups. And the mute function will tell you with a simple LED light whether you need to unmute in your call.<a class="view-deal button" href="https://www.lenovo.com/us/en/p/accessories-and-software/audio/headsets/78318751" target="_blank" rel="nofollow" data-dimension112="66739fd0-8559-4edf-ac24-aa9136f87cd4" data-action="Deal Block" data-label="JLab Go Wireless Headset" data-dimension48="JLab Go Wireless Headset" data-dimension25="$44">View Deal</a></p></div><div class="product"><a data-dimension112="4c8f423c-a218-447d-9335-03382ae3cd83" data-action="Deal Block" data-label="Go Wireless Split Keyboard" data-dimension48="Go Wireless Split Keyboard" data-dimension25="$71" href="https://www.lenovo.com/us/en/p/accessories-and-software/keyboards-and-mice/keyboards/4y41c33748" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1370px;"><p class="vanilla-image-block" style="padding-top:84.09%;"><img id="MubRcYFx2wnaY3d5jYG4gE" name="Lenovo Go Wireless Split Keyboard" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/MubRcYFx2wnaY3d5jYG4gE-1920-80.png" mos="" align="middle" fullscreen="" width="1370" height="1152" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.lenovo.com/us/en/p/accessories-and-software/keyboards-and-mice/keyboards/4y41c33748" target="_blank" rel="nofollow" data-dimension112="4c8f423c-a218-447d-9335-03382ae3cd83" data-action="Deal Block" data-label="Go Wireless Split Keyboard" data-dimension48="Go Wireless Split Keyboard" data-dimension25="$71">Go Wireless Split Keyboard: was $114 now $71</a></strong><br>I transitioned to a split keyboard to help with posture, sore hands and achy shoulders and I've never looked back. This one from Lenovo is currently a huge $43 off and offers relief from all of things I mentioned. Plus, the treated cork palm rest is super comfy to give your wrists the break they deserve from all that typing!<a class="view-deal button" href="https://www.lenovo.com/us/en/p/accessories-and-software/keyboards-and-mice/keyboards/4y41c33748" target="_blank" rel="nofollow" data-dimension112="4c8f423c-a218-447d-9335-03382ae3cd83" data-action="Deal Block" data-label="Go Wireless Split Keyboard" data-dimension48="Go Wireless Split Keyboard" data-dimension25="$71">View Deal</a></p></div><div class="product"><a data-dimension112="8845795f-4f2d-4f58-918a-130e9b561e82" data-action="Deal Block" data-label="Tab One" data-dimension48="Tab One" data-dimension25="$99" href="https://www.lenovo.com/us/en/p/tablets/android-tablets/lenovo-tab-series/lenovo-tab-one/zaf00008us" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1074px;"><p class="vanilla-image-block" style="padding-top:96.09%;"><img id="29CUsHu6JmbYb99z5ACCaf" name="Lenovo Tab One" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/29CUsHu6JmbYb99z5ACCaf-1920-80.png" mos="" align="middle" fullscreen="" width="1074" height="1032" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>On the hunt for a super affordable and lightweight tablet? The Lenovo Tab One is currently only $100 for the 8.7-inch model that'll fit easily into your bag or even your pocket. A HD screen, Dolby Atmos sound, up to 12.5 hours of battery and 64GB storage are just some of the awesome features on offer in this stylish tab.<a class="view-deal button" href="https://www.lenovo.com/us/en/p/tablets/android-tablets/lenovo-tab-series/lenovo-tab-one/zaf00008us" target="_blank" rel="nofollow" data-dimension112="8845795f-4f2d-4f58-918a-130e9b561e82" data-action="Deal Block" data-label="Tab One" data-dimension48="Tab One" data-dimension25="$99">View Deal</a></p></div><div class="product"><a data-dimension112="c9279ca3-42d1-4c8c-864b-2650c44b793f" data-action="Deal Block" data-label="Tab M11" data-dimension48="Tab M11" data-dimension25="$119" href="https://www.lenovo.com/us/en/p/tablets/android-tablets/lenovo-tab-series/lenovo-tab-m11-11-inch-mtk/zada0019us" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1312px;"><p class="vanilla-image-block" style="padding-top:86.13%;"><img id="kE5HBkkpuw3t2AgWnB79ef" name="Lenovo Tab M11" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/kE5HBkkpuw3t2AgWnB79ef-1920-80.png" mos="" align="middle" fullscreen="" width="1312" height="1130" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you're looking for something a little bigger that's still budget-friendly, the Lenovo Tab M11 is a 1080p 11-inch display with up to 128GB storage, 10 hours of battery life, fast-charging, and running on Android 13 OS. For easy streaming and great multitasking, it's an entry-level tablet that won't cost you too much.<a class="view-deal button" href="https://www.lenovo.com/us/en/p/tablets/android-tablets/lenovo-tab-series/lenovo-tab-m11-11-inch-mtk/zada0019us" target="_blank" rel="nofollow" data-dimension112="c9279ca3-42d1-4c8c-864b-2650c44b793f" data-action="Deal Block" data-label="Tab M11" data-dimension48="Tab M11" data-dimension25="$119">View Deal</a></p></div><div class="product"><a data-dimension112="a3f0bcb9-c078-4be9-b0e0-39979467ca64" data-action="Deal Block" data-label="15.6” FHD Portable Monitor" data-dimension48="15.6” FHD Portable Monitor" data-dimension25="$149" href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/home/66e4ucc1us" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1326px;"><p class="vanilla-image-block" style="padding-top:88.54%;"><img id="nCjVTKEmZwvukrHiBfnUef" name="Lenovo 15.6” FHD Portable Monitor" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/nCjVTKEmZwvukrHiBfnUef-1920-80.png" mos="" align="middle" fullscreen="" width="1326" height="1174" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/home/66e4ucc1us" target="_blank" rel="nofollow" data-dimension112="a3f0bcb9-c078-4be9-b0e0-39979467ca64" data-action="Deal Block" data-label="15.6” FHD Portable Monitor" data-dimension48="15.6” FHD Portable Monitor" data-dimension25="$149">15.6” FHD Portable Monitor: was $239 now $149</a></strong><br>Right now, you can secure $90 off this portable monitor that Lenovo is called "a great companion for your compatible phone or laptop." Easily connected via a USB-C cable, you get to experience your smaller screen on a 15.6-inch full HD anti-glare display that's super lightweight and super slim. And it's portable too with an adjustable foot switching it easily between portrait or landscape.<a class="view-deal button" href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/home/66e4ucc1us" target="_blank" rel="nofollow" data-dimension112="a3f0bcb9-c078-4be9-b0e0-39979467ca64" data-action="Deal Block" data-label="15.6” FHD Portable Monitor" data-dimension48="15.6” FHD Portable Monitor" data-dimension25="$149">View Deal</a></p></div><div class="product"><a data-dimension112="fd875fa2-991c-453c-b4b9-aeba89ea05d8" data-action="Deal Block" data-label="27” QHD USB-C Monitor" data-dimension48="27” QHD USB-C Monitor" data-dimension25="$220" href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/home/67c0ucc6us" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1350px;"><p class="vanilla-image-block" style="padding-top:86.07%;"><img id="H52QBFQfL3NPNFeyY5Gpcf" name="Lenovo 27” QHD USB-C Monitor" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/H52QBFQfL3NPNFeyY5Gpcf-1920-80.png" mos="" align="middle" fullscreen="" width="1350" height="1162" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/home/67c0ucc6us" target="_blank" rel="nofollow" data-dimension112="fd875fa2-991c-453c-b4b9-aeba89ea05d8" data-action="Deal Block" data-label="27” QHD USB-C Monitor" data-dimension48="27” QHD USB-C Monitor" data-dimension25="$220">27” QHD USB-C Monitor: was $294 now $220</a></strong><br>Fed up of looking at a small screen? Size up to this 27-inch Lenovo monitor with a cool $75 off for a smooth viewing experience, thanks to a 100Hz refresh rate and dual 3W speakers. Plus, it's lovely to look at too with each side sporting an ultra-thin bezel design. <a class="view-deal button" href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/home/67c0ucc6us" target="_blank" rel="nofollow" data-dimension112="fd875fa2-991c-453c-b4b9-aeba89ea05d8" data-action="Deal Block" data-label="27” QHD USB-C Monitor" data-dimension48="27” QHD USB-C Monitor" data-dimension25="$220">View Deal</a></p></div><div class="product"><a data-dimension112="2edf9058-733b-4827-9da7-41507ae02f65" data-action="Deal Block" data-label="ThinkVision 14” Portable Monitor" data-dimension48="ThinkVision 14” Portable Monitor" data-dimension25="$219" href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/office/63aauar6us" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1334px;"><p class="vanilla-image-block" style="padding-top:88.16%;"><img id="djbZ3s72UdUNa2pJkMpJdf" name="Lenovo ThinkVision 14” Portable Monitor" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/djbZ3s72UdUNa2pJkMpJdf-1920-80.png" mos="" align="middle" fullscreen="" width="1334" height="1176" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/office/63aauar6us" target="_blank" rel="nofollow" data-dimension112="2edf9058-733b-4827-9da7-41507ae02f65" data-action="Deal Block" data-label="ThinkVision 14” Portable Monitor" data-dimension48="ThinkVision 14” Portable Monitor" data-dimension25="$219">ThinkVision 14” Portable Monitor: was $327 now $219</a></strong><br>This high-spec portable monitor would usually  set you back $327, but with over $100 off, you can enjoy the wide viewing angle of this easily portable screen with 2240 x 1400 FHD resolution. It even comes with an ergonomic stand that'll make adjusting your view to any position incredibly smooth. <a class="view-deal button" href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/office/63aauar6us" target="_blank" rel="nofollow" data-dimension112="2edf9058-733b-4827-9da7-41507ae02f65" data-action="Deal Block" data-label="ThinkVision 14” Portable Monitor" data-dimension48="ThinkVision 14” Portable Monitor" data-dimension25="$219">View Deal</a></p></div><div class="product"><a data-dimension112="00a10025-f7e4-452f-bfd8-ed5c70cc177c" data-action="Deal Block" data-label="Mobile Pixels 15.6” Stackable Monitor" data-dimension48="Mobile Pixels 15.6” Stackable Monitor" data-dimension25="$254" href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/monitors_portable/78695992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1298px;"><p class="vanilla-image-block" style="padding-top:90.60%;"><img id="krUCKequ33945Vt8uhWPdf" name="Lenovo Mobile Pixels 15.6” Stackable Monitor" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/krUCKequ33945Vt8uhWPdf-1920-80.png" mos="" align="middle" fullscreen="" width="1298" height="1176" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/monitors_portable/78695992" target="_blank" rel="nofollow" data-dimension112="00a10025-f7e4-452f-bfd8-ed5c70cc177c" data-action="Deal Block" data-label="Mobile Pixels 15.6” Stackable Monitor" data-dimension48="Mobile Pixels 15.6” Stackable Monitor" data-dimension25="$254">Mobile Pixels 15.6” Stackable Monitor: was $299 now $254</a></strong><br>If you like working across two screens, but don't have the space and still want the portability, this stackable monitor is perfect for use with 15-inch and 16-inch laptops. You can either stack it, use the built-in kickstand or rotate it for three different ways to view. And it's easy to plug-and-play with two USB-C ports and one mini HDMI port.<a class="view-deal button" href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/monitors_portable/78695992" target="_blank" rel="nofollow" data-dimension112="00a10025-f7e4-452f-bfd8-ed5c70cc177c" data-action="Deal Block" data-label="Mobile Pixels 15.6” Stackable Monitor" data-dimension48="Mobile Pixels 15.6” Stackable Monitor" data-dimension25="$254">View Deal</a></p></div><div class="product"><a data-dimension112="c0f92342-81bd-47fe-a906-c8c436226dc7" data-action="Deal Block" data-label="Idea Tab Pro" data-dimension48="Idea Tab Pro" data-dimension25="$289" href="https://www.lenovo.com/us/en/p/tablets/android-tablets/idea-tab-series/lenovo-idea-tab-pro/zae40136us" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1374px;"><p class="vanilla-image-block" style="padding-top:86.75%;"><img id="JZHUVx3BWcqT4eQzW7qydf" name="Lenovo Idea Tab Pro" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/JZHUVx3BWcqT4eQzW7qydf-1920-80.png" mos="" align="middle" fullscreen="" width="1374" height="1192" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.lenovo.com/us/en/p/tablets/android-tablets/idea-tab-series/lenovo-idea-tab-pro/zae40136us" target="_blank" rel="nofollow" data-dimension112="c0f92342-81bd-47fe-a906-c8c436226dc7" data-action="Deal Block" data-label="Idea Tab Pro" data-dimension48="Idea Tab Pro" data-dimension25="$289">Idea Tab Pro: was $389 now $289</a></strong><br>Scraping in at the top end of my under $300 picks, I recommend the Tab Pro, especially at $100 off. This 12.7-inch 3K display with quad JBL speakers makes it the perfect companion for your work and play without having to carry around a laptop. Plus, you get a Lenovo Tab Pen Plus to use alongside it.<a class="view-deal button" href="https://www.lenovo.com/us/en/p/tablets/android-tablets/idea-tab-series/lenovo-idea-tab-pro/zae40136us" target="_blank" rel="nofollow" data-dimension112="c0f92342-81bd-47fe-a906-c8c436226dc7" data-action="Deal Block" data-label="Idea Tab Pro" data-dimension48="Idea Tab Pro" data-dimension25="$289">View Deal</a></p></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/android-tablets/epic-lenovo-sale-11-budget-friendly-picks-under-usd300-on-tablets-monitors-and-more</link>
                                                                            <description>
                            <![CDATA[ Lenovo has some excellent deals right now and I've narrowed down 11 budget-friendly options that won't cost you more than $300. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">wsg2BHoDtsAcP8vf655Q78</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/nwEPgFGDcTiMvFjGbkARu-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 19 Sep 2025 07:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                                    <dc:creator><![CDATA[ Grace Dean ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oxXqkks7wgxZkPiyYY2n6H-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/nwEPgFGDcTiMvFjGbkARu-1920-80.jpg">
                                                            <media:credit><![CDATA[Lenovo]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Lenovo Tab M9]]></media:description>                                                            <media:text><![CDATA[Lenovo Tab M9]]></media:text>
                                <media:title type="plain"><![CDATA[Lenovo Tab M9]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/nwEPgFGDcTiMvFjGbkARu-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Whether at home, at school, or in the workplace, investing in tech can totally transform the way you execute your day-to-day tasks. And right now, Lenovo is offering some huge discounts across tablets, monitors, wireless accessories and more.</p><p>And while I love a sales event, it can still feel like a pricey commitment, especially when it comes to tech. That's why I've browsed the <a href="https://www.lenovo.com/us/en/d/deals/doorbusters/?sortBy=Recommended" target="_blank" rel="nofollow">entire Lenovo sale</a> and picked the 11 budget-friendly options that won't cost you more than $300.</p><p>From <a href="https://www.lenovo.com/us/en/p/accessories-and-software/audio/audio_earbuds/78810053" target="_blank" rel="nofollow">JLab Go Pop Earbuds for just $24</a> to the <a href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/home/66e4ucc1us" target="_blank" rel="nofollow">Lenovo 15.6" FHD Portable Monitor at almost $100 off</a>, there's plenty to choose from that won't break the bank. So, upgrade your setup for less with these top picks. (For more ways to save, check out our guide to the best <a href="https://www.tomsguide.com/computing/lenovo-coupon-codes">Lenovo coupon codes</a>).</p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><strong></strong><a href="https://www.lenovo.com/us/en/d/deals/doorbusters/?sortBy=Recommended" target="_blank" rel="nofollow"><strong>Shop all Lenovo deals</strong></a><strong></strong></li><li><strong>Lenovo 400 Wireless Mouse: </strong><a href="https://www.lenovo.com/us/en/p/accessories-and-software/keyboards-and-mice/mice/gy50r91293" target="_blank" rel="nofollow"><strong>was $18 now $8</strong></a><strong></strong></li><li><strong>Lenovo JLab Go Pop Earbuds: </strong><a href="https://www.lenovo.com/us/en/p/accessories-and-software/audio/audio_earbuds/78810053" target="_blank" rel="nofollow"><strong>was $29 now $24</strong></a><strong></strong></li><li><strong>Lenovo JLab Go Wireless Headset: </strong><a href="https://www.lenovo.com/us/en/p/accessories-and-software/audio/headsets/78318751" target="_blank" rel="nofollow"><strong>was $49 now $44</strong></a><strong></strong></li><li><strong>Lenovo Go Wireless Split Keyboard: </strong><a href="https://www.lenovo.com/us/en/p/accessories-and-software/keyboards-and-mice/keyboards/4y41c33748" target="_blank" rel="nofollow"><strong>was $114 now $71</strong></a><strong></strong></li><li><strong>Lenovo Tab One: </strong><a href="https://www.lenovo.com/us/en/p/tablets/android-tablets/lenovo-tab-series/lenovo-tab-one/zaf00008us" target="_blank" rel="nofollow"><strong>was $149 now $99</strong></a><strong></strong></li><li><strong>Lenovo Tab M11: </strong><a href="https://www.lenovo.com/us/en/p/tablets/android-tablets/lenovo-tab-series/lenovo-tab-m11-11-inch-mtk/zada0019us" target="_blank" rel="nofollow"><strong>was $119 now $119</strong></a><strong></strong></li><li><strong>Lenovo 15.6” FHD Portable Monitor: </strong><a href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/home/66e4ucc1us" target="_blank" rel="nofollow"><strong>was $239 now $149</strong></a><strong></strong></li><li><strong>Lenovo 27” QHD USB-C Monitor: </strong><a href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/home/67c0ucc6us" target="_blank" rel="nofollow"><strong>was $294 now $220</strong></a><strong></strong></li><li><strong>Lenovo ThinkVision 14” Portable Monitor: </strong><a href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/office/63aauar6us" target="_blank" rel="nofollow"><strong>was $327 now $219</strong></a><strong></strong></li><li><strong>Lenovo Mobile Pixels 15.6” Stackable Monitor: </strong><a href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/monitors_portable/78695992" target="_blank" rel="nofollow"><strong>was $299 now $254</strong></a><strong></strong></li><li><strong>Lenovo Idea Tab Pro: </strong><a href="https://www.lenovo.com/us/en/p/tablets/android-tablets/idea-tab-series/lenovo-idea-tab-pro/zae40136us" target="_blank" rel="nofollow"><strong>was $389 now $289</strong></a><strong></strong></li></ul><h3 class="article-body__section" id="section-best-lenovo-deals-under-300"><span>Best Lenovo deals under $300</span></h3><div class="product"><a data-dimension112="23b1c7ea-5147-4733-a805-0b1b2b78a04f" data-action="Deal Block" data-label="400 Wireless Mouse" data-dimension48="400 Wireless Mouse" data-dimension25="$8" href="https://www.lenovo.com/us/en/p/accessories-and-software/keyboards-and-mice/mice/gy50r91293" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1354px;"><p class="vanilla-image-block" style="padding-top:77.55%;"><img id="SGzX27P8G5Fv9f7HURfSbf" name="Lenovo 400 Wireless Mouse" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/SGzX27P8G5Fv9f7HURfSbf-1920-80.png" mos="" align="middle" fullscreen="" width="1354" height="1050" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.lenovo.com/us/en/p/accessories-and-software/keyboards-and-mice/mice/gy50r91293" target="_blank" rel="nofollow" data-dimension112="23b1c7ea-5147-4733-a805-0b1b2b78a04f" data-action="Deal Block" data-label="400 Wireless Mouse" data-dimension48="400 Wireless Mouse" data-dimension25="$8">400 Wireless Mouse: was $18 now $8</a></strong><br>With over 1,000 reviews and a 4.6/5 rating, this wireless mouse is a popular pick for an easy-to-use, plug in and go solution. It's also incredibly lightweight for travel, weighing in at just 65g, and boasts an excellent battery life, which Lenovo says "lasts up to 12 months" depending on usage. Now over half off!<a class="view-deal button" href="https://www.lenovo.com/us/en/p/accessories-and-software/keyboards-and-mice/mice/gy50r91293" target="_blank" rel="nofollow" data-dimension112="23b1c7ea-5147-4733-a805-0b1b2b78a04f" data-action="Deal Block" data-label="400 Wireless Mouse" data-dimension48="400 Wireless Mouse" data-dimension25="$8">View Deal</a></p></div><div class="product"><a data-dimension112="7b09fdbb-3254-45a0-adcc-3221f42c7558" data-action="Deal Block" data-label="JLab Go Pop Earbuds" data-dimension48="JLab Go Pop Earbuds" data-dimension25="$24" href="https://www.lenovo.com/us/en/p/accessories-and-software/audio/audio_earbuds/78810053" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1202px;"><p class="vanilla-image-block" style="padding-top:90.35%;"><img id="f4CzMjtNg2ihye9gSS77cf" name="Lenovo JLab Go Pop Earbuds" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/f4CzMjtNg2ihye9gSS77cf-1920-80.png" mos="" align="middle" fullscreen="" width="1202" height="1086" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.lenovo.com/us/en/p/accessories-and-software/audio/audio_earbuds/78810053" target="_blank" rel="nofollow" data-dimension112="7b09fdbb-3254-45a0-adcc-3221f42c7558" data-action="Deal Block" data-label="JLab Go Pop Earbuds" data-dimension48="JLab Go Pop Earbuds" data-dimension25="$24">JLab Go Pop Earbuds: was $29 now $24</a></strong><br>If you're looking for affordable wireless buds, these are a solid choice if you're on-the-go, whether heading out for a walk or going to the gym. Plus, with a lightweight, sweat-proof design, you'll find they're comfortable as well as secure when getting in your cardio. Alongside this Translucent Teal, there's also five other colorways to choose from, all at the same excellent discount.<a class="view-deal button" href="https://www.lenovo.com/us/en/p/accessories-and-software/audio/audio_earbuds/78810053" target="_blank" rel="nofollow" data-dimension112="7b09fdbb-3254-45a0-adcc-3221f42c7558" data-action="Deal Block" data-label="JLab Go Pop Earbuds" data-dimension48="JLab Go Pop Earbuds" data-dimension25="$24">View Deal</a></p></div><div class="product"><a data-dimension112="66739fd0-8559-4edf-ac24-aa9136f87cd4" data-action="Deal Block" data-label="JLab Go Wireless Headset" data-dimension48="JLab Go Wireless Headset" data-dimension25="$44" href="https://www.lenovo.com/us/en/p/accessories-and-software/audio/headsets/78318751" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:970px;"><p class="vanilla-image-block" style="padding-top:101.44%;"><img id="wDsMssSsMxn92KMPf8kVZf" name="Lenovo JLab Go Wireless Headset" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/wDsMssSsMxn92KMPf8kVZf-1920-80.png" mos="" align="middle" fullscreen="" width="970" height="984" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.lenovo.com/us/en/p/accessories-and-software/audio/headsets/78318751" target="_blank" rel="nofollow" data-dimension112="66739fd0-8559-4edf-ac24-aa9136f87cd4" data-action="Deal Block" data-label="JLab Go Wireless Headset" data-dimension48="JLab Go Wireless Headset" data-dimension25="$44">JLab Go Wireless Headset: was $49 now $44</a></strong><br>Level up your work-from-home setup with the Go Work wireless on-ear headset packed with features, including Bluetooth Multipoint for connecting to multiple devices at once, 45 hours of battery life, a quick mute function and comfy Cloud Foam earcups. And the mute function will tell you with a simple LED light whether you need to unmute in your call.<a class="view-deal button" href="https://www.lenovo.com/us/en/p/accessories-and-software/audio/headsets/78318751" target="_blank" rel="nofollow" data-dimension112="66739fd0-8559-4edf-ac24-aa9136f87cd4" data-action="Deal Block" data-label="JLab Go Wireless Headset" data-dimension48="JLab Go Wireless Headset" data-dimension25="$44">View Deal</a></p></div><div class="product"><a data-dimension112="4c8f423c-a218-447d-9335-03382ae3cd83" data-action="Deal Block" data-label="Go Wireless Split Keyboard" data-dimension48="Go Wireless Split Keyboard" data-dimension25="$71" href="https://www.lenovo.com/us/en/p/accessories-and-software/keyboards-and-mice/keyboards/4y41c33748" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1370px;"><p class="vanilla-image-block" style="padding-top:84.09%;"><img id="MubRcYFx2wnaY3d5jYG4gE" name="Lenovo Go Wireless Split Keyboard" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/MubRcYFx2wnaY3d5jYG4gE-1920-80.png" mos="" align="middle" fullscreen="" width="1370" height="1152" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.lenovo.com/us/en/p/accessories-and-software/keyboards-and-mice/keyboards/4y41c33748" target="_blank" rel="nofollow" data-dimension112="4c8f423c-a218-447d-9335-03382ae3cd83" data-action="Deal Block" data-label="Go Wireless Split Keyboard" data-dimension48="Go Wireless Split Keyboard" data-dimension25="$71">Go Wireless Split Keyboard: was $114 now $71</a></strong><br>I transitioned to a split keyboard to help with posture, sore hands and achy shoulders and I've never looked back. This one from Lenovo is currently a huge $43 off and offers relief from all of things I mentioned. Plus, the treated cork palm rest is super comfy to give your wrists the break they deserve from all that typing!<a class="view-deal button" href="https://www.lenovo.com/us/en/p/accessories-and-software/keyboards-and-mice/keyboards/4y41c33748" target="_blank" rel="nofollow" data-dimension112="4c8f423c-a218-447d-9335-03382ae3cd83" data-action="Deal Block" data-label="Go Wireless Split Keyboard" data-dimension48="Go Wireless Split Keyboard" data-dimension25="$71">View Deal</a></p></div><div class="product"><a data-dimension112="8845795f-4f2d-4f58-918a-130e9b561e82" data-action="Deal Block" data-label="Tab One" data-dimension48="Tab One" data-dimension25="$99" href="https://www.lenovo.com/us/en/p/tablets/android-tablets/lenovo-tab-series/lenovo-tab-one/zaf00008us" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1074px;"><p class="vanilla-image-block" style="padding-top:96.09%;"><img id="29CUsHu6JmbYb99z5ACCaf" name="Lenovo Tab One" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/29CUsHu6JmbYb99z5ACCaf-1920-80.png" mos="" align="middle" fullscreen="" width="1074" height="1032" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>On the hunt for a super affordable and lightweight tablet? The Lenovo Tab One is currently only $100 for the 8.7-inch model that'll fit easily into your bag or even your pocket. A HD screen, Dolby Atmos sound, up to 12.5 hours of battery and 64GB storage are just some of the awesome features on offer in this stylish tab.<a class="view-deal button" href="https://www.lenovo.com/us/en/p/tablets/android-tablets/lenovo-tab-series/lenovo-tab-one/zaf00008us" target="_blank" rel="nofollow" data-dimension112="8845795f-4f2d-4f58-918a-130e9b561e82" data-action="Deal Block" data-label="Tab One" data-dimension48="Tab One" data-dimension25="$99">View Deal</a></p></div><div class="product"><a data-dimension112="c9279ca3-42d1-4c8c-864b-2650c44b793f" data-action="Deal Block" data-label="Tab M11" data-dimension48="Tab M11" data-dimension25="$119" href="https://www.lenovo.com/us/en/p/tablets/android-tablets/lenovo-tab-series/lenovo-tab-m11-11-inch-mtk/zada0019us" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1312px;"><p class="vanilla-image-block" style="padding-top:86.13%;"><img id="kE5HBkkpuw3t2AgWnB79ef" name="Lenovo Tab M11" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/kE5HBkkpuw3t2AgWnB79ef-1920-80.png" mos="" align="middle" fullscreen="" width="1312" height="1130" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you're looking for something a little bigger that's still budget-friendly, the Lenovo Tab M11 is a 1080p 11-inch display with up to 128GB storage, 10 hours of battery life, fast-charging, and running on Android 13 OS. For easy streaming and great multitasking, it's an entry-level tablet that won't cost you too much.<a class="view-deal button" href="https://www.lenovo.com/us/en/p/tablets/android-tablets/lenovo-tab-series/lenovo-tab-m11-11-inch-mtk/zada0019us" target="_blank" rel="nofollow" data-dimension112="c9279ca3-42d1-4c8c-864b-2650c44b793f" data-action="Deal Block" data-label="Tab M11" data-dimension48="Tab M11" data-dimension25="$119">View Deal</a></p></div><div class="product"><a data-dimension112="a3f0bcb9-c078-4be9-b0e0-39979467ca64" data-action="Deal Block" data-label="15.6” FHD Portable Monitor" data-dimension48="15.6” FHD Portable Monitor" data-dimension25="$149" href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/home/66e4ucc1us" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1326px;"><p class="vanilla-image-block" style="padding-top:88.54%;"><img id="nCjVTKEmZwvukrHiBfnUef" name="Lenovo 15.6” FHD Portable Monitor" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/nCjVTKEmZwvukrHiBfnUef-1920-80.png" mos="" align="middle" fullscreen="" width="1326" height="1174" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/home/66e4ucc1us" target="_blank" rel="nofollow" data-dimension112="a3f0bcb9-c078-4be9-b0e0-39979467ca64" data-action="Deal Block" data-label="15.6” FHD Portable Monitor" data-dimension48="15.6” FHD Portable Monitor" data-dimension25="$149">15.6” FHD Portable Monitor: was $239 now $149</a></strong><br>Right now, you can secure $90 off this portable monitor that Lenovo is called "a great companion for your compatible phone or laptop." Easily connected via a USB-C cable, you get to experience your smaller screen on a 15.6-inch full HD anti-glare display that's super lightweight and super slim. And it's portable too with an adjustable foot switching it easily between portrait or landscape.<a class="view-deal button" href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/home/66e4ucc1us" target="_blank" rel="nofollow" data-dimension112="a3f0bcb9-c078-4be9-b0e0-39979467ca64" data-action="Deal Block" data-label="15.6” FHD Portable Monitor" data-dimension48="15.6” FHD Portable Monitor" data-dimension25="$149">View Deal</a></p></div><div class="product"><a data-dimension112="fd875fa2-991c-453c-b4b9-aeba89ea05d8" data-action="Deal Block" data-label="27” QHD USB-C Monitor" data-dimension48="27” QHD USB-C Monitor" data-dimension25="$220" href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/home/67c0ucc6us" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1350px;"><p class="vanilla-image-block" style="padding-top:86.07%;"><img id="H52QBFQfL3NPNFeyY5Gpcf" name="Lenovo 27” QHD USB-C Monitor" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/H52QBFQfL3NPNFeyY5Gpcf-1920-80.png" mos="" align="middle" fullscreen="" width="1350" height="1162" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/home/67c0ucc6us" target="_blank" rel="nofollow" data-dimension112="fd875fa2-991c-453c-b4b9-aeba89ea05d8" data-action="Deal Block" data-label="27” QHD USB-C Monitor" data-dimension48="27” QHD USB-C Monitor" data-dimension25="$220">27” QHD USB-C Monitor: was $294 now $220</a></strong><br>Fed up of looking at a small screen? Size up to this 27-inch Lenovo monitor with a cool $75 off for a smooth viewing experience, thanks to a 100Hz refresh rate and dual 3W speakers. Plus, it's lovely to look at too with each side sporting an ultra-thin bezel design. <a class="view-deal button" href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/home/67c0ucc6us" target="_blank" rel="nofollow" data-dimension112="fd875fa2-991c-453c-b4b9-aeba89ea05d8" data-action="Deal Block" data-label="27” QHD USB-C Monitor" data-dimension48="27” QHD USB-C Monitor" data-dimension25="$220">View Deal</a></p></div><div class="product"><a data-dimension112="2edf9058-733b-4827-9da7-41507ae02f65" data-action="Deal Block" data-label="ThinkVision 14” Portable Monitor" data-dimension48="ThinkVision 14” Portable Monitor" data-dimension25="$219" href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/office/63aauar6us" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1334px;"><p class="vanilla-image-block" style="padding-top:88.16%;"><img id="djbZ3s72UdUNa2pJkMpJdf" name="Lenovo ThinkVision 14” Portable Monitor" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/djbZ3s72UdUNa2pJkMpJdf-1920-80.png" mos="" align="middle" fullscreen="" width="1334" height="1176" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/office/63aauar6us" target="_blank" rel="nofollow" data-dimension112="2edf9058-733b-4827-9da7-41507ae02f65" data-action="Deal Block" data-label="ThinkVision 14” Portable Monitor" data-dimension48="ThinkVision 14” Portable Monitor" data-dimension25="$219">ThinkVision 14” Portable Monitor: was $327 now $219</a></strong><br>This high-spec portable monitor would usually  set you back $327, but with over $100 off, you can enjoy the wide viewing angle of this easily portable screen with 2240 x 1400 FHD resolution. It even comes with an ergonomic stand that'll make adjusting your view to any position incredibly smooth. <a class="view-deal button" href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/office/63aauar6us" target="_blank" rel="nofollow" data-dimension112="2edf9058-733b-4827-9da7-41507ae02f65" data-action="Deal Block" data-label="ThinkVision 14” Portable Monitor" data-dimension48="ThinkVision 14” Portable Monitor" data-dimension25="$219">View Deal</a></p></div><div class="product"><a data-dimension112="00a10025-f7e4-452f-bfd8-ed5c70cc177c" data-action="Deal Block" data-label="Mobile Pixels 15.6” Stackable Monitor" data-dimension48="Mobile Pixels 15.6” Stackable Monitor" data-dimension25="$254" href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/monitors_portable/78695992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1298px;"><p class="vanilla-image-block" style="padding-top:90.60%;"><img id="krUCKequ33945Vt8uhWPdf" name="Lenovo Mobile Pixels 15.6” Stackable Monitor" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/krUCKequ33945Vt8uhWPdf-1920-80.png" mos="" align="middle" fullscreen="" width="1298" height="1176" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/monitors_portable/78695992" target="_blank" rel="nofollow" data-dimension112="00a10025-f7e4-452f-bfd8-ed5c70cc177c" data-action="Deal Block" data-label="Mobile Pixels 15.6” Stackable Monitor" data-dimension48="Mobile Pixels 15.6” Stackable Monitor" data-dimension25="$254">Mobile Pixels 15.6” Stackable Monitor: was $299 now $254</a></strong><br>If you like working across two screens, but don't have the space and still want the portability, this stackable monitor is perfect for use with 15-inch and 16-inch laptops. You can either stack it, use the built-in kickstand or rotate it for three different ways to view. And it's easy to plug-and-play with two USB-C ports and one mini HDMI port.<a class="view-deal button" href="https://www.lenovo.com/us/en/p/accessories-and-software/monitors/monitors_portable/78695992" target="_blank" rel="nofollow" data-dimension112="00a10025-f7e4-452f-bfd8-ed5c70cc177c" data-action="Deal Block" data-label="Mobile Pixels 15.6” Stackable Monitor" data-dimension48="Mobile Pixels 15.6” Stackable Monitor" data-dimension25="$254">View Deal</a></p></div><div class="product"><a data-dimension112="c0f92342-81bd-47fe-a906-c8c436226dc7" data-action="Deal Block" data-label="Idea Tab Pro" data-dimension48="Idea Tab Pro" data-dimension25="$289" href="https://www.lenovo.com/us/en/p/tablets/android-tablets/idea-tab-series/lenovo-idea-tab-pro/zae40136us" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1374px;"><p class="vanilla-image-block" style="padding-top:86.75%;"><img id="JZHUVx3BWcqT4eQzW7qydf" name="Lenovo Idea Tab Pro" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/JZHUVx3BWcqT4eQzW7qydf-1920-80.png" mos="" align="middle" fullscreen="" width="1374" height="1192" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.lenovo.com/us/en/p/tablets/android-tablets/idea-tab-series/lenovo-idea-tab-pro/zae40136us" target="_blank" rel="nofollow" data-dimension112="c0f92342-81bd-47fe-a906-c8c436226dc7" data-action="Deal Block" data-label="Idea Tab Pro" data-dimension48="Idea Tab Pro" data-dimension25="$289">Idea Tab Pro: was $389 now $289</a></strong><br>Scraping in at the top end of my under $300 picks, I recommend the Tab Pro, especially at $100 off. This 12.7-inch 3K display with quad JBL speakers makes it the perfect companion for your work and play without having to carry around a laptop. Plus, you get a Lenovo Tab Pen Plus to use alongside it.<a class="view-deal button" href="https://www.lenovo.com/us/en/p/tablets/android-tablets/idea-tab-series/lenovo-idea-tab-pro/zae40136us" target="_blank" rel="nofollow" data-dimension112="c0f92342-81bd-47fe-a906-c8c436226dc7" data-action="Deal Block" data-label="Idea Tab Pro" data-dimension48="Idea Tab Pro" data-dimension25="$289">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Lock in Samsung's Galaxy Tab S11 Ultra early and get AU$350 off + free storage upgrade on Amazon ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Samsung's Galaxy Tab S11 Ultra will undoubtedly be one of the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets of 2025</a> when it arrives in Australia on September 25. With its powerful suite of Galaxy AI features, included S Pen, full Samsung DeX functionality, an epic 14.6-inch Dynamic AMOLED 2X display and an incredibly slim frame measuring just 5.1mm, this tablet is as premium as it gets.</p><p>Of course, a high-performance tablet (and laptop replacement) like this comes with an equally extravagant price, starting at AU$2,099 for the 256GB Wi-Fi model, which could put it out of reach for some buyers. </p><p>Thankfully, Amazon has some amazing preorder bonuses for the Galaxy Tab S11 Ultra, making its steep price tag a little easier to swallow.</p><p>To kick things off, Amazon is providing a free storage upgrade for those who preorder the flagship tablet. This means you can get the <a href="https://www.amazon.com.au/dp/B0FMXX17P8/?th=1">512GB model</a> at the price of the 256GB version, or the 1TB model for the cost of the 512GB variant — that's an incredible deal!</p><p>On top of this, you'll also get a massive AU$350 discount on the listing price, bringing the Galaxy Tab S11 Ultra's starting price down to just <a href="https://www.amazon.com.au/dp/B0FMXX17P8/?th=1">AU$1,749</a> — simply click on the deal below, check the 'Apply $350 coupon' box and click the 'Pre-order now' button to see the updated price.</p><div class="product star-deal"><a data-dimension112="605128ed-4e42-4349-8384-0162accebf7d" data-action="Star Deal Block" data-label="Galaxy Tab S11 Ultra (Wi-Fi / 512GB)" data-dimension48="Galaxy Tab S11 Ultra (Wi-Fi / 512GB)" data-dimension25="$1749" href="https://www.amazon.com.au/dp/B0FMXX17P8/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1288px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="gk8Z3iYKBfSCDy3ZRnQEc5" name="Galaxy Tab S11 Ultra (Wi-Fi / 512GB)" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/gk8Z3iYKBfSCDy3ZRnQEc5-1920-80.jpg" mos="" align="middle" fullscreen="" width="1288" height="1288" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><div><span class="product__star-deal-label">PREORDER BONUS</span><p><strong><a href="https://www.amazon.com.au/dp/B0FMXX17P8/" target="_blank" rel="nofollow" data-dimension112="605128ed-4e42-4349-8384-0162accebf7d" data-action="Star Deal Block" data-label="Galaxy Tab S11 Ultra (Wi-Fi / 512GB)" data-dimension48="Galaxy Tab S11 Ultra (Wi-Fi / 512GB)" data-dimension25="$1749">Galaxy Tab S11 Ultra (Wi-Fi / 512GB): was $2099 now $1749</a></strong><br>For a limited time, Amazon is offering AU$350 off the Samsung Galaxy Tab S11 Ultra, plus a free storage upgrade, meaning you’ll pay the price of the lower-capacity model and walk away with more space if you preorder. With its stunning 14.6-inch AMOLED display, S Pen support and AI-powered productivity features, the Tab S11 Ultra is built for creators, multitaskers, and media lovers alike. We suggest you don't wait around, though — this offer runs until September 25, 2025.<a class="view-deal button" href="https://www.amazon.com.au/dp/B0FMXX17P8/" target="_blank" rel="nofollow" data-dimension112="605128ed-4e42-4349-8384-0162accebf7d" data-action="Star Deal Block" data-label="Galaxy Tab S11 Ultra (Wi-Fi / 512GB)" data-dimension48="Galaxy Tab S11 Ultra (Wi-Fi / 512GB)" data-dimension25="$1749">View Deal</a></p></div></div><p>If you're thinking about getting the Galaxy Tab S11 Ultra, preordering it is a great idea because the bonus offers are amazing. Alternatively, you could go for last year's <a href="https://www.tomsguide.com/tablets/android-tablets/samsung-galaxy-tab-s10-ultra-review">Galaxy Tab S10 Ultra</a>, which is still a fantastic option and is now much more affordable, as evidenced by the deals below.</p><div data-widget-type="review" data-model-name="Samsung Galaxy Tab S10 Ultra"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/android-tablets/lock-in-samsungs-galaxy-tab-s11-ultra-early-and-get-aud350-off-free-storage-upgrade-on-amazon</link>
                                                                            <description>
                            <![CDATA[ Amazon is offering some fantastic bonuses for those who secure the Galaxy Tab S11 Ultra ahead of its September 26 release. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">VC4u5kfcGXM2YgjtUiHaML</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/2ByvVZNtDVsZo3f7QvayW8-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 09 Sep 2025 07:11:51 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                                    <dc:creator><![CDATA[ Stephen Lambrechts ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/JN3jEQpqyyt32as8AJJqXe-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Stephen Lambrechts is the Managing Editor of Tom&#039;s Guide AU and has written professionally across the categories of tech, film, television and gaming for the last 15 years. Before Tom&#039;s Guide, he spent several years as a Senior Journalist at TechRadar, had a brief stint as Editor in Chief at Official Xbox Magazine Australia, and worked at IGN. He&#039;s also written for such mags and sites as APC, TechLife Australia, T3, FilmInk, Daily Telegraph and AskMen. Additionally, he&#039;s a Tomatometer-approved critic on Rotten Tomatoes, and has offered his tech advice on radio and television.&lt;/p&gt;&lt;p&gt;He&#039;s an expert when it comes to smartphones, TVs, gaming and streaming, having contributed many reviews in each of those categories over the years. Despite his many articles on streaming, he&#039;s a passionate collector of physical media who enjoys listening to vinyl records and acquiring obscure horror movies from the &#039;60s, &#039;70s and 80s. He can usually be seen rocking the latest retro sneaker releases, particularly Air Jordans and Reebok Pumps. Occasionally, he also indulges in other non-hipster stuff, like hiking.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/2ByvVZNtDVsZo3f7QvayW8-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Tab S11 Ultra with Book Cover Keyboard attached on table with &#039;Killer Deal&#039; badge applied]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Tab S11 Ultra with Book Cover Keyboard attached on table with &#039;Killer Deal&#039; badge applied]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Tab S11 Ultra with Book Cover Keyboard attached on table with &#039;Killer Deal&#039; badge applied]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/2ByvVZNtDVsZo3f7QvayW8-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Samsung's Galaxy Tab S11 Ultra will undoubtedly be one of the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets of 2025</a> when it arrives in Australia on September 25. With its powerful suite of Galaxy AI features, included S Pen, full Samsung DeX functionality, an epic 14.6-inch Dynamic AMOLED 2X display and an incredibly slim frame measuring just 5.1mm, this tablet is as premium as it gets.</p><p>Of course, a high-performance tablet (and laptop replacement) like this comes with an equally extravagant price, starting at AU$2,099 for the 256GB Wi-Fi model, which could put it out of reach for some buyers. </p><p>Thankfully, Amazon has some amazing preorder bonuses for the Galaxy Tab S11 Ultra, making its steep price tag a little easier to swallow.</p><p>To kick things off, Amazon is providing a free storage upgrade for those who preorder the flagship tablet. This means you can get the <a href="https://www.amazon.com.au/dp/B0FMXX17P8/?th=1">512GB model</a> at the price of the 256GB version, or the 1TB model for the cost of the 512GB variant — that's an incredible deal!</p><p>On top of this, you'll also get a massive AU$350 discount on the listing price, bringing the Galaxy Tab S11 Ultra's starting price down to just <a href="https://www.amazon.com.au/dp/B0FMXX17P8/?th=1">AU$1,749</a> — simply click on the deal below, check the 'Apply $350 coupon' box and click the 'Pre-order now' button to see the updated price.</p><div class="product star-deal"><a data-dimension112="605128ed-4e42-4349-8384-0162accebf7d" data-action="Star Deal Block" data-label="Galaxy Tab S11 Ultra (Wi-Fi / 512GB)" data-dimension48="Galaxy Tab S11 Ultra (Wi-Fi / 512GB)" data-dimension25="$1749" href="https://www.amazon.com.au/dp/B0FMXX17P8/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1288px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="gk8Z3iYKBfSCDy3ZRnQEc5" name="Galaxy Tab S11 Ultra (Wi-Fi / 512GB)" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/gk8Z3iYKBfSCDy3ZRnQEc5-1920-80.jpg" mos="" align="middle" fullscreen="" width="1288" height="1288" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><div><span class="product__star-deal-label">PREORDER BONUS</span><p><strong><a href="https://www.amazon.com.au/dp/B0FMXX17P8/" target="_blank" rel="nofollow" data-dimension112="605128ed-4e42-4349-8384-0162accebf7d" data-action="Star Deal Block" data-label="Galaxy Tab S11 Ultra (Wi-Fi / 512GB)" data-dimension48="Galaxy Tab S11 Ultra (Wi-Fi / 512GB)" data-dimension25="$1749">Galaxy Tab S11 Ultra (Wi-Fi / 512GB): was $2099 now $1749</a></strong><br>For a limited time, Amazon is offering AU$350 off the Samsung Galaxy Tab S11 Ultra, plus a free storage upgrade, meaning you’ll pay the price of the lower-capacity model and walk away with more space if you preorder. With its stunning 14.6-inch AMOLED display, S Pen support and AI-powered productivity features, the Tab S11 Ultra is built for creators, multitaskers, and media lovers alike. We suggest you don't wait around, though — this offer runs until September 25, 2025.<a class="view-deal button" href="https://www.amazon.com.au/dp/B0FMXX17P8/" target="_blank" rel="nofollow" data-dimension112="605128ed-4e42-4349-8384-0162accebf7d" data-action="Star Deal Block" data-label="Galaxy Tab S11 Ultra (Wi-Fi / 512GB)" data-dimension48="Galaxy Tab S11 Ultra (Wi-Fi / 512GB)" data-dimension25="$1749">View Deal</a></p></div></div><p>If you're thinking about getting the Galaxy Tab S11 Ultra, preordering it is a great idea because the bonus offers are amazing. Alternatively, you could go for last year's <a href="https://www.tomsguide.com/tablets/android-tablets/samsung-galaxy-tab-s10-ultra-review">Galaxy Tab S10 Ultra</a>, which is still a fantastic option and is now much more affordable, as evidenced by the deals below.</p><div data-widget-type="review" data-model-name="Samsung Galaxy Tab S10 Ultra"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I went hands-on with the Samsung Galaxy Tab S11 — and I'm already dreaming about all the work I could do on it ]]></title>
                                                                                                <dc:content><![CDATA[ <p>There are two new challengers for a spot on our <a href="https://www.tomsguide.com/best-picks/best-android-tablets">best Android tablets</a> list, as Samsung has launched the Galaxy Tab S11 and Galaxy Tab S11 Ultra. Unveiled as part of Samsung's IFA announcements, these two premium tablets are equipped with a number of upgrades that have got me excited to try them again, with all the apps I need for work, so I can see how close they come to replacing my laptop.</p><p>The Galaxy Tab S11 (from $799 / £799 / AU$1,399) measures 11 inches, while the Ultra remains a massive 14.6 inches. But while its display is expansive, the Tab S11 Ultra (starting at $1,199 / £1,199 / AU$2,099) is the slimmest Galaxy Tab that Samsung's yet produced, measuring 5.1mm (0.2 inches) thick. It's lighter than the last generation too, at 692 grams (24.4 ounces).</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="tu3F7zNk4FZbAQPmYPJg8b" name="PXL_20250828_111739863" alt="Samsung Galaxy Tab S11 Ultra back" src="https://cdn.mos.cms.futurecdn.net/tu3F7zNk4FZbAQPmYPJg8b-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The 469g (16.5 ounces), 11-inch model may not be a record-breaker like the Ultra is, but it's still a welcome sight, as Samsung only produced the Galaxy Tab S10 series in Plus and Ultra variants. Given that the rival iPad Pro offers both 11-inch and 13-inch versions, and the <a href="https://www.tomsguide.com/computing/android-tablets/oneplus-pad-3">OnePlus Pad 3</a>, our current best Android tablet, doesn't have a small version, Samsung is smart to corner this niche.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Galaxy Tab S11</strong>    </p></td><td  ><p><strong>Galaxy Tab S11 Ultra</strong>    </p></td></tr><tr><td class="firstcol " ><p><strong>Starting price</strong>    </p></td><td  ><p>$799 / £799 / AU$1,399</p></td><td  ><p>$1,199 / £1,199 / AU$2,099</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong>    </p></td><td  ><p>11-inch Dynamic AMOLED 2X (2,560 x 1,600)    </p></td><td  ><p>14.6-inch Dynamic AMOLED 2X with anti-reflection layer (2,960 x 1,848)    </p></td></tr><tr><td class="firstcol " ><p><strong>Refresh rate</strong>    </p></td><td  ><p>120Hz adaptive    </p></td><td  ><p>120Hz adaptive    </p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong>    </p></td><td  ><p>MediaTek Dimensity 9400+</p></td><td  ><p>MediaTek Dimensity 9400+</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong>    </p></td><td  ><p>12GB    </p></td><td  ><p>12GB, 16GB (with 1TB storage)    </p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong>    </p></td><td  ><p>128GB, 256GB, 512GB / Expandable up to 2TB    </p></td><td  ><p>256GB, 512GB, 1TB / Expandable up to 2TB    </p></td></tr><tr><td class="firstcol " ><p><strong>Cameras</strong>    </p></td><td  ><p>13MP rear, 12MP front    </p></td><td  ><p>13MP main and 8MP ultrawide rear, 12MP front    </p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong>    </p></td><td  ><p>8,400 mAh    </p></td><td  ><p>11,600 mAh    </p></td></tr><tr><td class="firstcol " ><p><strong>Charging</strong>    </p></td><td  ><p>45W wired    </p></td><td  ><p>45W wired    </p></td></tr><tr><td class="firstcol " ><p><strong>Operating system</strong>    </p></td><td  ><p>Android 16 with One UI 8    </p></td><td  ><p>Android 16 with One UI 8    </p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong>    </p></td><td  ><p>9.99 x 6.51 x 0.22 inches    </p></td><td  ><p>12.85 x 8.21 x 0.20 inches    </p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong>    </p></td><td  ><p>469g / 1.06 pounds    </p></td><td  ><p>692 grams / 1.52 pounds    </p></td></tr><tr><td class="firstcol " ><p><strong>Dust/water resistance</strong>    </p></td><td  ><p>IP68    </p></td><td  ><p>IP68    </p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong>    </p></td><td  ><p>Gray, Silver    </p></td><td  ><p>Gray, Silver    </p></td></tr></tbody></table></div><p>Samsung promises up to 1,600 nits of brightness from these tablets' AMOLED 2X displays, which should keep Samsung's slates at the top of the tablet brightness charts. And there's a little more display space to appreciate that brightness on the Ultra, as it now has a new, smaller notch design (albeit with one fewer camera).</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rWyGRekSU3YaTcWzcQe9ya" name="PXL_20250828_111802798" alt="Samsung Galaxy Tab S11 Ultra notch" src="https://cdn.mos.cms.futurecdn.net/rWyGRekSU3YaTcWzcQe9ya-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>To accompany these tablets, Samsung has a redesigned S Pen, with a hexagonal barrel and a solid cone tip. It's a big change from previous, soft-tipped S Pens, and there's no longer a magnetic strip on the back to store it on either. But for users familiar with the Apple Pencil on the <a href="https://www.tomsguide.com/best-picks/best-ipad">best iPads</a>, this should feel quite comfortable.</p><p>For multitaskers, Samsung has made some upgrades to the Tab S11's DeX desktop mode. With a monitor attached, you can now expand your workspace, rather than just mirror it, with Extended mode. And if you want even more space, DeX now supports up to four workspaces to arrange your apps across.</p><p>Samsung's Galaxy AI features benefit from the tablet's large screen. Like the Galaxy Z Fold 7, Google Gemini can now be used in a movable overlay, allowing you to place the output from your ever-ready chatbot where you need it as you switch between apps. And features like Drawing Assist are definitely at their best when used with a stylus on a large canvas.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Gpyj2JSgYLJHz9333tkMEb" name="PXL_20250828_111835008.MP" alt="Samsung Galaxy Tab S11 Ultra side" src="https://cdn.mos.cms.futurecdn.net/Gpyj2JSgYLJHz9333tkMEb-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>More traditional productivity apps, like Notion, Goodnotes, LumaFusion and Clip Studio Paint, come pre-installed on the Tab S11 series, and with bonuses like templates or free trials as a deal-sweetener. Samsung's clearly still keen on users trying to use their tablets more like laptops, in case the upgrades to DeX didn't make that clear.</p><p>Driving the Tab S11 is a MediaTek Dimensity 9400+ chipset, the first 3nm chip Samsung has used on a tablet. The result of this new chip is apparently performance increases of 24% for the CPU, 27% for the GPU and 33% for the NPU over the Tab S10.</p><p>Users can opt for 128GB, 256GB or 512GB of storage for the Galaxy Tab S11, and pick from 256GB, 512GB and 1TB in the case of the Tab S11 Ultra. By default, the tablets are Wi-Fi only, but 5G can be optionally added to any model for a little extra cash.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="iWBHTgsrPbipQ8kxWitP8b" name="PXL_20250828_111649247" alt="Samsung Galaxy Tab S11 display" src="https://cdn.mos.cms.futurecdn.net/iWBHTgsrPbipQ8kxWitP8b-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/tablets/remarkable-paper-pro-move-review-e-paper-in-your-pocket">ReMarkable Paper Pro Move review: E-paper in your pocket</a></li><li><a href="https://www.tomsguide.com/phones/iphones/the-iphone-17-pro-sounds-like-it-will-be-the-iphone-to-get-this-year-heres-why">The iPhone 17 Pro sounds like it will be the iPhone to get this year — here’s why</a></li><li><a href="https://www.tomsguide.com/news/live/apple-iphone-17-launch-event-live">iPhone 17 event countdown live — last-minute rumors, specs, release date, prices and more</a></li></ul><div data-model-name="Samsung Galaxy Tab S10 Plus" data-widget-type="review"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/android-tablets/samsung-galaxy-tab-s11-review</link>
                                                                            <description>
                            <![CDATA[ I'm surprised by how much has changed with Samsung's Galaxy Tab S11 and Tab S11 Ultra tablets, with upgrades to its desktop mode and S Pen showing an even greater focus on productivity. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">hGkzs763uKGmR6NgmeaTXh</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/8nwmjCVXisGCiqm68Bmn6b-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 04 Sep 2025 09:30:00 +0000</pubDate>                                                                                                                                <updated>Thu, 04 Jun 2026 12:51:37 +0000</updated>
                                                                                                                                            <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></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-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Richard is a writer based in London, covering 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&amp;#39;s features with similar devices&amp;#39;, and figure out if something&amp;#39;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&amp;#39;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&amp;#39;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&amp;#39;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/8nwmjCVXisGCiqm68Bmn6b-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Tab S11 display]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Tab S11 display]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Tab S11 display]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/8nwmjCVXisGCiqm68Bmn6b-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>There are two new challengers for a spot on our <a href="https://www.tomsguide.com/best-picks/best-android-tablets">best Android tablets</a> list, as Samsung has launched the Galaxy Tab S11 and Galaxy Tab S11 Ultra. Unveiled as part of Samsung's IFA announcements, these two premium tablets are equipped with a number of upgrades that have got me excited to try them again, with all the apps I need for work, so I can see how close they come to replacing my laptop.</p><p>The Galaxy Tab S11 (from $799 / £799 / AU$1,399) measures 11 inches, while the Ultra remains a massive 14.6 inches. But while its display is expansive, the Tab S11 Ultra (starting at $1,199 / £1,199 / AU$2,099) is the slimmest Galaxy Tab that Samsung's yet produced, measuring 5.1mm (0.2 inches) thick. It's lighter than the last generation too, at 692 grams (24.4 ounces).</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="tu3F7zNk4FZbAQPmYPJg8b" name="PXL_20250828_111739863" alt="Samsung Galaxy Tab S11 Ultra back" src="https://cdn.mos.cms.futurecdn.net/tu3F7zNk4FZbAQPmYPJg8b-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The 469g (16.5 ounces), 11-inch model may not be a record-breaker like the Ultra is, but it's still a welcome sight, as Samsung only produced the Galaxy Tab S10 series in Plus and Ultra variants. Given that the rival iPad Pro offers both 11-inch and 13-inch versions, and the <a href="https://www.tomsguide.com/computing/android-tablets/oneplus-pad-3">OnePlus Pad 3</a>, our current best Android tablet, doesn't have a small version, Samsung is smart to corner this niche.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Galaxy Tab S11</strong>    </p></td><td  ><p><strong>Galaxy Tab S11 Ultra</strong>    </p></td></tr><tr><td class="firstcol " ><p><strong>Starting price</strong>    </p></td><td  ><p>$799 / £799 / AU$1,399</p></td><td  ><p>$1,199 / £1,199 / AU$2,099</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong>    </p></td><td  ><p>11-inch Dynamic AMOLED 2X (2,560 x 1,600)    </p></td><td  ><p>14.6-inch Dynamic AMOLED 2X with anti-reflection layer (2,960 x 1,848)    </p></td></tr><tr><td class="firstcol " ><p><strong>Refresh rate</strong>    </p></td><td  ><p>120Hz adaptive    </p></td><td  ><p>120Hz adaptive    </p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong>    </p></td><td  ><p>MediaTek Dimensity 9400+</p></td><td  ><p>MediaTek Dimensity 9400+</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong>    </p></td><td  ><p>12GB    </p></td><td  ><p>12GB, 16GB (with 1TB storage)    </p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong>    </p></td><td  ><p>128GB, 256GB, 512GB / Expandable up to 2TB    </p></td><td  ><p>256GB, 512GB, 1TB / Expandable up to 2TB    </p></td></tr><tr><td class="firstcol " ><p><strong>Cameras</strong>    </p></td><td  ><p>13MP rear, 12MP front    </p></td><td  ><p>13MP main and 8MP ultrawide rear, 12MP front    </p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong>    </p></td><td  ><p>8,400 mAh    </p></td><td  ><p>11,600 mAh    </p></td></tr><tr><td class="firstcol " ><p><strong>Charging</strong>    </p></td><td  ><p>45W wired    </p></td><td  ><p>45W wired    </p></td></tr><tr><td class="firstcol " ><p><strong>Operating system</strong>    </p></td><td  ><p>Android 16 with One UI 8    </p></td><td  ><p>Android 16 with One UI 8    </p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong>    </p></td><td  ><p>9.99 x 6.51 x 0.22 inches    </p></td><td  ><p>12.85 x 8.21 x 0.20 inches    </p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong>    </p></td><td  ><p>469g / 1.06 pounds    </p></td><td  ><p>692 grams / 1.52 pounds    </p></td></tr><tr><td class="firstcol " ><p><strong>Dust/water resistance</strong>    </p></td><td  ><p>IP68    </p></td><td  ><p>IP68    </p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong>    </p></td><td  ><p>Gray, Silver    </p></td><td  ><p>Gray, Silver    </p></td></tr></tbody></table></div><p>Samsung promises up to 1,600 nits of brightness from these tablets' AMOLED 2X displays, which should keep Samsung's slates at the top of the tablet brightness charts. And there's a little more display space to appreciate that brightness on the Ultra, as it now has a new, smaller notch design (albeit with one fewer camera).</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rWyGRekSU3YaTcWzcQe9ya" name="PXL_20250828_111802798" alt="Samsung Galaxy Tab S11 Ultra notch" src="https://cdn.mos.cms.futurecdn.net/rWyGRekSU3YaTcWzcQe9ya-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>To accompany these tablets, Samsung has a redesigned S Pen, with a hexagonal barrel and a solid cone tip. It's a big change from previous, soft-tipped S Pens, and there's no longer a magnetic strip on the back to store it on either. But for users familiar with the Apple Pencil on the <a href="https://www.tomsguide.com/best-picks/best-ipad">best iPads</a>, this should feel quite comfortable.</p><p>For multitaskers, Samsung has made some upgrades to the Tab S11's DeX desktop mode. With a monitor attached, you can now expand your workspace, rather than just mirror it, with Extended mode. And if you want even more space, DeX now supports up to four workspaces to arrange your apps across.</p><p>Samsung's Galaxy AI features benefit from the tablet's large screen. Like the Galaxy Z Fold 7, Google Gemini can now be used in a movable overlay, allowing you to place the output from your ever-ready chatbot where you need it as you switch between apps. And features like Drawing Assist are definitely at their best when used with a stylus on a large canvas.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Gpyj2JSgYLJHz9333tkMEb" name="PXL_20250828_111835008.MP" alt="Samsung Galaxy Tab S11 Ultra side" src="https://cdn.mos.cms.futurecdn.net/Gpyj2JSgYLJHz9333tkMEb-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>More traditional productivity apps, like Notion, Goodnotes, LumaFusion and Clip Studio Paint, come pre-installed on the Tab S11 series, and with bonuses like templates or free trials as a deal-sweetener. Samsung's clearly still keen on users trying to use their tablets more like laptops, in case the upgrades to DeX didn't make that clear.</p><p>Driving the Tab S11 is a MediaTek Dimensity 9400+ chipset, the first 3nm chip Samsung has used on a tablet. The result of this new chip is apparently performance increases of 24% for the CPU, 27% for the GPU and 33% for the NPU over the Tab S10.</p><p>Users can opt for 128GB, 256GB or 512GB of storage for the Galaxy Tab S11, and pick from 256GB, 512GB and 1TB in the case of the Tab S11 Ultra. By default, the tablets are Wi-Fi only, but 5G can be optionally added to any model for a little extra cash.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="iWBHTgsrPbipQ8kxWitP8b" name="PXL_20250828_111649247" alt="Samsung Galaxy Tab S11 display" src="https://cdn.mos.cms.futurecdn.net/iWBHTgsrPbipQ8kxWitP8b-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/tablets/remarkable-paper-pro-move-review-e-paper-in-your-pocket">ReMarkable Paper Pro Move review: E-paper in your pocket</a></li><li><a href="https://www.tomsguide.com/phones/iphones/the-iphone-17-pro-sounds-like-it-will-be-the-iphone-to-get-this-year-heres-why">The iPhone 17 Pro sounds like it will be the iPhone to get this year — here’s why</a></li><li><a href="https://www.tomsguide.com/news/live/apple-iphone-17-launch-event-live">iPhone 17 event countdown live — last-minute rumors, specs, release date, prices and more</a></li></ul><div data-model-name="Samsung Galaxy Tab S10 Plus" data-widget-type="review"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Hurry! Best Buy sale has Samsung tablets from just $159 ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The first <a href="https://www.tomsguide.com/sales-events/best-labor-day-sales-right-now-2025">Labor Day sales</a> of 2025 are slowly starting to appear. If you're in need of a new Android tablet, Best Buy has a sale you can't miss. </p><p>For a limited time, <a href="https://www.bestbuy.com/site/promo/save-assorted-samsung-galaxy-tablets" target="_blank" rel="nofollow">Best Buy has Samsung tablets on sale from $159</a>. It's one of the biggest Samsung tablet sales I've seen with discounts on some of the <a href="https://www.tomsguide.com/best-picks/best-samsung-tablets">best Samsung tablets</a> we've tested. Below I've picked out some of my top deals in Best Buy's sale. </p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><strong></strong><a href="https://www.bestbuy.com/site/promo/save-assorted-samsung-galaxy-tablets" target="_blank" rel="nofollow"><strong>shop all Samsung tablets on sale from $159</strong></a><strong></strong></li><li><strong>Galaxy Tab A9+: </strong><a href="https://www.bestbuy.com/site/samsung-galaxy-tab-a9-11-64gb-wi-fi-silver/6566193.p?skuId=6566193" target="_blank" rel="nofollow"><strong>was $219 now $159</strong></a></li><li><strong>Galaxy Tab S9: </strong><a href="https://www.bestbuy.com/site/samsung-galaxy-tab-s9-11-128gb-wi-fi-with-s-pen-graphite/6546661.p?skuId=6546661" target="_blank" rel="nofollow"><strong>was $799 now $599</strong></a><strong></strong></li><li><strong>Galaxy Tab S10+: </strong><a href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-12-4-256gb-wi-fi-with-s-pen-moonstone-gray/6593196.p?skuId=6593196" target="_blank" rel="nofollow"><strong>was $999 now $879</strong></a><strong></strong></li><li><strong>Galaxy Tab S10 Ultra: </strong><a href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-ultra-14-6-512gb-wi-fi-with-s-pen-moonstone-gray/6593198.p?skuId=6593198" target="_blank" rel="nofollow"><strong>was $1,319 now $969</strong></a><strong></strong></li></ul><h3 class="article-body__section" id="section-best-samsung-tablet-deals"><span>Best Samsung tablet deals</span></h3><div class="product"><a data-dimension112="30d04ae6-2b1f-41c2-9d2a-8a67f210ea96" data-action="Deal Block" data-label="Galaxy Tab A9+" data-dimension48="Galaxy Tab A9+" data-dimension25="$159" href="https://www.bestbuy.com/site/samsung-galaxy-tab-a9-11-64gb-wi-fi-silver/6566193.p?skuId=6566193" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2094px;"><p class="vanilla-image-block" style="padding-top:60.65%;"><img id="3mdmia3kU3uFNStE7MJYkV" name="Screenshot 2024-11-11 at 10.41.30.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/3mdmia3kU3uFNStE7MJYkV-1920-80.png" mos="" align="middle" fullscreen="" width="2094" height="1270" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.bestbuy.com/site/samsung-galaxy-tab-a9-11-64gb-wi-fi-silver/6566193.p?skuId=6566193" target="_blank" rel="nofollow" data-dimension112="30d04ae6-2b1f-41c2-9d2a-8a67f210ea96" data-action="Deal Block" data-label="Galaxy Tab A9+" data-dimension48="Galaxy Tab A9+" data-dimension25="$159">Galaxy Tab A9+: was $219 now $159</a></strong><br>An entry-level Android tablet, the Samsung Galaxy A9+ features an 11-inch display with a 90Hz refresh rate, a long-lasting 7,040mAh battery and a snappy Qualcomm Snapdragon 695 chip. You also get 5MP front and 8MP back cameras.<a class="view-deal button" href="https://www.bestbuy.com/site/samsung-galaxy-tab-a9-11-64gb-wi-fi-silver/6566193.p?skuId=6566193" target="_blank" rel="nofollow" data-dimension112="30d04ae6-2b1f-41c2-9d2a-8a67f210ea96" data-action="Deal Block" data-label="Galaxy Tab A9+" data-dimension48="Galaxy Tab A9+" data-dimension25="$159">View Deal</a></p></div><div class="product"><a data-dimension112="ec2290ba-6d10-4c0d-aa09-f6ee146599fe" data-action="Deal Block" data-label="Galaxy Tab S10 FE+" data-dimension48="Galaxy Tab S10 FE+" data-dimension25="$599" href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-fe-13-1-128gb-wi-fi-with-s-pen-silver/6618950.p?skuId=6618950" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1080px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="6MtzjCmXKf5yE6GBQhiVZK" name="Samsung Galaxy Tab S10 FE deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6MtzjCmXKf5yE6GBQhiVZK-1920-80.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>It's only recently released, but the fantastic <a href="https://www.tomsguide.com/computing/android-tablets/samsung-galaxy-tab-s10-fe-plus-review" data-dimension112="ec2290ba-6d10-4c0d-aa09-f6ee146599fe" data-action="Deal Block" data-label="Galaxy Tab S10 FE+" data-dimension48="Galaxy Tab S10 FE+" data-dimension25="$599">Samsung Galaxy Tab S10 FE+</a> is already $50 off! Not a bad price for a mid-range tablet that comes with an S Pen stylus, a splendid (and larger) 13.1-inch LCD panel, and a 15-hour battery life. This is great value for money! <a class="view-deal button" href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-fe-13-1-128gb-wi-fi-with-s-pen-silver/6618950.p?skuId=6618950" target="_blank" rel="nofollow" data-dimension112="ec2290ba-6d10-4c0d-aa09-f6ee146599fe" data-action="Deal Block" data-label="Galaxy Tab S10 FE+" data-dimension48="Galaxy Tab S10 FE+" data-dimension25="$599">View Deal</a></p></div><div class="product"><a data-dimension112="1400f4af-1bbb-4f9a-ad73-2554ddee164d" data-action="Deal Block" data-label="Galaxy Tab S9" data-dimension48="Galaxy Tab S9" data-dimension25="$599" href="https://www.bestbuy.com/site/samsung-galaxy-tab-s9-11-128gb-wi-fi-with-s-pen-graphite/6546661.p?skuId=6546661" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:70.73%;"><img id="Cy6LrM7S3kScgNEofmJiwk" name="Samsung Galaxy Tab S9 deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Cy6LrM7S3kScgNEofmJiwk-1920-80.jpg" mos="" align="middle" fullscreen="" width="1500" height="1061" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Galaxy Tab S9 is great for watching movies and playing games. It features an 11-inch 2560 x 1600 AMOLED display, Snapdragon 8 Gen 2 chipset, 8GB of RAM, and a 128GB SSD. We also like that you can expand its storage capacity via its microSD/microSDXC card slots. <a class="view-deal button" href="https://www.bestbuy.com/site/samsung-galaxy-tab-s9-11-128gb-wi-fi-with-s-pen-graphite/6546661.p?skuId=6546661" target="_blank" rel="nofollow" data-dimension112="1400f4af-1bbb-4f9a-ad73-2554ddee164d" data-action="Deal Block" data-label="Galaxy Tab S9" data-dimension48="Galaxy Tab S9" data-dimension25="$599">View Deal</a></p></div><div class="product"><a data-dimension112="621641aa-14ff-415a-bce2-368e05077c97" data-action="Deal Block" data-label="Galaxy Tab S10+" data-dimension48="Galaxy Tab S10+" data-dimension25="$879" href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-12-4-256gb-wi-fi-with-s-pen-moonstone-gray/6593196.p?skuId=6593196" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1277px;"><p class="vanilla-image-block" style="padding-top:65.54%;"><img id="QBrEqozQwVWAZPZyeKgW4X" name="Samsung Galaxy Tab S10 Plus deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/QBrEqozQwVWAZPZyeKgW4X-1920-80.jpg" mos="" align="middle" fullscreen="" width="1277" height="837" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Samsung Galaxy Tab S10+ is the middle child in Samsung's Galaxy Tab series. It features a 12.4-inch AMOLED 2800 x 1752 display, MediaTek MT6989 CPU, 12GB of RAM, and a 256GB SSD. It includes Samsung's S-Pen, which you can use to jot down notes or sketch. <a class="view-deal button" href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-12-4-256gb-wi-fi-with-s-pen-moonstone-gray/6593196.p?skuId=6593196" target="_blank" rel="nofollow" data-dimension112="621641aa-14ff-415a-bce2-368e05077c97" data-action="Deal Block" data-label="Galaxy Tab S10+" data-dimension48="Galaxy Tab S10+" data-dimension25="$879">View Deal</a></p></div><div class="product"><a data-dimension112="58b5c0ca-6b36-4366-9797-9f4e7660ddbf" data-action="Deal Block" data-label="Galaxy Tab S10 Ultra" data-dimension48="Galaxy Tab S10 Ultra" data-dimension25="$969" href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-ultra-14-6-512gb-wi-fi-with-s-pen-moonstone-gray/6593198.p?skuId=6593198" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="veL9bNCBbWD2yAU6jQxDia" name="Samsung Galaxy Tab S10 Ultra Deal Block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/veL9bNCBbWD2yAU6jQxDia-1920-80.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-ultra-14-6-512gb-wi-fi-with-s-pen-moonstone-gray/6593198.p?skuId=6593198" target="_blank" rel="nofollow" data-dimension112="58b5c0ca-6b36-4366-9797-9f4e7660ddbf" data-action="Deal Block" data-label="Galaxy Tab S10 Ultra" data-dimension48="Galaxy Tab S10 Ultra" data-dimension25="$969">Galaxy Tab S10 Ultra: was $1319 now $969</a></strong><br>Released in late 2024, the Tab S10 Ultra is as premium as Android tablets get, boasting a massive 14.6-inch Dynamic AMOLED display which has to be seen to be believed. It also features a MediaTek MT6989 chipset, 12GB of RAM, and 512GB SSD.<a class="view-deal button" href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-ultra-14-6-512gb-wi-fi-with-s-pen-moonstone-gray/6593198.p?skuId=6593198" target="_blank" rel="nofollow" data-dimension112="58b5c0ca-6b36-4366-9797-9f4e7660ddbf" data-action="Deal Block" data-label="Galaxy Tab S10 Ultra" data-dimension48="Galaxy Tab S10 Ultra" data-dimension25="$969">View Deal</a></p></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/android-tablets/hurry-best-buy-sale-has-samsung-tablets-from-just-usd159</link>
                                                                            <description>
                            <![CDATA[ The latest Best Buy sale has Samsung tablets on sale from $159. Here are the best deals I recommend for your back to school shopping. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">qoatna5aNz834xEArdGyq3</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/yjQswRCanmAzGPcPmKGrTR-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 15 Aug 2025 21:31:02 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                <author><![CDATA[ louis.ramirez@futurenet.com (Louis Ramirez) ]]></author>                    <dc:creator><![CDATA[ Louis Ramirez ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oYF2xVwCb4pTGhAJi8Yqr5-320-70.jpeg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;As deals editor-in-chief at Tom’s Guide, Louis refuses to pay full price for anything. He has over 10 years of experience finding the best deals and coupons to bring readers. Louis price checks against multiple retailers and searches high and low for sales on 4K TVs, Apple devices, streaming services, mattresses, kitchen appliances, and more. He&#039;s also always looking for the the best coupon codes to turn good deals into stellar buys.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;He has covered major retail events like Amazon Prime Day, Black Friday, and Cyber Monday for more than a decade and knows how to spot an epic deal from a fake discount. He&#039;s also great at helping people negotiate better prices on everything from gym memberships to their home internet service. Louis&#039; work has also helped readers find PS5 restock, baby formula, Clorox wipes, and everything in between. For his next major purchase, Louis is hoping to find a killer deal on an M3-based Mac. &lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;A born-and-bred New Yorker, Louis is always in search of the perfect cup of coffee. On his free time, he enjoys swimming, running, and any workout that pushes his Apple Watch to the max. He&#039;s also a big fan of international films, horror movies, and K-dramas. His work has appeared on Gizmodo, CNET, Digital Trends, Dealnews, and Time Out New York.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/yjQswRCanmAzGPcPmKGrTR-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Galaxy Tablet S10+]]></media:description>                                                            <media:text><![CDATA[Galaxy Tablet S10+]]></media:text>
                                <media:title type="plain"><![CDATA[Galaxy Tablet S10+]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/yjQswRCanmAzGPcPmKGrTR-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The first <a href="https://www.tomsguide.com/sales-events/best-labor-day-sales-right-now-2025">Labor Day sales</a> of 2025 are slowly starting to appear. If you're in need of a new Android tablet, Best Buy has a sale you can't miss. </p><p>For a limited time, <a href="https://www.bestbuy.com/site/promo/save-assorted-samsung-galaxy-tablets" target="_blank" rel="nofollow">Best Buy has Samsung tablets on sale from $159</a>. It's one of the biggest Samsung tablet sales I've seen with discounts on some of the <a href="https://www.tomsguide.com/best-picks/best-samsung-tablets">best Samsung tablets</a> we've tested. Below I've picked out some of my top deals in Best Buy's sale. </p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><strong></strong><a href="https://www.bestbuy.com/site/promo/save-assorted-samsung-galaxy-tablets" target="_blank" rel="nofollow"><strong>shop all Samsung tablets on sale from $159</strong></a><strong></strong></li><li><strong>Galaxy Tab A9+: </strong><a href="https://www.bestbuy.com/site/samsung-galaxy-tab-a9-11-64gb-wi-fi-silver/6566193.p?skuId=6566193" target="_blank" rel="nofollow"><strong>was $219 now $159</strong></a></li><li><strong>Galaxy Tab S9: </strong><a href="https://www.bestbuy.com/site/samsung-galaxy-tab-s9-11-128gb-wi-fi-with-s-pen-graphite/6546661.p?skuId=6546661" target="_blank" rel="nofollow"><strong>was $799 now $599</strong></a><strong></strong></li><li><strong>Galaxy Tab S10+: </strong><a href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-12-4-256gb-wi-fi-with-s-pen-moonstone-gray/6593196.p?skuId=6593196" target="_blank" rel="nofollow"><strong>was $999 now $879</strong></a><strong></strong></li><li><strong>Galaxy Tab S10 Ultra: </strong><a href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-ultra-14-6-512gb-wi-fi-with-s-pen-moonstone-gray/6593198.p?skuId=6593198" target="_blank" rel="nofollow"><strong>was $1,319 now $969</strong></a><strong></strong></li></ul><h3 class="article-body__section" id="section-best-samsung-tablet-deals"><span>Best Samsung tablet deals</span></h3><div class="product"><a data-dimension112="30d04ae6-2b1f-41c2-9d2a-8a67f210ea96" data-action="Deal Block" data-label="Galaxy Tab A9+" data-dimension48="Galaxy Tab A9+" data-dimension25="$159" href="https://www.bestbuy.com/site/samsung-galaxy-tab-a9-11-64gb-wi-fi-silver/6566193.p?skuId=6566193" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2094px;"><p class="vanilla-image-block" style="padding-top:60.65%;"><img id="3mdmia3kU3uFNStE7MJYkV" name="Screenshot 2024-11-11 at 10.41.30.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/3mdmia3kU3uFNStE7MJYkV-1920-80.png" mos="" align="middle" fullscreen="" width="2094" height="1270" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.bestbuy.com/site/samsung-galaxy-tab-a9-11-64gb-wi-fi-silver/6566193.p?skuId=6566193" target="_blank" rel="nofollow" data-dimension112="30d04ae6-2b1f-41c2-9d2a-8a67f210ea96" data-action="Deal Block" data-label="Galaxy Tab A9+" data-dimension48="Galaxy Tab A9+" data-dimension25="$159">Galaxy Tab A9+: was $219 now $159</a></strong><br>An entry-level Android tablet, the Samsung Galaxy A9+ features an 11-inch display with a 90Hz refresh rate, a long-lasting 7,040mAh battery and a snappy Qualcomm Snapdragon 695 chip. You also get 5MP front and 8MP back cameras.<a class="view-deal button" href="https://www.bestbuy.com/site/samsung-galaxy-tab-a9-11-64gb-wi-fi-silver/6566193.p?skuId=6566193" target="_blank" rel="nofollow" data-dimension112="30d04ae6-2b1f-41c2-9d2a-8a67f210ea96" data-action="Deal Block" data-label="Galaxy Tab A9+" data-dimension48="Galaxy Tab A9+" data-dimension25="$159">View Deal</a></p></div><div class="product"><a data-dimension112="ec2290ba-6d10-4c0d-aa09-f6ee146599fe" data-action="Deal Block" data-label="Galaxy Tab S10 FE+" data-dimension48="Galaxy Tab S10 FE+" data-dimension25="$599" href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-fe-13-1-128gb-wi-fi-with-s-pen-silver/6618950.p?skuId=6618950" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1080px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="6MtzjCmXKf5yE6GBQhiVZK" name="Samsung Galaxy Tab S10 FE deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6MtzjCmXKf5yE6GBQhiVZK-1920-80.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>It's only recently released, but the fantastic <a href="https://www.tomsguide.com/computing/android-tablets/samsung-galaxy-tab-s10-fe-plus-review" data-dimension112="ec2290ba-6d10-4c0d-aa09-f6ee146599fe" data-action="Deal Block" data-label="Galaxy Tab S10 FE+" data-dimension48="Galaxy Tab S10 FE+" data-dimension25="$599">Samsung Galaxy Tab S10 FE+</a> is already $50 off! Not a bad price for a mid-range tablet that comes with an S Pen stylus, a splendid (and larger) 13.1-inch LCD panel, and a 15-hour battery life. This is great value for money! <a class="view-deal button" href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-fe-13-1-128gb-wi-fi-with-s-pen-silver/6618950.p?skuId=6618950" target="_blank" rel="nofollow" data-dimension112="ec2290ba-6d10-4c0d-aa09-f6ee146599fe" data-action="Deal Block" data-label="Galaxy Tab S10 FE+" data-dimension48="Galaxy Tab S10 FE+" data-dimension25="$599">View Deal</a></p></div><div class="product"><a data-dimension112="1400f4af-1bbb-4f9a-ad73-2554ddee164d" data-action="Deal Block" data-label="Galaxy Tab S9" data-dimension48="Galaxy Tab S9" data-dimension25="$599" href="https://www.bestbuy.com/site/samsung-galaxy-tab-s9-11-128gb-wi-fi-with-s-pen-graphite/6546661.p?skuId=6546661" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:70.73%;"><img id="Cy6LrM7S3kScgNEofmJiwk" name="Samsung Galaxy Tab S9 deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Cy6LrM7S3kScgNEofmJiwk-1920-80.jpg" mos="" align="middle" fullscreen="" width="1500" height="1061" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Galaxy Tab S9 is great for watching movies and playing games. It features an 11-inch 2560 x 1600 AMOLED display, Snapdragon 8 Gen 2 chipset, 8GB of RAM, and a 128GB SSD. We also like that you can expand its storage capacity via its microSD/microSDXC card slots. <a class="view-deal button" href="https://www.bestbuy.com/site/samsung-galaxy-tab-s9-11-128gb-wi-fi-with-s-pen-graphite/6546661.p?skuId=6546661" target="_blank" rel="nofollow" data-dimension112="1400f4af-1bbb-4f9a-ad73-2554ddee164d" data-action="Deal Block" data-label="Galaxy Tab S9" data-dimension48="Galaxy Tab S9" data-dimension25="$599">View Deal</a></p></div><div class="product"><a data-dimension112="621641aa-14ff-415a-bce2-368e05077c97" data-action="Deal Block" data-label="Galaxy Tab S10+" data-dimension48="Galaxy Tab S10+" data-dimension25="$879" href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-12-4-256gb-wi-fi-with-s-pen-moonstone-gray/6593196.p?skuId=6593196" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1277px;"><p class="vanilla-image-block" style="padding-top:65.54%;"><img id="QBrEqozQwVWAZPZyeKgW4X" name="Samsung Galaxy Tab S10 Plus deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/QBrEqozQwVWAZPZyeKgW4X-1920-80.jpg" mos="" align="middle" fullscreen="" width="1277" height="837" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Samsung Galaxy Tab S10+ is the middle child in Samsung's Galaxy Tab series. It features a 12.4-inch AMOLED 2800 x 1752 display, MediaTek MT6989 CPU, 12GB of RAM, and a 256GB SSD. It includes Samsung's S-Pen, which you can use to jot down notes or sketch. <a class="view-deal button" href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-12-4-256gb-wi-fi-with-s-pen-moonstone-gray/6593196.p?skuId=6593196" target="_blank" rel="nofollow" data-dimension112="621641aa-14ff-415a-bce2-368e05077c97" data-action="Deal Block" data-label="Galaxy Tab S10+" data-dimension48="Galaxy Tab S10+" data-dimension25="$879">View Deal</a></p></div><div class="product"><a data-dimension112="58b5c0ca-6b36-4366-9797-9f4e7660ddbf" data-action="Deal Block" data-label="Galaxy Tab S10 Ultra" data-dimension48="Galaxy Tab S10 Ultra" data-dimension25="$969" href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-ultra-14-6-512gb-wi-fi-with-s-pen-moonstone-gray/6593198.p?skuId=6593198" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="veL9bNCBbWD2yAU6jQxDia" name="Samsung Galaxy Tab S10 Ultra Deal Block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/veL9bNCBbWD2yAU6jQxDia-1920-80.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-ultra-14-6-512gb-wi-fi-with-s-pen-moonstone-gray/6593198.p?skuId=6593198" target="_blank" rel="nofollow" data-dimension112="58b5c0ca-6b36-4366-9797-9f4e7660ddbf" data-action="Deal Block" data-label="Galaxy Tab S10 Ultra" data-dimension48="Galaxy Tab S10 Ultra" data-dimension25="$969">Galaxy Tab S10 Ultra: was $1319 now $969</a></strong><br>Released in late 2024, the Tab S10 Ultra is as premium as Android tablets get, boasting a massive 14.6-inch Dynamic AMOLED display which has to be seen to be believed. It also features a MediaTek MT6989 chipset, 12GB of RAM, and 512GB SSD.<a class="view-deal button" href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-ultra-14-6-512gb-wi-fi-with-s-pen-moonstone-gray/6593198.p?skuId=6593198" target="_blank" rel="nofollow" data-dimension112="58b5c0ca-6b36-4366-9797-9f4e7660ddbf" data-action="Deal Block" data-label="Galaxy Tab S10 Ultra" data-dimension48="Galaxy Tab S10 Ultra" data-dimension25="$969">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ OnePlus Pad mini tipped for early 2026 launch — and it may give iPad mini a run for its money ]]></title>
                                                                                                <dc:content><![CDATA[ <p>OnePlus has a proven track record of making excellent devices, so it's no surprise that the <a href="https://www.tomsguide.com/computing/android-tablets/oneplus-pad-3">OnePlus Pad 3</a> is easily the <a href="https://www.tomsguide.com/best-picks/best-android-tablets">best Android tablet</a> you can buy right now. But if you were hoping for a great tablet without such a large display, you don't have to go for the <a href="https://www.tomsguide.com/tablets/ipads/ipad-mini-7-review">iPad mini 7</a>.</p><p>Leaker <a href="https://x.com/nakajimegame/status/1950599346204139883" target="_blank">Digital Chat Station</a> claims that OnePlus is working on a smaller version of the tablet, tentatively called the OnePlus Pad Mini. But, unlike the OnePlus Pad Lite, this is designed to be a premium device. </p><p>In other words, we should expect this to simply be a smaller version of existing OnePlus tablets — rather than a cheaper model that has to compromise on features and specs. </p><p>The leaker claims that the tablet is currently being tested with the <a href="https://www.tomsguide.com/phones/android-phones/snapdragon-8-elite-gen-2-leak-just-tipped-huge-performance-leap-for-android-flagships">Snapdragon 8 Elite Gen 2 chipset</a>. The chip is expected to launch later this year as a follow-up to the <a href="https://www.tomsguide.com/phones/android-phones/snapdragon-8-elite-benchmarks">Snapdragon 8 Elite</a>, which is itself easily the best chipset you can get for an Android device. </p><p>That may give the OnePlus Pad Mini a slight advantage compared to Apple's smallest iPad — since it will (presumably) have the same processing hardware as the next wave of OnePlus flagships.</p><p>As much as we love the iPad mini 7, we can't ignore the fact it's missing performance prowess as other iPads. It's all because it runs on the A17 Pro chipset, an older mobile chipset that debuted on <a href="https://www.tomsguide.com/reviews/iphone-15-pro">iPhone 15 Pro</a>, while the likes of the <a href="https://www.tomsguide.com/tablets/ipads/ipad-air-2024-review">iPad Air</a> and <a href="https://www.tomsguide.com/tablets/ipads/ipad-pro-2024">iPad Pro</a> utilize <a href="https://www.tomsguide.com/news/apple-m3-chip">Apple's M3</a> and <a href="https://www.tomsguide.com/computing/apple-desktops/apple-m4-chip">M4 chips </a>respectively. That means the larger tablets end up with significantly better performance and efficiency.</p><h2 id="oneplus-pad-mini-what-to-expect">OnePlus Pad Mini: What to expect</h2><p>With that in mind, it's clear that the OnePlus Pad Mini is not going to be a slouch in the performance department. It's quite the step up from the MediaTek Helio G100 OnePlus put into the Pad Lite — and the first generation Snapdragon 8 Elite in the OnePlus Pad 3.</p><p>We don't know how big the screen is going to be, but DCS claims the tablet will launch alongside a 6.3-inch OnePlus phone — which one source claims will be the OnePlus 15T. </p><p>My guess is that the Pad Mini would be slightly larger, while still being noticeably smaller than its 13.2-inch predecessor. Probably something closer to 8 or 9 inches, based on the name, since a 10-inch tablet screen doesn't exactly scream "small." A bit like the iPad mini, in fact.</p><p>Now, I did pause at the mention of this tablet arriving alongside the OnePlus 15T. Considering we've only just seen the release of the <a href="https://www.tomsguide.com/phones/oneplus-phones/oneplus-13t-isnt-coming-to-the-us-or-europe-and-i-dont-get-why">OnePlus 13T</a> back in May, it suggests we may be waiting almost 2 years for the OnePlus Tab Mini to arrive. That's hardly ideal.</p><p>But DCS claims that the OnePlus Tab Mini should be arriving <a href="https://weibo.com/6048569942/PDiPjEUlC?pagetype=profilefeed" target="_blank">sometime early next year</a>. So I'm just guessing there has been some miscommunication along the way — or some kind of mistranslation.</p><p>I guess it depends on whether OnePlus will be skipping over the OnePlus 14, as it did with the OnePlus 4. In the meantime, check out our roundup of all the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a> you can buy.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/ipads/m5-ipad-pro-everything-we-know-so-far">M5 iPad Pro: Everything we know so far</a></li><li><a href="">Forget the iPad mini — this 9-inch OLED Android tablet is way better for gaming</a></li><li><a href="https://www.tomsguide.com/computing/ipads/ipados-26-public-beta-5-features-id-try-first">iPadOS 26 public beta — 5 features I'd try first</a></li></ul><div data-widget-type="merchantlink" data-model-name="OnePlus Pad 3"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/android-tablets/forget-ipad-mini-oneplus-pad-mini-just-tipped-to-launch-next-year-with-a-serious-power-boost</link>
                                                                            <description>
                            <![CDATA[ OnePlus could release a smaller version of its premium tablets early next year — here's what we know. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">yVwvdfc2KG8zpBufjEz2b7</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/thMPUHHoUpVWQUSbcLuQ6b-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 31 Jul 2025 12:08:56 +0000</pubDate>                                                                                                                                <updated>Thu, 31 Jul 2025 14:32:14 +0000</updated>
                                                                                                                                            <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/thMPUHHoUpVWQUSbcLuQ6b-1920-80.jpg">
                                                            <media:credit><![CDATA[ Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[OnePlus Pad 3 on granite worktop, on home screen]]></media:description>                                                            <media:text><![CDATA[OnePlus Pad 3 on granite worktop, on home screen]]></media:text>
                                <media:title type="plain"><![CDATA[OnePlus Pad 3 on granite worktop, on home screen]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/thMPUHHoUpVWQUSbcLuQ6b-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>OnePlus has a proven track record of making excellent devices, so it's no surprise that the <a href="https://www.tomsguide.com/computing/android-tablets/oneplus-pad-3">OnePlus Pad 3</a> is easily the <a href="https://www.tomsguide.com/best-picks/best-android-tablets">best Android tablet</a> you can buy right now. But if you were hoping for a great tablet without such a large display, you don't have to go for the <a href="https://www.tomsguide.com/tablets/ipads/ipad-mini-7-review">iPad mini 7</a>.</p><p>Leaker <a href="https://x.com/nakajimegame/status/1950599346204139883" target="_blank">Digital Chat Station</a> claims that OnePlus is working on a smaller version of the tablet, tentatively called the OnePlus Pad Mini. But, unlike the OnePlus Pad Lite, this is designed to be a premium device. </p><p>In other words, we should expect this to simply be a smaller version of existing OnePlus tablets — rather than a cheaper model that has to compromise on features and specs. </p><p>The leaker claims that the tablet is currently being tested with the <a href="https://www.tomsguide.com/phones/android-phones/snapdragon-8-elite-gen-2-leak-just-tipped-huge-performance-leap-for-android-flagships">Snapdragon 8 Elite Gen 2 chipset</a>. The chip is expected to launch later this year as a follow-up to the <a href="https://www.tomsguide.com/phones/android-phones/snapdragon-8-elite-benchmarks">Snapdragon 8 Elite</a>, which is itself easily the best chipset you can get for an Android device. </p><p>That may give the OnePlus Pad Mini a slight advantage compared to Apple's smallest iPad — since it will (presumably) have the same processing hardware as the next wave of OnePlus flagships.</p><p>As much as we love the iPad mini 7, we can't ignore the fact it's missing performance prowess as other iPads. It's all because it runs on the A17 Pro chipset, an older mobile chipset that debuted on <a href="https://www.tomsguide.com/reviews/iphone-15-pro">iPhone 15 Pro</a>, while the likes of the <a href="https://www.tomsguide.com/tablets/ipads/ipad-air-2024-review">iPad Air</a> and <a href="https://www.tomsguide.com/tablets/ipads/ipad-pro-2024">iPad Pro</a> utilize <a href="https://www.tomsguide.com/news/apple-m3-chip">Apple's M3</a> and <a href="https://www.tomsguide.com/computing/apple-desktops/apple-m4-chip">M4 chips </a>respectively. That means the larger tablets end up with significantly better performance and efficiency.</p><h2 id="oneplus-pad-mini-what-to-expect">OnePlus Pad Mini: What to expect</h2><p>With that in mind, it's clear that the OnePlus Pad Mini is not going to be a slouch in the performance department. It's quite the step up from the MediaTek Helio G100 OnePlus put into the Pad Lite — and the first generation Snapdragon 8 Elite in the OnePlus Pad 3.</p><p>We don't know how big the screen is going to be, but DCS claims the tablet will launch alongside a 6.3-inch OnePlus phone — which one source claims will be the OnePlus 15T. </p><p>My guess is that the Pad Mini would be slightly larger, while still being noticeably smaller than its 13.2-inch predecessor. Probably something closer to 8 or 9 inches, based on the name, since a 10-inch tablet screen doesn't exactly scream "small." A bit like the iPad mini, in fact.</p><p>Now, I did pause at the mention of this tablet arriving alongside the OnePlus 15T. Considering we've only just seen the release of the <a href="https://www.tomsguide.com/phones/oneplus-phones/oneplus-13t-isnt-coming-to-the-us-or-europe-and-i-dont-get-why">OnePlus 13T</a> back in May, it suggests we may be waiting almost 2 years for the OnePlus Tab Mini to arrive. That's hardly ideal.</p><p>But DCS claims that the OnePlus Tab Mini should be arriving <a href="https://weibo.com/6048569942/PDiPjEUlC?pagetype=profilefeed" target="_blank">sometime early next year</a>. So I'm just guessing there has been some miscommunication along the way — or some kind of mistranslation.</p><p>I guess it depends on whether OnePlus will be skipping over the OnePlus 14, as it did with the OnePlus 4. In the meantime, check out our roundup of all the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a> you can buy.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/ipads/m5-ipad-pro-everything-we-know-so-far">M5 iPad Pro: Everything we know so far</a></li><li><a href="">Forget the iPad mini — this 9-inch OLED Android tablet is way better for gaming</a></li><li><a href="https://www.tomsguide.com/computing/ipads/ipados-26-public-beta-5-features-id-try-first">iPadOS 26 public beta — 5 features I'd try first</a></li></ul><div data-widget-type="merchantlink" data-model-name="OnePlus Pad 3"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Forget the iPad mini — this 9-inch OLED Android tablet is way better for gaming ]]></title>
                                                                                                <dc:content><![CDATA[ <p>There's been a hole in my life ever since I finally said goodbye to my aging iPad mini several years ago. In my mind, Apple's smallest iPad is one of the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a> out there, but the arrival of the RedMagic Astra this month has given me pause. What's on offer is pretty simple: a compact Android tablet running the latest and greatest chipset designed for a supreme gaming experience.</p><p>While I'm not a massive mobile gamer, I've always appreciated that the <a href="https://www.tomsguide.com/tablets/ipads/ipad-mini-7-review">iPad mini 7</a> didn't compromise on power even though it was smaller than its bigger brethren. The same is true here. RedMagic has thrown everything but the kitchen sink into this device thanks to a <a href="https://www.tomsguide.com/phones/android-phones/snapdragon-8-elite-benchmarks">Snapdragon 8 Elite chip</a>, a stunning OLED screen, active cooling, fast charging and a slick design.</p><p>Space is at a premium in my everyday carry, and I'm not quite willing to pony up for one of the <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldable phones</a>, no matter how slim the new <a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review">Samsung Galaxy Z Fold 7</a> is. That leaves me looking for that Goldilocks device; a tablet larger than a phone but not as big as a hybrid, that doesn't compromise on power and has a few unique tricks up its sleeve. And after having used it for a couple of weeks, I think the RedMagic Astra delivers on all fronts. Let me tell you how... </p><h3 class="article-body__section" id="section-redmagic-astra-specs"><span>RedMagic Astra: Specs</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>RedMagic Astra</strong>   </p></td></tr><tr><td class="firstcol " ><p><strong>Starting price</strong>    </p></td><td  ><p>£529 / $699    </p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong>    </p></td><td  ><p>9.06-inch OLED (2,400 x 1,504)    </p></td></tr><tr><td class="firstcol " ><p><strong>Refresh rate</strong>    </p></td><td  ><p>165Hz adaptive    </p></td></tr><tr><td class="firstcol " ><p><strong>Rear camera</strong>    </p></td><td  ><p>13MP    </p></td></tr><tr><td class="firstcol " ><p><strong>Front cameras</strong>    </p></td><td  ><p>9MP    </p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong>    </p></td><td  ><p>Snapdragon 8 Elite    </p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong>    </p></td><td  ><p>12GB/16GB/24GB    </p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong>    </p></td><td  ><p>256GB/512GB/1TB    </p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong>    </p></td><td  ><p>8,200    </p></td></tr><tr><td class="firstcol " ><p><strong>Charging</strong>    </p></td><td  ><p>80W    </p></td></tr><tr><td class="firstcol " ><p><strong>Operating system</strong>    </p></td><td  ><p>RedMagicOS 10 / Android 15    </p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong>    </p></td><td  ><p>207 x 134.2 x 6.9 mm / 8.1 x 5.2 x 0.27 inches    </p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong>    </p></td><td  ><p>370 grams / 0.81 pounds    </p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong>    </p></td><td  ><p>Eclipse/Starfrost</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-redmagic-astra-price-and-availability"><span>Redmagic Astra: Price and availability</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:5831px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="k65fKfccmtrXMowhdzDvFg" name="RedMagic Astra" alt="The RedMagic Astra Android gaming tablet" src="https://cdn.mos.cms.futurecdn.net/k65fKfccmtrXMowhdzDvFg-1920-80.jpg" mos="" align="middle" fullscreen="" width="5831" height="3280" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Redmagic Astra comes in three different configurations with pricing to match. The entry-level price for both the Eclipse (black) and Starfrost (silver) versions gets you <a href="https://www.amazon.com/dp/B0F9L522JZ" target="_blank" rel="nofollow">12GB RAM and 256GB of storage for $699</a> / £499.</p><p>If you opt for 16GB RAM and 512GB storage, that pricing <a href="https://www.amazon.com/dp/B0F9L56TNZ?th=1" target="_blank" rel="nofollow">increases to $799</a> / £699. </p><p>And if you push up to 24GB RAM and 1TB storage, the <a href="https://www.amazon.com/dp/B0F9L9VHMD?th=1" target="_blank" rel="nofollow">cost goes up to $949</a>  / £879. Just note: only the Eclipse colorway is available in this configuration.</p><div data-widget-type="review" data-model-name="RedMagic Astra"></div><p>Those prices are a little on the high side and put this above the level of a casual purchase. For example, the entry-level price is actually higher than the $499 starting price for the iPad mini 7. It's true that Apple's tablet has half the storage for that price, but still — if you want a small tablet on a budget, then Apple actually has the edge here.</p><p>However, Apple's pricing increases to $799 if you want 512GB of storage on the iPad mini 7, so once you start getting into the higher configurations, you're getting better value from Redmagic.</p><p>Perhaps a more realistic comparison is Lenovo's Legion Tab, another <a href="https://www.tomsguide.com/computing/tablets/i-thought-the-ipad-mini-was-the-perfect-small-tablet-until-i-tried-the-lenovo-legion-tab-3-heres-why">8-inch tablet with a gaming focus</a> that also starts at $549, albeit with an older chipset and an LCD screen rather than an OLED one. </p><p>Another recent Android tablet to launch with the Snapdragon 8 Elite chipset is the <a href="https://www.tomsguide.com/computing/android-tablets/oneplus-pad-3">OnePlus Pad 3,</a> which commands a £599 / $699 price for its 16GB RAM and 512GB configuration — but that's also got a larger 13.2-inch screen. </p><h3 class="article-body__section" id="section-redmagic-astra-design"><span>RedMagic Astra: Design</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:6000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zLrKfxwQMgeJJiKzFZ3Nig" name="RedMagic Astra" alt="The RedMagic Astra Android gaming tablet" src="https://cdn.mos.cms.futurecdn.net/zLrKfxwQMgeJJiKzFZ3Nig-1920-80.jpg" mos="" align="middle" fullscreen="" width="6000" height="3375" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Gaming devices can be somewhat divisive when it comes to design, but I think most people would be hard-pressed to find fault with the RedMagic Astra. Bezels around the front of the device are kept to a minimum, thanks to the 90.1% screen-to-body ratio, while the back is pretty understated.</p><p>First up, I'm not sure I can remember the last time I used a tablet (or phone) without a camera bump. Seriously, it's been that long. The Astra is completely flush across the back, which means you can slide it in and out of a backpack, prop it up on a stand or even attach it to a telescopic controller without any resistance.</p><p>The aluminum frame has rounded corners and measures a pitch-perfect 7.3mm thick — enough to give you something to grip onto without being too chunky. The power button sits on the left edge naturally, where your index finger rests while holding it in landscape mode, and doubles up as a fingerprint scanner. The Astra's USB-C port is across from it on the right edge. Up top is the volume rocker and RedMagic's metallic red slider that toggles on its Game Space launcher — more on that later.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4593px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="X4qrBCVNBYowie7oFRPAof" name="RedMagic Astra" alt="The RedMagic Astra Android gaming tablet" src="https://cdn.mos.cms.futurecdn.net/X4qrBCVNBYowie7oFRPAof-1920-80.jpg" mos="" align="middle" fullscreen="" width="4593" height="2584" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I'm not quite sure why RedMagic decided to put the USB-C on the right-hand side — it's too far up to use in a telescopic controller, and because it's not on the bottom, you can't easily attach it to a dock or charging station.</p><p>Whether you opt for the Starfrost or Eclipse color, you get a soft matte finish on the back that looks awesome. It dulls those pesky reflections you get with a glossy finish, although this slate still isn't immune to fingerprint smudges.</p><p>Aside from the single RedMagic logo in the middle of the chassis, there's a rectangular glass window running along the top that gives you a glimpse of a PCB-stylised graphic with gold stamps for the Snapdragon 8 Elite logo, as well as highlighting the vapor chamber and "composite liquid metal" build.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:6000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="w4BsEAmoxYcKsFGwX8ughg" name="RedMagic Astra" alt="The RedMagic Astra Android gaming tablet" src="https://cdn.mos.cms.futurecdn.net/w4BsEAmoxYcKsFGwX8ughg-1920-80.jpg" mos="" align="middle" fullscreen="" width="6000" height="3375" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There's also the RedMagic logo written out in font, which you can set to pulse with light in the tablet's settings. You can also illuminate the ring around the camera lens.</p><p>These small bits of RGB lighting let you subtly know it's a gaming machine and they can be set for additional functionality, like working with an alarm or indicating a charging process.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:6000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="UkWZqNXcnLmCJDMHk8sdbg" name="RedMagic Astra" alt="The RedMagic Astra Android gaming tablet" src="https://cdn.mos.cms.futurecdn.net/UkWZqNXcnLmCJDMHk8sdbg-1920-80.jpg" mos="" align="middle" fullscreen="" width="6000" height="3375" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The RedMagic Astra is rated IP54 waterproof, which means it'll survive the odd splash if you want to take your gaming session outside in the rain or into the shower — but it's not going to survive being fully submerged.</p><p>One small gripe I have about the design is that the speaker vents are placed on the left and right below the power button and USB-C port. This means that when you're gripping the tablet in landscape mode, your palms can muffle the output and spoil the audio quality. Given the relative size of the device, I'm not sure where else you would locate the speakers, but if the power button and USB-C port had been shifted to the top and bottom, respectively, RedMagic may have been able to shift the speaker grilles further up and alleviate the problem.</p><p>All told, though, I'm a real fan of the RedMagic Astra design. It leans just enough into a premium, gamer sci-fi vibe to be recognized as a premium tablet without being garish. Meanwhile, the heft (370g) and proportions — about the same as a Moleskine notebook at 134.2mm (H) x 207mm (W) x 6.9mm (D) — are just right to slip into my rucksack without making a nuisance.</p><h3 class="article-body__section" id="section-redmagic-astra-display"><span>RedMagic Astra: Display</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5883px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="M4THEa5pQy8mhUaDxahcTg" name="RedMagic Astra" alt="The RedMagic Astra Android gaming tablet" src="https://cdn.mos.cms.futurecdn.net/M4THEa5pQy8mhUaDxahcTg-1920-80.jpg" mos="" align="middle" fullscreen="" width="5883" height="3309" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If the design around back is cool, then the RedMagic Astra's display is ice cold — and probably one of the best reasons I have to recommend this device. Not just to anyone wanting a gaming machine, but anyone wanting a small, powerful tablet, period.</p><p>You get a full-on OLED display with a 165Hz refresh rate and 1,600 nits of peak brightness. It's absolutely popping with vibrancy and contrast in games like Call of Duty: Mobile or Genshin Impact, and it's really impressive. </p><p>The 2,400 x 1,504 pixel resolution is more than enough on the Astra's 9.06-inch screen (with a 16:10 aspect ratio), and if you want to switch off the games and enjoy one of the best streaming shows, it's just as good. It doesn't support HDR on services like Netflix, but to my eye, the contrast on those deep blacks still looked fantastic.</p><h3 class="article-body__section" id="section-redmagic-astra-performance"><span>RedMagic Astra: 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:4936px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="EBKE62FFRuSKUM93QNgDFg" name="RedMagic Astra" alt="The RedMagic Astra Android gaming tablet" src="https://cdn.mos.cms.futurecdn.net/EBKE62FFRuSKUM93QNgDFg-1920-80.jpg" mos="" align="middle" fullscreen="" width="4936" height="2777" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Snapdragon 8 Elite chipset has made itself at home in a number of the <a href="https://www.tomsguide.com/us/best-android-phones,review-6051.html">best Android phones</a>, but is still relatively rare in tablets. The RedMagic Astra has the regular version of the chip without an overclocked CPU. I was able to comfortably run Genshin Impact, Call of Duty, FC Mobile, Command & Conquer: Rivals and Horizon Chase with the Astra set to 165Hz, and it was the best gaming experience I've ever had on a tablet.</p><p>From loading up and navigating through menus to actual gameplay, the experience was fluid and responsive without a hint of stutter or lag. I'm no fan of touchscreen gaming, but the response rate — to my untrained fingers — was sublime.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5012px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VSBndvy2DeJBYwpbs5kGQg" name="RedMagic Astra" alt="The RedMagic Astra Android gaming tablet" src="https://cdn.mos.cms.futurecdn.net/VSBndvy2DeJBYwpbs5kGQg-1920-80.jpg" mos="" align="middle" fullscreen="" width="5012" height="2819" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There's an active cooling system and the vapor chamber inside the RedMagic Astra, and the fan will start up under aggressive conditions to try and keep the thing cool. You can hear it whirring away if you put your ear to the back of the device, but otherwise it won't spoil your gaming session, and it succeeds in keeping the tablet cool throughout even the most demanding games.</p><p>Running the Astra through a series of benchmarks just confirms the inevitable; this device blows its competition away when it comes to sheer grunt. It scored higher than the OnePlus Pad 3 on single-core Geekbench score and narrowly lost out on multi-core. Meanwhile, it swatted away <a href="https://www.tomsguide.com/tablets/ipads/ipad-air-m3-review">Apple's M3 iPad Air</a> without breaking a sweat. You can see the full results in the table below.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>RedMagic Astra</strong></p></td><td  ><p><strong>OnePlus Pad 3</strong>    </p></td><td  ><p><strong>Samsung Galaxy Tab S10 Plus</strong>    </p></td><td  ><p><strong>iPad Air 2025 (11-inch)</strong>    </p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong>    </p></td><td  ><p><strong>Snapdragon 8 Elite</strong></p></td><td  ><p><strong>Snapdragon 8 Elite</strong>    </p></td><td  ><p><strong>Dimensity 9300 Plus</strong>    </p></td><td  ><p><strong>Apple M3</strong>    </p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6 score (single-core / multi-core)</strong>    </p></td><td  ><p>3,136 / 7,376</p></td><td  ><p>2,980 / 8,993    </p></td><td  ><p>2,137 / 7,130    </p></td><td  ><p>3,042 / 11,804    </p></td></tr><tr><td class="firstcol " ><p><strong>3DMark Wild Life Extreme Unlimited (score / fps)</strong>    </p></td><td  ><p>5,628 / 33.70</p></td><td  ><p>6,410 / 38.38    </p></td><td  ><p>5,121 / 30    </p></td><td  ><p>5,806 / 34.8    </p></td></tr><tr><td class="firstcol " ><p><strong>Adobe Premiere Rush time to transcode (mins:secs)</strong>    </p></td><td  ><p>0:54</p></td><td  ><p>0:53    </p></td><td  ><p>0:43    </p></td><td  ><p>0:18    </p></td></tr></tbody></table></div><p>The basic RedMagic Astra comes with 12GB RAM and 256GB storage, while the higher-spec model I've been using has 16GB RAM with 512GB onboard memory. If you really want to go overboard, you can pick this tablet up with 24GB of RAM and a massive 1TB of storage. </p><p>Most people won't need that, but if you've got deep pockets (read: $899) and want a device for the long haul, you may be interested.</p><h3 class="article-body__section" id="section-redmagic-astra-battery-and-charging"><span>RedMagic Astra: Battery and charging</span></h3><p>Battery life is something you usually have to sacrifice with smaller devices, but the Astra does a commendable job when it comes to staying power. Tucked inside that stylized matte casing is an 8,200mAh battery that RedMagic quotes will give you around 5.5 hours of gameplay at full frame rate or 5.3 hours of gameplay whilst livestreaming.</p><p>If you want to use it for movies, RedMagic claims you'll get 33 hours of continuous playback before it dies.</p><p>In more day-to-day usage, you're going to get somewhere in between those two extremes. I fired the RedMagic Astra up at 9am and used it continuously until 6pm for streaming video, playing music, browsing the web and playing some games. All of which with the screen at full brightness and locked to 165Hz. </p><p>I took a break for a few hours at 6pm, but came back to it for another two hours later in the evening for a little more YouTube and gaming with a Bluetooth controller attached. Even after nearly 12 hours, I still had a quarter of its available charge left. That's pretty good considering my colleague Tony took a similar approach with the iPad mini 7 and landed on 10 hours and 34 minutes before that device died.</p><p>As you'd expect, the Astra supports 80W charging and will charge to full in 71 minutes when connected to a compatible charging brick. You just need to be aware that RedMagic doesn't ship the device with its own charger.</p><p>Part of the reason RedMagic says the Astra can last this long is due to its "Liquid Metal" technology. The company says it used an indium-based alloy formed mostly from potassium to create a solid piece of metal with strong thermal conductivity. Placing this directly over the CPU lowers the chip's temperature by up to 5°C and improves the overall thermal performance and, by extension, efficiency.</p><h3 class="article-body__section" id="section-redmagic-astra-software"><span>RedMagic Astra: Software</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:5117px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="pnNHMYdg2dXg9W6QSQtu7g" name="RedMagic Astra" alt="The RedMagic Astra Android gaming tablet" src="https://cdn.mos.cms.futurecdn.net/pnNHMYdg2dXg9W6QSQtu7g-1920-80.jpg" mos="" align="middle" fullscreen="" width="5117" height="2878" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There's some good and some bad when it comes to the software side of things here. Bad stuff first; this tablet comes pre-loaded with the kind of bloat I assumed was a thing of the past, but is sadly all too common with Chinese manufacturers. Thankfully, much of it can be uninstalled swiftly, but it's still a laborious process that takes some of the sheen off firing up a brand-new tablet.</p><p>Similarly, I noticed a particular quirk when I was scrolling through my email inbox, and the messages were all layered on top of each other into a blurry mess. I fixed the issue by forcibly locking the screen to 65Hz and reloading the app. It hasn't happened before, but I wouldn't be surprised if I run into a few other glitches here and there.  </p><p>Thankfully, the RedMagic Astra keeps things mostly to stock Android 15 with a few tweaks added by the company's RedMagic OS 10.5 skin. You get some extra options like the aforementioned RGB lighting on the back of the device, around the camera lens and the company's logo. Alongside the aforementioned bloatware, there's also some AI gimmicks like "RedMagic Translation" that offers you real-time voice translation on voice content. Finally, there's an app sidebar you can call up at any time by swiping in from the side of the screen and holding for a few seconds. This displays your recently or most-used apps and can be handy.</p><p>One thing I would have liked to see is a real multitasking solution akin to OnePlus' <a href="https://www.tomsguide.com/features/i-tried-oneplus-open-multitasking-open-canvas">Canvas feature</a>. The RedMagic Astra is more than powerful enough to run a bunch of apps simultaneously, so (even on a small screen) not having software take advantage of this seems like a missed opportunity.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5268px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="CMTmVrf3CiLCUYmxDBNZMg" name="RedMagic Astra" alt="The RedMagic Astra Android gaming tablet" src="https://cdn.mos.cms.futurecdn.net/CMTmVrf3CiLCUYmxDBNZMg-1920-80.jpg" mos="" align="middle" fullscreen="" width="5268" height="2963" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>But when the rubber meets the road, this is a gaming device, so the star of the show is RedMagic's Game Space — activated via a slide of the metallic red toggle on top. </p><p>This transports you (through a fancy, lightspeed-esque graphic) into a game launcher where you can find all your games as well as quick settings for CPU and GPU performance. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4382px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="AwUAceYxZry6Y5oAWbavQf" name="RedMagic Astra" alt="The RedMagic Astra Android gaming tablet" src="https://cdn.mos.cms.futurecdn.net/AwUAceYxZry6Y5oAWbavQf-1920-80.jpg" mos="" align="middle" fullscreen="" width="4382" height="2465" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>And you can tweak the settings for each individual game. It's a simple procedure to toggle superior performance for a demanding game like Genshin Impact while easing back on the throttle for something simple like your next round at Solitaire.</p><h3 class="article-body__section" id="section-redmagic-astra-review-verdict"><span>RedMagic Astra review: Verdict</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5831px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="k65fKfccmtrXMowhdzDvFg" name="RedMagic Astra" alt="The RedMagic Astra Android gaming tablet" src="https://cdn.mos.cms.futurecdn.net/k65fKfccmtrXMowhdzDvFg-1920-80.jpg" mos="" align="middle" fullscreen="" width="5831" height="3280" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The RedMagic Astra is a certified contender for the best gaming tablet you can buy, thanks to the combination of the Snapdragon 8 Elite chip and a jaw-dropping OLED 165Hz screen. It doesn't come cheap, but then considering the hardware and specs you're getting for the price, there's a whole lot of value on offer here.</p><p>Are there some drawbacks? Of course. There's no 5G cellular option for a start, and whilst the hardware and battery will last you a good few years, the same can't be said for the software. RedMagic has committed to three years of software updates (including one major Android update), which isn't good enough in an age where Samsung is <a href="https://www.tomsguide.com/tvs/samsung-one-ups-lg-with-a-7-year-software-support-promise-for-its-smart-tvs">supporting its phones for seven years</a>. </p><p>Looking past those points, the RedMagic Astra is a fantastic device even if you're not a huge gamer. It'll handle any pro-grade app you throw at it, and you could just as easily use this for a bit of on-the-go video editing or hook it up to a monitor and a Bluetooth keyboard and use it as a work machine. You can get a range of dedicated accessories, like a stylus, case or gamepad, directly from RedMagic, too. </p><p>Smaller tablets generally don't have the allure of their larger siblings, but I'm a big fan because I rate portability highly. And while I feel like I've always had to compromise on power or battery life to achieve that, the RedMagic Astra shows I can have my small cake and eat it. </p><p>If you want a small, powerful tablet that's not the iPad Mini 7, then this is the device for you. It helps a bit if you like to play games, too.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/android-tablets/forget-the-ipad-mini-this-9-inch-oled-android-tablet-is-way-better-for-gaming</link>
                                                                            <description>
                            <![CDATA[ The Redmagic Astra gaming tablet arrives with the latest Snapdragon processor and an impressive OLED screen. If you want a high-powered compact tablet, this is it. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">JkTz6AiXaN8pYoTti57tpW</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/KXJgm56XskdeiMs56MobSe-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 30 Jul 2025 11:00:00 +0000</pubDate>                                                                                                                                <updated>Thu, 26 Mar 2026 10:30:17 +0000</updated>
                                                                                                                                            <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></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-320-70.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/KXJgm56XskdeiMs56MobSe-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The RedMagic Astra Android gaming tablet]]></media:description>                                                            <media:text><![CDATA[The RedMagic Astra Android gaming tablet]]></media:text>
                                <media:title type="plain"><![CDATA[The RedMagic Astra Android gaming tablet]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/KXJgm56XskdeiMs56MobSe-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>There's been a hole in my life ever since I finally said goodbye to my aging iPad mini several years ago. In my mind, Apple's smallest iPad is one of the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a> out there, but the arrival of the RedMagic Astra this month has given me pause. What's on offer is pretty simple: a compact Android tablet running the latest and greatest chipset designed for a supreme gaming experience.</p><p>While I'm not a massive mobile gamer, I've always appreciated that the <a href="https://www.tomsguide.com/tablets/ipads/ipad-mini-7-review">iPad mini 7</a> didn't compromise on power even though it was smaller than its bigger brethren. The same is true here. RedMagic has thrown everything but the kitchen sink into this device thanks to a <a href="https://www.tomsguide.com/phones/android-phones/snapdragon-8-elite-benchmarks">Snapdragon 8 Elite chip</a>, a stunning OLED screen, active cooling, fast charging and a slick design.</p><p>Space is at a premium in my everyday carry, and I'm not quite willing to pony up for one of the <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldable phones</a>, no matter how slim the new <a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review">Samsung Galaxy Z Fold 7</a> is. That leaves me looking for that Goldilocks device; a tablet larger than a phone but not as big as a hybrid, that doesn't compromise on power and has a few unique tricks up its sleeve. And after having used it for a couple of weeks, I think the RedMagic Astra delivers on all fronts. Let me tell you how... </p><h3 class="article-body__section" id="section-redmagic-astra-specs"><span>RedMagic Astra: Specs</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>RedMagic Astra</strong>   </p></td></tr><tr><td class="firstcol " ><p><strong>Starting price</strong>    </p></td><td  ><p>£529 / $699    </p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong>    </p></td><td  ><p>9.06-inch OLED (2,400 x 1,504)    </p></td></tr><tr><td class="firstcol " ><p><strong>Refresh rate</strong>    </p></td><td  ><p>165Hz adaptive    </p></td></tr><tr><td class="firstcol " ><p><strong>Rear camera</strong>    </p></td><td  ><p>13MP    </p></td></tr><tr><td class="firstcol " ><p><strong>Front cameras</strong>    </p></td><td  ><p>9MP    </p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong>    </p></td><td  ><p>Snapdragon 8 Elite    </p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong>    </p></td><td  ><p>12GB/16GB/24GB    </p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong>    </p></td><td  ><p>256GB/512GB/1TB    </p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong>    </p></td><td  ><p>8,200    </p></td></tr><tr><td class="firstcol " ><p><strong>Charging</strong>    </p></td><td  ><p>80W    </p></td></tr><tr><td class="firstcol " ><p><strong>Operating system</strong>    </p></td><td  ><p>RedMagicOS 10 / Android 15    </p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong>    </p></td><td  ><p>207 x 134.2 x 6.9 mm / 8.1 x 5.2 x 0.27 inches    </p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong>    </p></td><td  ><p>370 grams / 0.81 pounds    </p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong>    </p></td><td  ><p>Eclipse/Starfrost</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-redmagic-astra-price-and-availability"><span>Redmagic Astra: Price and availability</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:5831px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="k65fKfccmtrXMowhdzDvFg" name="RedMagic Astra" alt="The RedMagic Astra Android gaming tablet" src="https://cdn.mos.cms.futurecdn.net/k65fKfccmtrXMowhdzDvFg-1920-80.jpg" mos="" align="middle" fullscreen="" width="5831" height="3280" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Redmagic Astra comes in three different configurations with pricing to match. The entry-level price for both the Eclipse (black) and Starfrost (silver) versions gets you <a href="https://www.amazon.com/dp/B0F9L522JZ" target="_blank" rel="nofollow">12GB RAM and 256GB of storage for $699</a> / £499.</p><p>If you opt for 16GB RAM and 512GB storage, that pricing <a href="https://www.amazon.com/dp/B0F9L56TNZ?th=1" target="_blank" rel="nofollow">increases to $799</a> / £699. </p><p>And if you push up to 24GB RAM and 1TB storage, the <a href="https://www.amazon.com/dp/B0F9L9VHMD?th=1" target="_blank" rel="nofollow">cost goes up to $949</a>  / £879. Just note: only the Eclipse colorway is available in this configuration.</p><div data-widget-type="review" data-model-name="RedMagic Astra"></div><p>Those prices are a little on the high side and put this above the level of a casual purchase. For example, the entry-level price is actually higher than the $499 starting price for the iPad mini 7. It's true that Apple's tablet has half the storage for that price, but still — if you want a small tablet on a budget, then Apple actually has the edge here.</p><p>However, Apple's pricing increases to $799 if you want 512GB of storage on the iPad mini 7, so once you start getting into the higher configurations, you're getting better value from Redmagic.</p><p>Perhaps a more realistic comparison is Lenovo's Legion Tab, another <a href="https://www.tomsguide.com/computing/tablets/i-thought-the-ipad-mini-was-the-perfect-small-tablet-until-i-tried-the-lenovo-legion-tab-3-heres-why">8-inch tablet with a gaming focus</a> that also starts at $549, albeit with an older chipset and an LCD screen rather than an OLED one. </p><p>Another recent Android tablet to launch with the Snapdragon 8 Elite chipset is the <a href="https://www.tomsguide.com/computing/android-tablets/oneplus-pad-3">OnePlus Pad 3,</a> which commands a £599 / $699 price for its 16GB RAM and 512GB configuration — but that's also got a larger 13.2-inch screen. </p><h3 class="article-body__section" id="section-redmagic-astra-design"><span>RedMagic Astra: Design</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:6000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zLrKfxwQMgeJJiKzFZ3Nig" name="RedMagic Astra" alt="The RedMagic Astra Android gaming tablet" src="https://cdn.mos.cms.futurecdn.net/zLrKfxwQMgeJJiKzFZ3Nig-1920-80.jpg" mos="" align="middle" fullscreen="" width="6000" height="3375" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Gaming devices can be somewhat divisive when it comes to design, but I think most people would be hard-pressed to find fault with the RedMagic Astra. Bezels around the front of the device are kept to a minimum, thanks to the 90.1% screen-to-body ratio, while the back is pretty understated.</p><p>First up, I'm not sure I can remember the last time I used a tablet (or phone) without a camera bump. Seriously, it's been that long. The Astra is completely flush across the back, which means you can slide it in and out of a backpack, prop it up on a stand or even attach it to a telescopic controller without any resistance.</p><p>The aluminum frame has rounded corners and measures a pitch-perfect 7.3mm thick — enough to give you something to grip onto without being too chunky. The power button sits on the left edge naturally, where your index finger rests while holding it in landscape mode, and doubles up as a fingerprint scanner. The Astra's USB-C port is across from it on the right edge. Up top is the volume rocker and RedMagic's metallic red slider that toggles on its Game Space launcher — more on that later.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4593px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="X4qrBCVNBYowie7oFRPAof" name="RedMagic Astra" alt="The RedMagic Astra Android gaming tablet" src="https://cdn.mos.cms.futurecdn.net/X4qrBCVNBYowie7oFRPAof-1920-80.jpg" mos="" align="middle" fullscreen="" width="4593" height="2584" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I'm not quite sure why RedMagic decided to put the USB-C on the right-hand side — it's too far up to use in a telescopic controller, and because it's not on the bottom, you can't easily attach it to a dock or charging station.</p><p>Whether you opt for the Starfrost or Eclipse color, you get a soft matte finish on the back that looks awesome. It dulls those pesky reflections you get with a glossy finish, although this slate still isn't immune to fingerprint smudges.</p><p>Aside from the single RedMagic logo in the middle of the chassis, there's a rectangular glass window running along the top that gives you a glimpse of a PCB-stylised graphic with gold stamps for the Snapdragon 8 Elite logo, as well as highlighting the vapor chamber and "composite liquid metal" build.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:6000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="w4BsEAmoxYcKsFGwX8ughg" name="RedMagic Astra" alt="The RedMagic Astra Android gaming tablet" src="https://cdn.mos.cms.futurecdn.net/w4BsEAmoxYcKsFGwX8ughg-1920-80.jpg" mos="" align="middle" fullscreen="" width="6000" height="3375" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There's also the RedMagic logo written out in font, which you can set to pulse with light in the tablet's settings. You can also illuminate the ring around the camera lens.</p><p>These small bits of RGB lighting let you subtly know it's a gaming machine and they can be set for additional functionality, like working with an alarm or indicating a charging process.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:6000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="UkWZqNXcnLmCJDMHk8sdbg" name="RedMagic Astra" alt="The RedMagic Astra Android gaming tablet" src="https://cdn.mos.cms.futurecdn.net/UkWZqNXcnLmCJDMHk8sdbg-1920-80.jpg" mos="" align="middle" fullscreen="" width="6000" height="3375" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The RedMagic Astra is rated IP54 waterproof, which means it'll survive the odd splash if you want to take your gaming session outside in the rain or into the shower — but it's not going to survive being fully submerged.</p><p>One small gripe I have about the design is that the speaker vents are placed on the left and right below the power button and USB-C port. This means that when you're gripping the tablet in landscape mode, your palms can muffle the output and spoil the audio quality. Given the relative size of the device, I'm not sure where else you would locate the speakers, but if the power button and USB-C port had been shifted to the top and bottom, respectively, RedMagic may have been able to shift the speaker grilles further up and alleviate the problem.</p><p>All told, though, I'm a real fan of the RedMagic Astra design. It leans just enough into a premium, gamer sci-fi vibe to be recognized as a premium tablet without being garish. Meanwhile, the heft (370g) and proportions — about the same as a Moleskine notebook at 134.2mm (H) x 207mm (W) x 6.9mm (D) — are just right to slip into my rucksack without making a nuisance.</p><h3 class="article-body__section" id="section-redmagic-astra-display"><span>RedMagic Astra: Display</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5883px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="M4THEa5pQy8mhUaDxahcTg" name="RedMagic Astra" alt="The RedMagic Astra Android gaming tablet" src="https://cdn.mos.cms.futurecdn.net/M4THEa5pQy8mhUaDxahcTg-1920-80.jpg" mos="" align="middle" fullscreen="" width="5883" height="3309" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If the design around back is cool, then the RedMagic Astra's display is ice cold — and probably one of the best reasons I have to recommend this device. Not just to anyone wanting a gaming machine, but anyone wanting a small, powerful tablet, period.</p><p>You get a full-on OLED display with a 165Hz refresh rate and 1,600 nits of peak brightness. It's absolutely popping with vibrancy and contrast in games like Call of Duty: Mobile or Genshin Impact, and it's really impressive. </p><p>The 2,400 x 1,504 pixel resolution is more than enough on the Astra's 9.06-inch screen (with a 16:10 aspect ratio), and if you want to switch off the games and enjoy one of the best streaming shows, it's just as good. It doesn't support HDR on services like Netflix, but to my eye, the contrast on those deep blacks still looked fantastic.</p><h3 class="article-body__section" id="section-redmagic-astra-performance"><span>RedMagic Astra: 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:4936px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="EBKE62FFRuSKUM93QNgDFg" name="RedMagic Astra" alt="The RedMagic Astra Android gaming tablet" src="https://cdn.mos.cms.futurecdn.net/EBKE62FFRuSKUM93QNgDFg-1920-80.jpg" mos="" align="middle" fullscreen="" width="4936" height="2777" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Snapdragon 8 Elite chipset has made itself at home in a number of the <a href="https://www.tomsguide.com/us/best-android-phones,review-6051.html">best Android phones</a>, but is still relatively rare in tablets. The RedMagic Astra has the regular version of the chip without an overclocked CPU. I was able to comfortably run Genshin Impact, Call of Duty, FC Mobile, Command & Conquer: Rivals and Horizon Chase with the Astra set to 165Hz, and it was the best gaming experience I've ever had on a tablet.</p><p>From loading up and navigating through menus to actual gameplay, the experience was fluid and responsive without a hint of stutter or lag. I'm no fan of touchscreen gaming, but the response rate — to my untrained fingers — was sublime.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5012px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VSBndvy2DeJBYwpbs5kGQg" name="RedMagic Astra" alt="The RedMagic Astra Android gaming tablet" src="https://cdn.mos.cms.futurecdn.net/VSBndvy2DeJBYwpbs5kGQg-1920-80.jpg" mos="" align="middle" fullscreen="" width="5012" height="2819" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There's an active cooling system and the vapor chamber inside the RedMagic Astra, and the fan will start up under aggressive conditions to try and keep the thing cool. You can hear it whirring away if you put your ear to the back of the device, but otherwise it won't spoil your gaming session, and it succeeds in keeping the tablet cool throughout even the most demanding games.</p><p>Running the Astra through a series of benchmarks just confirms the inevitable; this device blows its competition away when it comes to sheer grunt. It scored higher than the OnePlus Pad 3 on single-core Geekbench score and narrowly lost out on multi-core. Meanwhile, it swatted away <a href="https://www.tomsguide.com/tablets/ipads/ipad-air-m3-review">Apple's M3 iPad Air</a> without breaking a sweat. You can see the full results in the table below.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>RedMagic Astra</strong></p></td><td  ><p><strong>OnePlus Pad 3</strong>    </p></td><td  ><p><strong>Samsung Galaxy Tab S10 Plus</strong>    </p></td><td  ><p><strong>iPad Air 2025 (11-inch)</strong>    </p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong>    </p></td><td  ><p><strong>Snapdragon 8 Elite</strong></p></td><td  ><p><strong>Snapdragon 8 Elite</strong>    </p></td><td  ><p><strong>Dimensity 9300 Plus</strong>    </p></td><td  ><p><strong>Apple M3</strong>    </p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6 score (single-core / multi-core)</strong>    </p></td><td  ><p>3,136 / 7,376</p></td><td  ><p>2,980 / 8,993    </p></td><td  ><p>2,137 / 7,130    </p></td><td  ><p>3,042 / 11,804    </p></td></tr><tr><td class="firstcol " ><p><strong>3DMark Wild Life Extreme Unlimited (score / fps)</strong>    </p></td><td  ><p>5,628 / 33.70</p></td><td  ><p>6,410 / 38.38    </p></td><td  ><p>5,121 / 30    </p></td><td  ><p>5,806 / 34.8    </p></td></tr><tr><td class="firstcol " ><p><strong>Adobe Premiere Rush time to transcode (mins:secs)</strong>    </p></td><td  ><p>0:54</p></td><td  ><p>0:53    </p></td><td  ><p>0:43    </p></td><td  ><p>0:18    </p></td></tr></tbody></table></div><p>The basic RedMagic Astra comes with 12GB RAM and 256GB storage, while the higher-spec model I've been using has 16GB RAM with 512GB onboard memory. If you really want to go overboard, you can pick this tablet up with 24GB of RAM and a massive 1TB of storage. </p><p>Most people won't need that, but if you've got deep pockets (read: $899) and want a device for the long haul, you may be interested.</p><h3 class="article-body__section" id="section-redmagic-astra-battery-and-charging"><span>RedMagic Astra: Battery and charging</span></h3><p>Battery life is something you usually have to sacrifice with smaller devices, but the Astra does a commendable job when it comes to staying power. Tucked inside that stylized matte casing is an 8,200mAh battery that RedMagic quotes will give you around 5.5 hours of gameplay at full frame rate or 5.3 hours of gameplay whilst livestreaming.</p><p>If you want to use it for movies, RedMagic claims you'll get 33 hours of continuous playback before it dies.</p><p>In more day-to-day usage, you're going to get somewhere in between those two extremes. I fired the RedMagic Astra up at 9am and used it continuously until 6pm for streaming video, playing music, browsing the web and playing some games. All of which with the screen at full brightness and locked to 165Hz. </p><p>I took a break for a few hours at 6pm, but came back to it for another two hours later in the evening for a little more YouTube and gaming with a Bluetooth controller attached. Even after nearly 12 hours, I still had a quarter of its available charge left. That's pretty good considering my colleague Tony took a similar approach with the iPad mini 7 and landed on 10 hours and 34 minutes before that device died.</p><p>As you'd expect, the Astra supports 80W charging and will charge to full in 71 minutes when connected to a compatible charging brick. You just need to be aware that RedMagic doesn't ship the device with its own charger.</p><p>Part of the reason RedMagic says the Astra can last this long is due to its "Liquid Metal" technology. The company says it used an indium-based alloy formed mostly from potassium to create a solid piece of metal with strong thermal conductivity. Placing this directly over the CPU lowers the chip's temperature by up to 5°C and improves the overall thermal performance and, by extension, efficiency.</p><h3 class="article-body__section" id="section-redmagic-astra-software"><span>RedMagic Astra: Software</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:5117px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="pnNHMYdg2dXg9W6QSQtu7g" name="RedMagic Astra" alt="The RedMagic Astra Android gaming tablet" src="https://cdn.mos.cms.futurecdn.net/pnNHMYdg2dXg9W6QSQtu7g-1920-80.jpg" mos="" align="middle" fullscreen="" width="5117" height="2878" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There's some good and some bad when it comes to the software side of things here. Bad stuff first; this tablet comes pre-loaded with the kind of bloat I assumed was a thing of the past, but is sadly all too common with Chinese manufacturers. Thankfully, much of it can be uninstalled swiftly, but it's still a laborious process that takes some of the sheen off firing up a brand-new tablet.</p><p>Similarly, I noticed a particular quirk when I was scrolling through my email inbox, and the messages were all layered on top of each other into a blurry mess. I fixed the issue by forcibly locking the screen to 65Hz and reloading the app. It hasn't happened before, but I wouldn't be surprised if I run into a few other glitches here and there.  </p><p>Thankfully, the RedMagic Astra keeps things mostly to stock Android 15 with a few tweaks added by the company's RedMagic OS 10.5 skin. You get some extra options like the aforementioned RGB lighting on the back of the device, around the camera lens and the company's logo. Alongside the aforementioned bloatware, there's also some AI gimmicks like "RedMagic Translation" that offers you real-time voice translation on voice content. Finally, there's an app sidebar you can call up at any time by swiping in from the side of the screen and holding for a few seconds. This displays your recently or most-used apps and can be handy.</p><p>One thing I would have liked to see is a real multitasking solution akin to OnePlus' <a href="https://www.tomsguide.com/features/i-tried-oneplus-open-multitasking-open-canvas">Canvas feature</a>. The RedMagic Astra is more than powerful enough to run a bunch of apps simultaneously, so (even on a small screen) not having software take advantage of this seems like a missed opportunity.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5268px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="CMTmVrf3CiLCUYmxDBNZMg" name="RedMagic Astra" alt="The RedMagic Astra Android gaming tablet" src="https://cdn.mos.cms.futurecdn.net/CMTmVrf3CiLCUYmxDBNZMg-1920-80.jpg" mos="" align="middle" fullscreen="" width="5268" height="2963" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>But when the rubber meets the road, this is a gaming device, so the star of the show is RedMagic's Game Space — activated via a slide of the metallic red toggle on top. </p><p>This transports you (through a fancy, lightspeed-esque graphic) into a game launcher where you can find all your games as well as quick settings for CPU and GPU performance. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4382px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="AwUAceYxZry6Y5oAWbavQf" name="RedMagic Astra" alt="The RedMagic Astra Android gaming tablet" src="https://cdn.mos.cms.futurecdn.net/AwUAceYxZry6Y5oAWbavQf-1920-80.jpg" mos="" align="middle" fullscreen="" width="4382" height="2465" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>And you can tweak the settings for each individual game. It's a simple procedure to toggle superior performance for a demanding game like Genshin Impact while easing back on the throttle for something simple like your next round at Solitaire.</p><h3 class="article-body__section" id="section-redmagic-astra-review-verdict"><span>RedMagic Astra review: Verdict</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5831px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="k65fKfccmtrXMowhdzDvFg" name="RedMagic Astra" alt="The RedMagic Astra Android gaming tablet" src="https://cdn.mos.cms.futurecdn.net/k65fKfccmtrXMowhdzDvFg-1920-80.jpg" mos="" align="middle" fullscreen="" width="5831" height="3280" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The RedMagic Astra is a certified contender for the best gaming tablet you can buy, thanks to the combination of the Snapdragon 8 Elite chip and a jaw-dropping OLED 165Hz screen. It doesn't come cheap, but then considering the hardware and specs you're getting for the price, there's a whole lot of value on offer here.</p><p>Are there some drawbacks? Of course. There's no 5G cellular option for a start, and whilst the hardware and battery will last you a good few years, the same can't be said for the software. RedMagic has committed to three years of software updates (including one major Android update), which isn't good enough in an age where Samsung is <a href="https://www.tomsguide.com/tvs/samsung-one-ups-lg-with-a-7-year-software-support-promise-for-its-smart-tvs">supporting its phones for seven years</a>. </p><p>Looking past those points, the RedMagic Astra is a fantastic device even if you're not a huge gamer. It'll handle any pro-grade app you throw at it, and you could just as easily use this for a bit of on-the-go video editing or hook it up to a monitor and a Bluetooth keyboard and use it as a work machine. You can get a range of dedicated accessories, like a stylus, case or gamepad, directly from RedMagic, too. </p><p>Smaller tablets generally don't have the allure of their larger siblings, but I'm a big fan because I rate portability highly. And while I feel like I've always had to compromise on power or battery life to achieve that, the RedMagic Astra shows I can have my small cake and eat it. </p><p>If you want a small, powerful tablet that's not the iPad Mini 7, then this is the device for you. It helps a bit if you like to play games, too.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Huge Samsung tablet sale at Best Buy — 4 back to school deals I recommend from $159 ]]></title>
                                                                                                <dc:content><![CDATA[ <p>When it comes to popularity, iPads win hands down. However, if you're deeply invested in the Android ecosystem — or you simply don't like iPads — a Samsung tablet is your best bet. </p><p>For a limited time, <a href="https://www.bestbuy.com/site/promo/save-assorted-samsung-galaxy-tablets" target="_blank" rel="nofollow">Best Buy has Samsung tablets on sale from $159</a>. It's one of the biggest Samsung tablet sales I've seen with discounts on some of the <a href="https://www.tomsguide.com/best-picks/best-samsung-tablets">best Samsung tablets</a> we've tested. Below I've picked out some of my top deals in Best Buy's sale. </p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><strong></strong><a href="https://www.bestbuy.com/site/promo/save-assorted-samsung-galaxy-tablets" target="_blank" rel="nofollow"><strong>shop all Samsung tablets on sale from $159</strong></a><strong></strong></li><li><strong>Galaxy Tab A9+: </strong><a href="https://www.bestbuy.com/site/samsung-galaxy-tab-a9-11-64gb-wi-fi-silver/6566193.p?skuId=6566193" target="_blank" rel="nofollow"><strong>was $219 now $159</strong></a></li><li><strong>Galaxy Tab S9: </strong><a href="https://www.bestbuy.com/site/samsung-galaxy-tab-s9-11-128gb-wi-fi-with-s-pen-graphite/6546661.p?skuId=6546661" target="_blank" rel="nofollow"><strong>was $799 now $599</strong></a><strong></strong></li><li><strong>Galaxy Tab S10+: </strong><a href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-12-4-256gb-wi-fi-with-s-pen-moonstone-gray/6593196.p?skuId=6593196" target="_blank" rel="nofollow"><strong>was $999 now $879</strong></a><strong></strong></li><li><strong>Galaxy Tab S10 Ultra: </strong><a href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-ultra-14-6-512gb-wi-fi-with-s-pen-moonstone-gray/6593198.p?skuId=6593198" target="_blank" rel="nofollow"><strong>was $1,319 now $1,099</strong></a><strong></strong></li></ul><h3 class="article-body__section" id="section-best-samsung-tablet-deals"><span>Best Samsung tablet deals</span></h3><div class="product"><a data-dimension112="30d04ae6-2b1f-41c2-9d2a-8a67f210ea96" data-action="Deal Block" data-label="Galaxy Tab A9+" data-dimension48="Galaxy Tab A9+" data-dimension25="$159" href="https://www.bestbuy.com/site/samsung-galaxy-tab-a9-11-64gb-wi-fi-silver/6566193.p?skuId=6566193" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2094px;"><p class="vanilla-image-block" style="padding-top:60.65%;"><img id="3mdmia3kU3uFNStE7MJYkV" name="Screenshot 2024-11-11 at 10.41.30.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/3mdmia3kU3uFNStE7MJYkV-1920-80.png" mos="" align="middle" fullscreen="" width="2094" height="1270" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.bestbuy.com/site/samsung-galaxy-tab-a9-11-64gb-wi-fi-silver/6566193.p?skuId=6566193" target="_blank" rel="nofollow" data-dimension112="30d04ae6-2b1f-41c2-9d2a-8a67f210ea96" data-action="Deal Block" data-label="Galaxy Tab A9+" data-dimension48="Galaxy Tab A9+" data-dimension25="$159">Galaxy Tab A9+: was $219 now $159</a></strong><br>An entry-level Android tablet, the Samsung Galaxy A9+ features an 11-inch display with a 90Hz refresh rate, a long-lasting 7,040mAh battery and a snappy Qualcomm Snapdragon 695 chip. You also get 5MP front and 8MP back cameras.<a class="view-deal button" href="https://www.bestbuy.com/site/samsung-galaxy-tab-a9-11-64gb-wi-fi-silver/6566193.p?skuId=6566193" target="_blank" rel="nofollow" data-dimension112="30d04ae6-2b1f-41c2-9d2a-8a67f210ea96" data-action="Deal Block" data-label="Galaxy Tab A9+" data-dimension48="Galaxy Tab A9+" data-dimension25="$159">View Deal</a></p></div><div class="product"><a data-dimension112="ec2290ba-6d10-4c0d-aa09-f6ee146599fe" data-action="Deal Block" data-label="Galaxy Tab S10 FE+" data-dimension48="Galaxy Tab S10 FE+" data-dimension25="$599" href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-fe-13-1-128gb-wi-fi-with-s-pen-silver/6618950.p?skuId=6618950" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1080px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="6MtzjCmXKf5yE6GBQhiVZK" name="Samsung Galaxy Tab S10 FE deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6MtzjCmXKf5yE6GBQhiVZK-1920-80.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>It's only recently released, but the fantastic <a href="https://www.tomsguide.com/computing/android-tablets/samsung-galaxy-tab-s10-fe-plus-review" data-dimension112="ec2290ba-6d10-4c0d-aa09-f6ee146599fe" data-action="Deal Block" data-label="Galaxy Tab S10 FE+" data-dimension48="Galaxy Tab S10 FE+" data-dimension25="$599">Samsung Galaxy Tab S10 FE+</a> is already $50 off! Not a bad price for a mid-range tablet that comes with an S Pen stylus, a splendid (and larger) 13.1-inch LCD panel, and a 15-hour battery life. This is great value for money! <a class="view-deal button" href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-fe-13-1-128gb-wi-fi-with-s-pen-silver/6618950.p?skuId=6618950" target="_blank" rel="nofollow" data-dimension112="ec2290ba-6d10-4c0d-aa09-f6ee146599fe" data-action="Deal Block" data-label="Galaxy Tab S10 FE+" data-dimension48="Galaxy Tab S10 FE+" data-dimension25="$599">View Deal</a></p></div><div class="product"><a data-dimension112="1400f4af-1bbb-4f9a-ad73-2554ddee164d" data-action="Deal Block" data-label="Galaxy Tab S9" data-dimension48="Galaxy Tab S9" data-dimension25="$599" href="https://www.bestbuy.com/site/samsung-galaxy-tab-s9-11-128gb-wi-fi-with-s-pen-graphite/6546661.p?skuId=6546661" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:70.73%;"><img id="Cy6LrM7S3kScgNEofmJiwk" name="Samsung Galaxy Tab S9 deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Cy6LrM7S3kScgNEofmJiwk-1920-80.jpg" mos="" align="middle" fullscreen="" width="1500" height="1061" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Galaxy Tab S9 is great for watching movies and playing games. It features an 11-inch 2560 x 1600 AMOLED display, Snapdragon 8 Gen 2 chipset, 8GB of RAM, and a 128GB SSD. We also like that you can expand its storage capacity via its microSD/microSDXC card slots. <a class="view-deal button" href="https://www.bestbuy.com/site/samsung-galaxy-tab-s9-11-128gb-wi-fi-with-s-pen-graphite/6546661.p?skuId=6546661" target="_blank" rel="nofollow" data-dimension112="1400f4af-1bbb-4f9a-ad73-2554ddee164d" data-action="Deal Block" data-label="Galaxy Tab S9" data-dimension48="Galaxy Tab S9" data-dimension25="$599">View Deal</a></p></div><div class="product"><a data-dimension112="621641aa-14ff-415a-bce2-368e05077c97" data-action="Deal Block" data-label="Galaxy Tab S10+" data-dimension48="Galaxy Tab S10+" data-dimension25="$879" href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-12-4-256gb-wi-fi-with-s-pen-moonstone-gray/6593196.p?skuId=6593196" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1277px;"><p class="vanilla-image-block" style="padding-top:65.54%;"><img id="QBrEqozQwVWAZPZyeKgW4X" name="Samsung Galaxy Tab S10 Plus deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/QBrEqozQwVWAZPZyeKgW4X-1920-80.jpg" mos="" align="middle" fullscreen="" width="1277" height="837" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Samsung Galaxy Tab S10+ is the middle child in Samsung's Galaxy Tab series. It features a 12.4-inch AMOLED 2800 x 1752 display, MediaTek MT6989 CPU, 12GB of RAM, and a 256GB SSD. It includes Samsung's S-Pen, which you can use to jot down notes or sketch. <a class="view-deal button" href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-12-4-256gb-wi-fi-with-s-pen-moonstone-gray/6593196.p?skuId=6593196" target="_blank" rel="nofollow" data-dimension112="621641aa-14ff-415a-bce2-368e05077c97" data-action="Deal Block" data-label="Galaxy Tab S10+" data-dimension48="Galaxy Tab S10+" data-dimension25="$879">View Deal</a></p></div><div class="product"><a data-dimension112="58b5c0ca-6b36-4366-9797-9f4e7660ddbf" data-action="Deal Block" data-label="Galaxy Tab S10 Ultra" data-dimension48="Galaxy Tab S10 Ultra" data-dimension25="$1099" href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-ultra-14-6-512gb-wi-fi-with-s-pen-moonstone-gray/6593198.p?skuId=6593198" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="veL9bNCBbWD2yAU6jQxDia" name="Samsung Galaxy Tab S10 Ultra Deal Block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/veL9bNCBbWD2yAU6jQxDia-1920-80.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-ultra-14-6-512gb-wi-fi-with-s-pen-moonstone-gray/6593198.p?skuId=6593198" target="_blank" rel="nofollow" data-dimension112="58b5c0ca-6b36-4366-9797-9f4e7660ddbf" data-action="Deal Block" data-label="Galaxy Tab S10 Ultra" data-dimension48="Galaxy Tab S10 Ultra" data-dimension25="$1099">Galaxy Tab S10 Ultra: was $1319 now $1099</a></strong><br>Released in late 2024, the Tab S10 Ultra is as premium as Android tablets get, boasting a massive 14.6-inch Dynamic AMOLED display which has to be seen to be believed. It also features a MediaTek MT6989 chipset, 12GB of RAM, and 512GB SSD.<a class="view-deal button" href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-ultra-14-6-512gb-wi-fi-with-s-pen-moonstone-gray/6593198.p?skuId=6593198" target="_blank" rel="nofollow" data-dimension112="58b5c0ca-6b36-4366-9797-9f4e7660ddbf" data-action="Deal Block" data-label="Galaxy Tab S10 Ultra" data-dimension48="Galaxy Tab S10 Ultra" data-dimension25="$1099">View Deal</a></p></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/android-tablets/huge-samsung-tablet-sale-at-best-buy-3-back-to-school-deals-i-recommend-from-usd599</link>
                                                                            <description>
                            <![CDATA[ Best Buy is slashing the price of various Samsung tablets. Here are the best back to school tablet deals I recommend from just $599. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">w7oJWPwSZEemcMLJThFpVj</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/AfUw4sG3keHh6gQD2k3poP-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 29 Jul 2025 21:00:13 +0000</pubDate>                                                                                                                                <updated>Wed, 13 Aug 2025 21:14:00 +0000</updated>
                                                                                                                                            <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                <author><![CDATA[ louis.ramirez@futurenet.com (Louis Ramirez) ]]></author>                    <dc:creator><![CDATA[ Louis Ramirez ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oYF2xVwCb4pTGhAJi8Yqr5-320-70.jpeg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;As deals editor-in-chief at Tom’s Guide, Louis refuses to pay full price for anything. He has over 10 years of experience finding the best deals and coupons to bring readers. Louis price checks against multiple retailers and searches high and low for sales on 4K TVs, Apple devices, streaming services, mattresses, kitchen appliances, and more. He&#039;s also always looking for the the best coupon codes to turn good deals into stellar buys.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;He has covered major retail events like Amazon Prime Day, Black Friday, and Cyber Monday for more than a decade and knows how to spot an epic deal from a fake discount. He&#039;s also great at helping people negotiate better prices on everything from gym memberships to their home internet service. Louis&#039; work has also helped readers find PS5 restock, baby formula, Clorox wipes, and everything in between. For his next major purchase, Louis is hoping to find a killer deal on an M3-based Mac. &lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;A born-and-bred New Yorker, Louis is always in search of the perfect cup of coffee. On his free time, he enjoys swimming, running, and any workout that pushes his Apple Watch to the max. He&#039;s also a big fan of international films, horror movies, and K-dramas. His work has appeared on Gizmodo, CNET, Digital Trends, Dealnews, and Time Out New York.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/AfUw4sG3keHh6gQD2k3poP-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Galaxy Tab S10 Ultra shown on table]]></media:description>                                                            <media:text><![CDATA[Galaxy Tab S10 Ultra shown on table]]></media:text>
                                <media:title type="plain"><![CDATA[Galaxy Tab S10 Ultra shown on table]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/AfUw4sG3keHh6gQD2k3poP-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>When it comes to popularity, iPads win hands down. However, if you're deeply invested in the Android ecosystem — or you simply don't like iPads — a Samsung tablet is your best bet. </p><p>For a limited time, <a href="https://www.bestbuy.com/site/promo/save-assorted-samsung-galaxy-tablets" target="_blank" rel="nofollow">Best Buy has Samsung tablets on sale from $159</a>. It's one of the biggest Samsung tablet sales I've seen with discounts on some of the <a href="https://www.tomsguide.com/best-picks/best-samsung-tablets">best Samsung tablets</a> we've tested. Below I've picked out some of my top deals in Best Buy's sale. </p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><strong></strong><a href="https://www.bestbuy.com/site/promo/save-assorted-samsung-galaxy-tablets" target="_blank" rel="nofollow"><strong>shop all Samsung tablets on sale from $159</strong></a><strong></strong></li><li><strong>Galaxy Tab A9+: </strong><a href="https://www.bestbuy.com/site/samsung-galaxy-tab-a9-11-64gb-wi-fi-silver/6566193.p?skuId=6566193" target="_blank" rel="nofollow"><strong>was $219 now $159</strong></a></li><li><strong>Galaxy Tab S9: </strong><a href="https://www.bestbuy.com/site/samsung-galaxy-tab-s9-11-128gb-wi-fi-with-s-pen-graphite/6546661.p?skuId=6546661" target="_blank" rel="nofollow"><strong>was $799 now $599</strong></a><strong></strong></li><li><strong>Galaxy Tab S10+: </strong><a href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-12-4-256gb-wi-fi-with-s-pen-moonstone-gray/6593196.p?skuId=6593196" target="_blank" rel="nofollow"><strong>was $999 now $879</strong></a><strong></strong></li><li><strong>Galaxy Tab S10 Ultra: </strong><a href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-ultra-14-6-512gb-wi-fi-with-s-pen-moonstone-gray/6593198.p?skuId=6593198" target="_blank" rel="nofollow"><strong>was $1,319 now $1,099</strong></a><strong></strong></li></ul><h3 class="article-body__section" id="section-best-samsung-tablet-deals"><span>Best Samsung tablet deals</span></h3><div class="product"><a data-dimension112="30d04ae6-2b1f-41c2-9d2a-8a67f210ea96" data-action="Deal Block" data-label="Galaxy Tab A9+" data-dimension48="Galaxy Tab A9+" data-dimension25="$159" href="https://www.bestbuy.com/site/samsung-galaxy-tab-a9-11-64gb-wi-fi-silver/6566193.p?skuId=6566193" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2094px;"><p class="vanilla-image-block" style="padding-top:60.65%;"><img id="3mdmia3kU3uFNStE7MJYkV" name="Screenshot 2024-11-11 at 10.41.30.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/3mdmia3kU3uFNStE7MJYkV-1920-80.png" mos="" align="middle" fullscreen="" width="2094" height="1270" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.bestbuy.com/site/samsung-galaxy-tab-a9-11-64gb-wi-fi-silver/6566193.p?skuId=6566193" target="_blank" rel="nofollow" data-dimension112="30d04ae6-2b1f-41c2-9d2a-8a67f210ea96" data-action="Deal Block" data-label="Galaxy Tab A9+" data-dimension48="Galaxy Tab A9+" data-dimension25="$159">Galaxy Tab A9+: was $219 now $159</a></strong><br>An entry-level Android tablet, the Samsung Galaxy A9+ features an 11-inch display with a 90Hz refresh rate, a long-lasting 7,040mAh battery and a snappy Qualcomm Snapdragon 695 chip. You also get 5MP front and 8MP back cameras.<a class="view-deal button" href="https://www.bestbuy.com/site/samsung-galaxy-tab-a9-11-64gb-wi-fi-silver/6566193.p?skuId=6566193" target="_blank" rel="nofollow" data-dimension112="30d04ae6-2b1f-41c2-9d2a-8a67f210ea96" data-action="Deal Block" data-label="Galaxy Tab A9+" data-dimension48="Galaxy Tab A9+" data-dimension25="$159">View Deal</a></p></div><div class="product"><a data-dimension112="ec2290ba-6d10-4c0d-aa09-f6ee146599fe" data-action="Deal Block" data-label="Galaxy Tab S10 FE+" data-dimension48="Galaxy Tab S10 FE+" data-dimension25="$599" href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-fe-13-1-128gb-wi-fi-with-s-pen-silver/6618950.p?skuId=6618950" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1080px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="6MtzjCmXKf5yE6GBQhiVZK" name="Samsung Galaxy Tab S10 FE deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6MtzjCmXKf5yE6GBQhiVZK-1920-80.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>It's only recently released, but the fantastic <a href="https://www.tomsguide.com/computing/android-tablets/samsung-galaxy-tab-s10-fe-plus-review" data-dimension112="ec2290ba-6d10-4c0d-aa09-f6ee146599fe" data-action="Deal Block" data-label="Galaxy Tab S10 FE+" data-dimension48="Galaxy Tab S10 FE+" data-dimension25="$599">Samsung Galaxy Tab S10 FE+</a> is already $50 off! Not a bad price for a mid-range tablet that comes with an S Pen stylus, a splendid (and larger) 13.1-inch LCD panel, and a 15-hour battery life. This is great value for money! <a class="view-deal button" href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-fe-13-1-128gb-wi-fi-with-s-pen-silver/6618950.p?skuId=6618950" target="_blank" rel="nofollow" data-dimension112="ec2290ba-6d10-4c0d-aa09-f6ee146599fe" data-action="Deal Block" data-label="Galaxy Tab S10 FE+" data-dimension48="Galaxy Tab S10 FE+" data-dimension25="$599">View Deal</a></p></div><div class="product"><a data-dimension112="1400f4af-1bbb-4f9a-ad73-2554ddee164d" data-action="Deal Block" data-label="Galaxy Tab S9" data-dimension48="Galaxy Tab S9" data-dimension25="$599" href="https://www.bestbuy.com/site/samsung-galaxy-tab-s9-11-128gb-wi-fi-with-s-pen-graphite/6546661.p?skuId=6546661" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:70.73%;"><img id="Cy6LrM7S3kScgNEofmJiwk" name="Samsung Galaxy Tab S9 deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Cy6LrM7S3kScgNEofmJiwk-1920-80.jpg" mos="" align="middle" fullscreen="" width="1500" height="1061" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Galaxy Tab S9 is great for watching movies and playing games. It features an 11-inch 2560 x 1600 AMOLED display, Snapdragon 8 Gen 2 chipset, 8GB of RAM, and a 128GB SSD. We also like that you can expand its storage capacity via its microSD/microSDXC card slots. <a class="view-deal button" href="https://www.bestbuy.com/site/samsung-galaxy-tab-s9-11-128gb-wi-fi-with-s-pen-graphite/6546661.p?skuId=6546661" target="_blank" rel="nofollow" data-dimension112="1400f4af-1bbb-4f9a-ad73-2554ddee164d" data-action="Deal Block" data-label="Galaxy Tab S9" data-dimension48="Galaxy Tab S9" data-dimension25="$599">View Deal</a></p></div><div class="product"><a data-dimension112="621641aa-14ff-415a-bce2-368e05077c97" data-action="Deal Block" data-label="Galaxy Tab S10+" data-dimension48="Galaxy Tab S10+" data-dimension25="$879" href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-12-4-256gb-wi-fi-with-s-pen-moonstone-gray/6593196.p?skuId=6593196" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1277px;"><p class="vanilla-image-block" style="padding-top:65.54%;"><img id="QBrEqozQwVWAZPZyeKgW4X" name="Samsung Galaxy Tab S10 Plus deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/QBrEqozQwVWAZPZyeKgW4X-1920-80.jpg" mos="" align="middle" fullscreen="" width="1277" height="837" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Samsung Galaxy Tab S10+ is the middle child in Samsung's Galaxy Tab series. It features a 12.4-inch AMOLED 2800 x 1752 display, MediaTek MT6989 CPU, 12GB of RAM, and a 256GB SSD. It includes Samsung's S-Pen, which you can use to jot down notes or sketch. <a class="view-deal button" href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-12-4-256gb-wi-fi-with-s-pen-moonstone-gray/6593196.p?skuId=6593196" target="_blank" rel="nofollow" data-dimension112="621641aa-14ff-415a-bce2-368e05077c97" data-action="Deal Block" data-label="Galaxy Tab S10+" data-dimension48="Galaxy Tab S10+" data-dimension25="$879">View Deal</a></p></div><div class="product"><a data-dimension112="58b5c0ca-6b36-4366-9797-9f4e7660ddbf" data-action="Deal Block" data-label="Galaxy Tab S10 Ultra" data-dimension48="Galaxy Tab S10 Ultra" data-dimension25="$1099" href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-ultra-14-6-512gb-wi-fi-with-s-pen-moonstone-gray/6593198.p?skuId=6593198" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="veL9bNCBbWD2yAU6jQxDia" name="Samsung Galaxy Tab S10 Ultra Deal Block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/veL9bNCBbWD2yAU6jQxDia-1920-80.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-ultra-14-6-512gb-wi-fi-with-s-pen-moonstone-gray/6593198.p?skuId=6593198" target="_blank" rel="nofollow" data-dimension112="58b5c0ca-6b36-4366-9797-9f4e7660ddbf" data-action="Deal Block" data-label="Galaxy Tab S10 Ultra" data-dimension48="Galaxy Tab S10 Ultra" data-dimension25="$1099">Galaxy Tab S10 Ultra: was $1319 now $1099</a></strong><br>Released in late 2024, the Tab S10 Ultra is as premium as Android tablets get, boasting a massive 14.6-inch Dynamic AMOLED display which has to be seen to be believed. It also features a MediaTek MT6989 chipset, 12GB of RAM, and 512GB SSD.<a class="view-deal button" href="https://www.bestbuy.com/site/samsung-galaxy-tab-s10-ultra-14-6-512gb-wi-fi-with-s-pen-moonstone-gray/6593198.p?skuId=6593198" target="_blank" rel="nofollow" data-dimension112="58b5c0ca-6b36-4366-9797-9f4e7660ddbf" data-action="Deal Block" data-label="Galaxy Tab S10 Ultra" data-dimension48="Galaxy Tab S10 Ultra" data-dimension25="$1099">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I've reviewed the OnePlus Pad 3 — and it's made me ditch my iPad ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I knew the day when I’d find an <a href="https://www.tomsguide.com/best-picks/best-android-tablets">Android tablet</a> I’d be happy to switch my iPad for would come eventually, but I was still a little surprised it’s come right now in the form of the OnePlus Pad 3.</p><p>OnePlus’ previous tablet attempts have been high quality, but a few changes made to this model have not only kept it among the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a> available today, but have propelled it to the best on the market in areas like productivity and battery longevity.</p><p>The OnePlus Pad 3 is more expensive than the company’s previous tablets, and still lacks proper biometric security. But it still undercuts even rival 11-inch tablets on price, while offering more power, battery life, and display space than ever before.</p><p>I still have some quibbles with this slate that keep it out of five-star territory, and I can’t rule out swapping back to an iPad in the future. But the OnePlus Pad 3 has proven to be the best balance of price and features you can get in Android tablets, if not all tablets, right now. And I can't wait to tell you why.</p><h3 class="article-body__section" id="section-oneplus-pad-3-specs"><span>OnePlus Pad 3: Specs</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>OnePlus Pad 3</strong>    </p></td></tr><tr><td class="firstcol " ><p><strong>Starting price</strong>    </p></td><td  ><p>£529 / $699    </p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong>    </p></td><td  ><p>13.2-inch LCD (3392 x 2400)    </p></td></tr><tr><td class="firstcol " ><p><strong>Refresh rate</strong>    </p></td><td  ><p>144Hz adaptive    </p></td></tr><tr><td class="firstcol " ><p><strong>Rear camera</strong>    </p></td><td  ><p>13MP    </p></td></tr><tr><td class="firstcol " ><p><strong>Front cameras</strong>    </p></td><td  ><p>8MP    </p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong>    </p></td><td  ><p>Snapdragon 8 Elite    </p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong>    </p></td><td  ><p>12GB/16GB    </p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong>    </p></td><td  ><p>256GB/512GB    </p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong>    </p></td><td  ><p>12,140    </p></td></tr><tr><td class="firstcol " ><p><strong>Charging</strong>    </p></td><td  ><p>80W    </p></td></tr><tr><td class="firstcol " ><p><strong>Operating system</strong>    </p></td><td  ><p>Android 15 with OxygenOS 15    </p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong>    </p></td><td  ><p>289.61 x 209.66 x 5.97 mm / 11.4 x 8.25 x 0.27 inches    </p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong>    </p></td><td  ><p>675 grams / 1.49 pounds    </p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong>    </p></td><td  ><p>Storm Blue    </p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-oneplus-pad-3-price-and-availability"><span>OnePlus Pad 3: Price and availability</span></h3><p>The new OnePlus Pad 3 costs £529 in its basic form with 12GB RAM and 256GB storage, or £599 / $699 for 16GB RAM and 512GB storage.</p><div data-model-name="OnePlus Pad 3" data-widget-type="review"></div><p>That's £100 more than the <a href="https://www.tomsguide.com/tablets/android-tablets/oneplus-pad-2-review">OnePlus Pad 2</a> from last year, I must sadly report. Plus, for some weird reason, the U.S. only has access to the more expensive edition of the Pad 3, which means it's effectively a price hike of $150 in that market.</p><p>Fortunately for OnePlus, even with these increases, the Pad 3 is still on the cheap side. For instance, the <a href="https://www.tomsguide.com/tablets/ipads/ipad-air-m3-review">13-inch iPad Air M3</a> starts at $799, the <a href="https://www.tomsguide.com/computing/android-tablets/samsung-galaxy-tab-s10-fe-plus-review">Galaxy Tab S10 FE Plus</a> at $649/£649, the <a href="https://www.tomsguide.com/tablets/android-tablets/samsung-galaxy-tab-s10-plus-review-watch-out-ipad-pro">Galaxy Tab S10 Plus</a> at $999, and the <a href="https://www.tomsguide.com/tablets/ipads/ipad-pro-2024">13-inch iPad Pro M4</a> at $1,299. The OnePlus Pad 3 costs less than all of these, yet as we'll see, it's still on a level with these other tablets.</p><h3 class="article-body__section" id="section-oneplus-pad-3-design"><span>OnePlus Pad 3: Design</span></h3><p>After two generations of the same unique design, OnePlus has fallen in line with its competitors to give the Pad 3 a new but more typical Android tablet look. The flat edges and corner camera in a pill-shaped bump are not as distinct as a round-sided tablet with a centered circular camera block, but this doesn't matter much for the tablet's usability.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Nb7SbUzq7cFNvo2W7EnZ4b" name="OnePlus-Pad-3--14" alt="OnePlus Pad 3 camera block" src="https://cdn.mos.cms.futurecdn.net/Nb7SbUzq7cFNvo2W7EnZ4b-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>What does impact the user experience is the change in size. The Pad 3 boasts a thinner profile than the Pad 2, which, while not quite as slim as the iPad Pro or the Galaxy Tab S10 Plus, is slimmer than the iPad Air or Galaxy Tab S10 FE Plus. And the display's increased in size by over an inch compared to the OnePlus Pad 2, to give you more room to work with, or play with, as you need.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="AAnXBwRWWD9zMz3smcVB4b" name="OnePlus-Pad-3--11" alt="OnePlus Pad 3 back and camera block" src="https://cdn.mos.cms.futurecdn.net/AAnXBwRWWD9zMz3smcVB4b-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Disappointingly, OnePlus still hasn't added a fingerprint scanner to the OnePlus Pad 3. It offers facial recognition, but only the vanilla kind with limited security. It's a fast method to enter the tablet, and my attempts to break in with a photo of my face were unsuccessful. But visual-only facial recognition is not secure in the way that Face ID or a fingerprint scanner are, meaning you may be better off just leaving it as a slower PIN-unlocked device if you plan to save sensitive material on your tablet.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hJvHXAH9VPZzhczgyvW87b" name="OnePlus-Pad-3--05" alt="OnePlus Pad 3 back" src="https://cdn.mos.cms.futurecdn.net/hJvHXAH9VPZzhczgyvW87b-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>OnePlus is only offering the Pad 3 in a Storm Blue colorway for Europe and North America. A Frosted Silver version exists, but that's only being sold in India. That's an unfortunate limitation to put on the more neutral color option, but the blue looks pretty classy as is.</p><h3 class="article-body__section" id="section-oneplus-pad-3-display"><span>OnePlus Pad 3: Display</span></h3><p>Having grown from 12.4 inches to 13.2 inches, the OnePlus Pad 3 is now among the largest tablets you can buy today. The display comes with a 3.4k resolution and in a practical 7:5 aspect ratio, making it a squarer, iPad-style tablet compared to the more rectangular Galaxy Tabs. This gels well with the <a href="https://www.tomsguide.com/features/i-tried-oneplus-open-multitasking-open-canvas">Open Canvas</a> multi-tasking interface, which we'll look at later.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="eUvBE2uyscgNyHq5eKkC5b" name="OnePlus-Pad-3--07" alt="OnePlus Pad 3 with keyboard and stylus" src="https://cdn.mos.cms.futurecdn.net/eUvBE2uyscgNyHq5eKkC5b-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Performance is smooth too, with a peak refresh rate of 144Hz, slightly higher than that of the 120Hz iPad Pro and Galaxy Tab S10 series. This can change between that and six other speeds with an adaptive system, although it's not fully adaptive like the LTPO technology used by Apple and Samsung, as OnePlus has stuck with a more typical LCD screen.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>OnePlus Pad 3</strong>    </p></td><td  ><p><strong>Samsung Galaxy Tab S10 Plus</strong>    </p></td><td  ><p><strong>iPad Air 2025 (11-inch)</strong>    </p></td></tr><tr><td class="firstcol " ><p><strong>Peak brightness (nits)</strong>    </p></td><td  ><p>530    </p></td><td  ><p>559    </p></td><td  ><p>486    </p></td></tr><tr><td class="firstcol " ><p><strong>sRGB color gamut coverage (%)</strong>    </p></td><td  ><p>111.4    </p></td><td  ><p>139.8    </p></td><td  ><p>117.6    </p></td></tr><tr><td class="firstcol " ><p><strong>DCI-P3 color gamut coverage (%)</strong>    </p></td><td  ><p>78.9    </p></td><td  ><p>99    </p></td><td  ><p>83.3    </p></td></tr><tr><td class="firstcol " ><p><strong>Delta-e color accuracy (lower is better)</strong>    </p></td><td  ><p>0.23    </p></td><td  ><p>0.23    </p></td><td  ><p>0.22    </p></td></tr></tbody></table></div><p>LCD puts the OnePlus Pad 3 in line with the iPad Air. As the results above show, the OnePlus wins on peak brightness while lagging behind a little on color accuracy and coverage. An OLED display would have been an enormous upgrade for OnePlus to introduce, but given the price has already increased this year, adding OLED could have driven the price up more, so sticking to LCD is probably the lesser of the two evils the Pad 3 could have ended up with.</p><h3 class="article-body__section" id="section-oneplus-pad-3-performance"><span>OnePlus Pad 3: Performance</span></h3><p>OnePlus is the first manufacturer to put the Snapdragon 8 Elite chipset, found in this year's best premium Android phones, into a tablet, and it performs just as well as I'd hoped. Check out the numbers below to see how the OnePlus Pad 3 decimates its competitors on graphics, and stays ahead of the Galaxy Tab S10 Plus on CPU performance too. I wasn't expecting the OnePlus to triumph over the iPad Air, as its M3 chip is the same found in full-fat Mac machines. But the fact that the iPad could have processed a video from 4K to 1080p almost three times over in the time the OnePlus takes to do it once may make you think twice if you want a tablet for work, depending on what your daily activities are.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>OnePlus Pad 3</strong>    </p></td><td  ><p><strong>Samsung Galaxy Tab S10 Plus</strong>    </p></td><td  ><p><strong>iPad Air 2025 (11-inch)</strong>    </p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong>    </p></td><td  ><p><strong>Snapdragon 8 Elite</strong>    </p></td><td  ><p><strong>Dimensity 9300 Plus</strong>    </p></td><td  ><p><strong>Apple M3</strong>    </p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6 score (single-core / multi-core)</strong>    </p></td><td  ><p>2,980 / 8,993    </p></td><td  ><p>2,137 / 7,130    </p></td><td  ><p>3,042 / 11,804    </p></td></tr><tr><td class="firstcol " ><p><strong>3DMark Wild Life Extreme Unlimited (score / fps)</strong>    </p></td><td  ><p>6,410 / 38.38    </p></td><td  ><p>5,121 / 30    </p></td><td  ><p>5,806 / 34.8    </p></td></tr><tr><td class="firstcol " ><p><strong>Adobe Premiere Rush time to transcode (mins:secs)</strong>    </p></td><td  ><p>0:53    </p></td><td  ><p>0:43    </p></td><td  ><p>0:18    </p></td></tr></tbody></table></div><p>This zippy performance is obvious while gaming, with a long session of Ex Astris at maximum settings looking stunning with only a couple of framerate hiccups during loading. The Pad 3's graphene-lined vapor chambers kept the temperature increase inevitable from extended gaming to the top left corner of the tablet by the camera, meaning I couldn't actually feel the tablet heat up when I was holding it horizontally.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="KijJkBHVmgoXQhgHmf6p5b" name="OnePlus-Pad-3--08" alt="OnePlus Pad 3 playing Ex Astris" src="https://cdn.mos.cms.futurecdn.net/KijJkBHVmgoXQhgHmf6p5b-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The basic OnePlus Pad 3 spec comes with 12GB RAM and 256GB storage. The higher spec, which offers 16GB RAM/512GB storage, is the only variant offered in the U.S.. That's unfortunate from a cost perspective, but on the plus side, the 16GB spec not only offers more capacity but a higher spec LPDDR5T memory type, which is faster and more power efficient than the LPDDR5x kind used in the 12GB edition and most other tablets.</p><h3 class="article-body__section" id="section-oneplus-pad-3-audio"><span>OnePlus Pad 3: Audio</span></h3><p>The OnePlus Pad 3 blows your mind with its audio without even playing anything, simply because it features an octo-speaker set-up, doubling the usual quad-speaker arrangement that many premium tablets have. This gives anything you play through the Pad 3 an amazingly wide soundstage effect, and also enables a neat feature called Holo Audio.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="sCcmWoioSibtVM37TDhn5b" name="OnePlus-Pad-3--04" alt="OnePlus Pad 3 Holo Audio" src="https://cdn.mos.cms.futurecdn.net/sCcmWoioSibtVM37TDhn5b-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Holo Audio lets the tablet pipe certain kinds of sound in specific directions to help you pick them out more clearly from other sounds. So while your music or video audio would come at you as if from the centre of the OnePlus Pad 3, you can have ongoing voice calls come in from the left, and notifications from the right to help you perceive these as three separate sources and deal with them accordingly. This works both through the Pad 3's speakers or through headphones, and can be left on automatic or customized in surprising depth if you want.</p><p>However, I have to dock points from the OnePlus Pad 3 for being the least bassy tablet I've ever tested. Compared to the Galaxy Tab S10 Plus, the OnePlus did help separate out the instruments and vocals in the thrilling track "Carpe Diem" from the Guilty Gear: Strive soundtrack more effectively, making Naoki's snarling vocals easier to hear. But anything from the bass guitar or the lower registers of the lead guitar or synth was almost completely lost.</p><h3 class="article-body__section" id="section-oneplus-pad-3-battery-and-charging"><span>OnePlus Pad 3: Battery and charging</span></h3><p>I expected nothing less than excellent from the OnePlus Pad 3's battery, given this is an area of focus for every one of the company's devices. And sure enough, with a new 12,140 mAh battery (about 27% larger than the Pad 2's) and an upgraded chipset, the Pad 3 lasted an astonishing 16 hours and 21 minutes in adaptive refresh rate mode on the TG custom battery test.</p><p>First off, this is a good improvement on the 14 hours and 8 minutes that the OnePlus Pad 2 managed. It also beats the 15 hours and 43 minutes managed by the Galaxy Tab S10 FE Plus, and utterly thrashed the Galaxy Tab S10 Plus, which lasted almost half as long at 8 hours and 22 minutes. Even the otherwise fantastic 13-inch iPad Pro M4 is shown up, with its 13 hours and 13 minutes result still hours behind the OnePlus.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mZTctMwBdraxVTmxdJbA4b" name="OnePlus-Pad-3--13" alt="OnePlus Pad 3 back and camera block" src="https://cdn.mos.cms.futurecdn.net/mZTctMwBdraxVTmxdJbA4b-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>OnePlus gave the Pad 3 80W charging, up from 67W on the previous model, but you'll need to buy the charger separately in Europe in order to use it. Fortunately, our U.S. testing model came with the charger, so we were able to test how fast it fills the tablet.</p><p>We recorded the OnePlus Pad 3 charging to 20% in 15 minutes and 34% in 30 minutes in our lab, similar to the OnePlus Pad 2. This is slower in terms of percentage than the 40% the Tab S10 Plus manages, but that seems fair given the extra capacity of the OnePlus slate.</p><h3 class="article-body__section" id="section-oneplus-pad-3-cameras"><span>OnePlus Pad 3: Cameras</span></h3><p>The OnePlus Pad 3's cameras have remained the same as the Pad 2's - a 13MP rear camera and an 8MP front camera.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/A2L9rv7NaupjKbdSvsZn9b-1920-80.jpg" alt="OnePlus Pad 3 main camera sample" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/xmEMC2iZwSTNUiFWs7ij9b-1920-80.jpg" alt="OnePlus Pad 3 main camera comparison, taken with Samsung Galaxy Tab S10 Plus" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure></figure><p>Tablet cameras aren't meant to be a user's primary camera, but even still, I'd rather take my photos with the warmer-toned OnePlus Pad 3 than the Galaxy Tab S10 Plus — everything just looks more inviting through its lenses. Then again, Samsung's more natural coloring and greater contrast do help elements like the wood grain of these shelves, which is perhaps ideal if your video calls involve showing off more than just your pretty face.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/D5uUggt4NuYoPJVQbtNN8b-1920-80.jpg" alt="OnePlus Pad 3 selfie camera sample" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/iYWZYMguzeXD8YG7iqYF6b-1920-80.jpg" alt="OnePlus Pad 3 selfie comparison, taken with Samsung Galaxy Tab S10 Plus" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure></figure><h3 class="article-body__section" id="section-oneplus-pad-3-accessories"><span>OnePlus Pad 3: Accessories</span></h3><p>There's a mix of old and new with the first-party accessories for the OnePlus Pad 3. The headliner this year is an updated $199 / £169 keyboard case, comes in two parts, with an adjustable kickstand section and a separate lower deck if you want to leave the keyboard behind.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JGfb2vW9nRLYzVkBp2Es4b" name="OnePlus-Pad-3--15" alt="OnePlus Pad 3 in keyboard case" src="https://cdn.mos.cms.futurecdn.net/JGfb2vW9nRLYzVkBp2Es4b-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The new keyboard case offers larger keys compared to OnePlus' previous keyboard cases, and the pogo pin connector is now much flatter, attaching to the back of the tablet for an easier time positioning and transporting the tablet and keyboard together. But there's one important detail to highlight here: OnePlus' new keyboard has both Bluetooth and physical pogo pin connection options in the U.S., but due to regulatory differences, there is no Bluetooth in Europe, including the U.K. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rERNCETcrrXbnXe5yZBS6b" name="OnePlus-Pad-3--09" alt="OnePlus Pad 3 Keyboard" src="https://cdn.mos.cms.futurecdn.net/rERNCETcrrXbnXe5yZBS6b-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>This is likely why there's a larger price difference between the prices for this accessory in USD and GBP. And it also unfortunately means one of the most unique parts of OnePlus' keyboard is locked off for a large number of users.</p><p>I didn't get to try the new $49 / £59 folio case, but it looks like a smart option for users who don't need to do large amounts of typing on their tablet, or value the option to stand the Pad 3 both vertically and horizontally at a variety of angles. This also comes with a magnetized fastener to keep the folio closed and your stylus in place, something lacking from the keyboard case.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GUNQTVRAtczVGKbK5F485b" name="OnePlus-Pad-3--10" alt="OnePlus Pad 3 writing with Stylo 2" src="https://cdn.mos.cms.futurecdn.net/GUNQTVRAtczVGKbK5F485b-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Speaking of the stylus, the $99 / £99 OnePlus Stylo 2 is carried over from the OnePlus Pad 2 last year. It's a responsive input method, and the haptic feedback helps make writing on the smooth screen feel like a blend of the solid-tipped Apple Pencil and the rubber-tipped S Pen included with Samsung tablets. But I really wish that the magnetic connection between the Stylo and the Pad 3 could be stronger, as I'd regularly knock the stylus off the tablet when putting it in or taking it out of my bag. This still happens when I have a Galaxy Tab or iPad, but not quite so frequently.</p><h3 class="article-body__section" id="section-oneplus-pad-3-software-and-ai-features"><span>OnePlus Pad 3: Software and AI features</span></h3><p>OnePlus' OxygenOS 15 skin for Android 15 works excellently on phones, and makes just as much sense when blown up for a tablet screen. OnePlus adds a taskbar with a recent files and app drawer built-in to help navigation, and lets you use some apps in a two-pane view for easier navigation, two sensible additions for a large tablet screen.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="sHv4ggDShpVKtcseAMnY4b" name="OnePlus-Pad-3--06" alt="OnePlus Pad 3 interface" src="https://cdn.mos.cms.futurecdn.net/sHv4ggDShpVKtcseAMnY4b-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p><a href="https://www.tomsguide.com/features/i-tried-oneplus-open-multitasking-open-canvas">Open Canvas</a> is back again to provide the best multitasking experience on any tablet right now, letting users set up up to three apps in a flexible interface that lets you keep them at your preferred size, switching your view as needed. The Pad 3 also makes suggested pairings if you keep switching between apps frequently, reminding you to take advantage of the feature.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="R6qvYbi6AJbUMPGvMNxd5b" name="OnePlus-Pad-3--03" alt="OnePlus Pad 3 Open Canvas" src="https://cdn.mos.cms.futurecdn.net/R6qvYbi6AJbUMPGvMNxd5b-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>New to the Pad 3 are some improved connectivity options with other devices. You can now share files with OnePlus phones and mirror their screens too, if you want to keep your eyes on your tablet screen only. But, as we saw OnePlus' stablemate Oppo introduce on the <a href="https://www.tomsguide.com/phones/android-phones/oppo-find-n5-review-simply-superior">Find N5</a> foldable a few months back, the OnePlus Pad 3 also allows an unexpected level of collaboration with Apple made gadgets, using its O+ Connect app to enable file sharing between the tablet and iPhones, iPads and Macs, along with the Mac Remote Control feature to use your laptop or desktop and its apps and files securely from anywhere with an internet connection. It takes a bit of setting up, but I have no doubt it could prove invaluable to Mac users in a pinch. Plus, it's something that iPads have no way of matching, outside of hoping you saved your files in iCloud.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mQMn7B8cTF8LYR3onTu27b" name="OnePlus-Pad-3--02" alt="OnePlus Pad 3 using Mac Remote Control" src="https://cdn.mos.cms.futurecdn.net/mQMn7B8cTF8LYR3onTu27b-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>On the AI front, the OnePlus Pad 3 has standard features like summaries, text generation, translation, all in a toolbar that you can quickly access with a swipe in from the side of the tablet at any time, as well as dedicated buttons for these abilities in relevant apps. Circle to Search and Gemini are here too for Google-powered image searches and AI requests.</p><p>This has all been pretty positive so far, but there is one unfortunate element of the OnePlus Pad 3's software — the support window. It's been guaranteed 3 Android upgrades and 6 years of security updates, two more years of security compared to the OnePlus Pad 2. However, this is not in line with the five or so years of OS updates that iPads normally get, or the seven and six years of full updates that Samsung guarantees for the Tab S10 and Tab S10 FE series, respectively.</p><h3 class="article-body__section" id="section-oneplus-pad-3-review-verdict"><span>OnePlus Pad 3 review: Verdict</span></h3><p>I genuinely think the OnePlus Pad 3 would be a strong fit for basically any user with the budget for an upper-end tablet. Even Mac or iPhone owners who might default to an iPad could still be swayed by the Pad 3 thanks to its O+ Connect integrations with Apple devices. And anyone invested in Android or Windows-powered machines will have just as good a time passing files and controlling their apps via the Pad 3.</p><p>Granted, the OnePlus Pad 3's display is good, but Samsung's OLED tablets and the Tandem OLED iPad Pro are still superior. The iPad Air is more powerful, but it costs quite a bit more. And OnePlus' continued lack of biometric security baffles me. But for multitasking, battery life, and overall value, the OnePlus Pad 3 is an outstanding tablet, one of the best tablets you can buy today, and is going to stick by my side as my slate of choice long after this review is published.</p><div data-model-name="OnePlus Pad 3" data-widget-type="review"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/android-tablets/oneplus-pad-3</link>
                                                                            <description>
                            <![CDATA[ The OnePlus Pad 3 is the Android answer to the iPad Air, doing the same or more but for less money, with only minimal downsides. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">zJWzqZHvKVaag7bjg7dwtU</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/JqZC89gCMYRB9AqiRSBv3b-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 05 Jun 2025 12:00:00 +0000</pubDate>                                                                                                                                <updated>Thu, 04 Jun 2026 12:51:40 +0000</updated>
                                                                                                                                            <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></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-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Richard is a writer based in London, covering 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&amp;#39;s features with similar devices&amp;#39;, and figure out if something&amp;#39;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&amp;#39;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&amp;#39;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&amp;#39;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/JqZC89gCMYRB9AqiRSBv3b-1920-80.jpg">
                                                            <media:credit><![CDATA[ Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[OnePlus Pad 3 on granite worktop, on home screen]]></media:description>                                                            <media:text><![CDATA[OnePlus Pad 3 on granite worktop, on home screen]]></media:text>
                                <media:title type="plain"><![CDATA[OnePlus Pad 3 on granite worktop, on home screen]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/JqZC89gCMYRB9AqiRSBv3b-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I knew the day when I’d find an <a href="https://www.tomsguide.com/best-picks/best-android-tablets">Android tablet</a> I’d be happy to switch my iPad for would come eventually, but I was still a little surprised it’s come right now in the form of the OnePlus Pad 3.</p><p>OnePlus’ previous tablet attempts have been high quality, but a few changes made to this model have not only kept it among the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a> available today, but have propelled it to the best on the market in areas like productivity and battery longevity.</p><p>The OnePlus Pad 3 is more expensive than the company’s previous tablets, and still lacks proper biometric security. But it still undercuts even rival 11-inch tablets on price, while offering more power, battery life, and display space than ever before.</p><p>I still have some quibbles with this slate that keep it out of five-star territory, and I can’t rule out swapping back to an iPad in the future. But the OnePlus Pad 3 has proven to be the best balance of price and features you can get in Android tablets, if not all tablets, right now. And I can't wait to tell you why.</p><h3 class="article-body__section" id="section-oneplus-pad-3-specs"><span>OnePlus Pad 3: Specs</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>OnePlus Pad 3</strong>    </p></td></tr><tr><td class="firstcol " ><p><strong>Starting price</strong>    </p></td><td  ><p>£529 / $699    </p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong>    </p></td><td  ><p>13.2-inch LCD (3392 x 2400)    </p></td></tr><tr><td class="firstcol " ><p><strong>Refresh rate</strong>    </p></td><td  ><p>144Hz adaptive    </p></td></tr><tr><td class="firstcol " ><p><strong>Rear camera</strong>    </p></td><td  ><p>13MP    </p></td></tr><tr><td class="firstcol " ><p><strong>Front cameras</strong>    </p></td><td  ><p>8MP    </p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong>    </p></td><td  ><p>Snapdragon 8 Elite    </p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong>    </p></td><td  ><p>12GB/16GB    </p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong>    </p></td><td  ><p>256GB/512GB    </p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong>    </p></td><td  ><p>12,140    </p></td></tr><tr><td class="firstcol " ><p><strong>Charging</strong>    </p></td><td  ><p>80W    </p></td></tr><tr><td class="firstcol " ><p><strong>Operating system</strong>    </p></td><td  ><p>Android 15 with OxygenOS 15    </p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong>    </p></td><td  ><p>289.61 x 209.66 x 5.97 mm / 11.4 x 8.25 x 0.27 inches    </p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong>    </p></td><td  ><p>675 grams / 1.49 pounds    </p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong>    </p></td><td  ><p>Storm Blue    </p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-oneplus-pad-3-price-and-availability"><span>OnePlus Pad 3: Price and availability</span></h3><p>The new OnePlus Pad 3 costs £529 in its basic form with 12GB RAM and 256GB storage, or £599 / $699 for 16GB RAM and 512GB storage.</p><div data-model-name="OnePlus Pad 3" data-widget-type="review"></div><p>That's £100 more than the <a href="https://www.tomsguide.com/tablets/android-tablets/oneplus-pad-2-review">OnePlus Pad 2</a> from last year, I must sadly report. Plus, for some weird reason, the U.S. only has access to the more expensive edition of the Pad 3, which means it's effectively a price hike of $150 in that market.</p><p>Fortunately for OnePlus, even with these increases, the Pad 3 is still on the cheap side. For instance, the <a href="https://www.tomsguide.com/tablets/ipads/ipad-air-m3-review">13-inch iPad Air M3</a> starts at $799, the <a href="https://www.tomsguide.com/computing/android-tablets/samsung-galaxy-tab-s10-fe-plus-review">Galaxy Tab S10 FE Plus</a> at $649/£649, the <a href="https://www.tomsguide.com/tablets/android-tablets/samsung-galaxy-tab-s10-plus-review-watch-out-ipad-pro">Galaxy Tab S10 Plus</a> at $999, and the <a href="https://www.tomsguide.com/tablets/ipads/ipad-pro-2024">13-inch iPad Pro M4</a> at $1,299. The OnePlus Pad 3 costs less than all of these, yet as we'll see, it's still on a level with these other tablets.</p><h3 class="article-body__section" id="section-oneplus-pad-3-design"><span>OnePlus Pad 3: Design</span></h3><p>After two generations of the same unique design, OnePlus has fallen in line with its competitors to give the Pad 3 a new but more typical Android tablet look. The flat edges and corner camera in a pill-shaped bump are not as distinct as a round-sided tablet with a centered circular camera block, but this doesn't matter much for the tablet's usability.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Nb7SbUzq7cFNvo2W7EnZ4b" name="OnePlus-Pad-3--14" alt="OnePlus Pad 3 camera block" src="https://cdn.mos.cms.futurecdn.net/Nb7SbUzq7cFNvo2W7EnZ4b-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>What does impact the user experience is the change in size. The Pad 3 boasts a thinner profile than the Pad 2, which, while not quite as slim as the iPad Pro or the Galaxy Tab S10 Plus, is slimmer than the iPad Air or Galaxy Tab S10 FE Plus. And the display's increased in size by over an inch compared to the OnePlus Pad 2, to give you more room to work with, or play with, as you need.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="AAnXBwRWWD9zMz3smcVB4b" name="OnePlus-Pad-3--11" alt="OnePlus Pad 3 back and camera block" src="https://cdn.mos.cms.futurecdn.net/AAnXBwRWWD9zMz3smcVB4b-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Disappointingly, OnePlus still hasn't added a fingerprint scanner to the OnePlus Pad 3. It offers facial recognition, but only the vanilla kind with limited security. It's a fast method to enter the tablet, and my attempts to break in with a photo of my face were unsuccessful. But visual-only facial recognition is not secure in the way that Face ID or a fingerprint scanner are, meaning you may be better off just leaving it as a slower PIN-unlocked device if you plan to save sensitive material on your tablet.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hJvHXAH9VPZzhczgyvW87b" name="OnePlus-Pad-3--05" alt="OnePlus Pad 3 back" src="https://cdn.mos.cms.futurecdn.net/hJvHXAH9VPZzhczgyvW87b-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>OnePlus is only offering the Pad 3 in a Storm Blue colorway for Europe and North America. A Frosted Silver version exists, but that's only being sold in India. That's an unfortunate limitation to put on the more neutral color option, but the blue looks pretty classy as is.</p><h3 class="article-body__section" id="section-oneplus-pad-3-display"><span>OnePlus Pad 3: Display</span></h3><p>Having grown from 12.4 inches to 13.2 inches, the OnePlus Pad 3 is now among the largest tablets you can buy today. The display comes with a 3.4k resolution and in a practical 7:5 aspect ratio, making it a squarer, iPad-style tablet compared to the more rectangular Galaxy Tabs. This gels well with the <a href="https://www.tomsguide.com/features/i-tried-oneplus-open-multitasking-open-canvas">Open Canvas</a> multi-tasking interface, which we'll look at later.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="eUvBE2uyscgNyHq5eKkC5b" name="OnePlus-Pad-3--07" alt="OnePlus Pad 3 with keyboard and stylus" src="https://cdn.mos.cms.futurecdn.net/eUvBE2uyscgNyHq5eKkC5b-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Performance is smooth too, with a peak refresh rate of 144Hz, slightly higher than that of the 120Hz iPad Pro and Galaxy Tab S10 series. This can change between that and six other speeds with an adaptive system, although it's not fully adaptive like the LTPO technology used by Apple and Samsung, as OnePlus has stuck with a more typical LCD screen.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>OnePlus Pad 3</strong>    </p></td><td  ><p><strong>Samsung Galaxy Tab S10 Plus</strong>    </p></td><td  ><p><strong>iPad Air 2025 (11-inch)</strong>    </p></td></tr><tr><td class="firstcol " ><p><strong>Peak brightness (nits)</strong>    </p></td><td  ><p>530    </p></td><td  ><p>559    </p></td><td  ><p>486    </p></td></tr><tr><td class="firstcol " ><p><strong>sRGB color gamut coverage (%)</strong>    </p></td><td  ><p>111.4    </p></td><td  ><p>139.8    </p></td><td  ><p>117.6    </p></td></tr><tr><td class="firstcol " ><p><strong>DCI-P3 color gamut coverage (%)</strong>    </p></td><td  ><p>78.9    </p></td><td  ><p>99    </p></td><td  ><p>83.3    </p></td></tr><tr><td class="firstcol " ><p><strong>Delta-e color accuracy (lower is better)</strong>    </p></td><td  ><p>0.23    </p></td><td  ><p>0.23    </p></td><td  ><p>0.22    </p></td></tr></tbody></table></div><p>LCD puts the OnePlus Pad 3 in line with the iPad Air. As the results above show, the OnePlus wins on peak brightness while lagging behind a little on color accuracy and coverage. An OLED display would have been an enormous upgrade for OnePlus to introduce, but given the price has already increased this year, adding OLED could have driven the price up more, so sticking to LCD is probably the lesser of the two evils the Pad 3 could have ended up with.</p><h3 class="article-body__section" id="section-oneplus-pad-3-performance"><span>OnePlus Pad 3: Performance</span></h3><p>OnePlus is the first manufacturer to put the Snapdragon 8 Elite chipset, found in this year's best premium Android phones, into a tablet, and it performs just as well as I'd hoped. Check out the numbers below to see how the OnePlus Pad 3 decimates its competitors on graphics, and stays ahead of the Galaxy Tab S10 Plus on CPU performance too. I wasn't expecting the OnePlus to triumph over the iPad Air, as its M3 chip is the same found in full-fat Mac machines. But the fact that the iPad could have processed a video from 4K to 1080p almost three times over in the time the OnePlus takes to do it once may make you think twice if you want a tablet for work, depending on what your daily activities are.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>OnePlus Pad 3</strong>    </p></td><td  ><p><strong>Samsung Galaxy Tab S10 Plus</strong>    </p></td><td  ><p><strong>iPad Air 2025 (11-inch)</strong>    </p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong>    </p></td><td  ><p><strong>Snapdragon 8 Elite</strong>    </p></td><td  ><p><strong>Dimensity 9300 Plus</strong>    </p></td><td  ><p><strong>Apple M3</strong>    </p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6 score (single-core / multi-core)</strong>    </p></td><td  ><p>2,980 / 8,993    </p></td><td  ><p>2,137 / 7,130    </p></td><td  ><p>3,042 / 11,804    </p></td></tr><tr><td class="firstcol " ><p><strong>3DMark Wild Life Extreme Unlimited (score / fps)</strong>    </p></td><td  ><p>6,410 / 38.38    </p></td><td  ><p>5,121 / 30    </p></td><td  ><p>5,806 / 34.8    </p></td></tr><tr><td class="firstcol " ><p><strong>Adobe Premiere Rush time to transcode (mins:secs)</strong>    </p></td><td  ><p>0:53    </p></td><td  ><p>0:43    </p></td><td  ><p>0:18    </p></td></tr></tbody></table></div><p>This zippy performance is obvious while gaming, with a long session of Ex Astris at maximum settings looking stunning with only a couple of framerate hiccups during loading. The Pad 3's graphene-lined vapor chambers kept the temperature increase inevitable from extended gaming to the top left corner of the tablet by the camera, meaning I couldn't actually feel the tablet heat up when I was holding it horizontally.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="KijJkBHVmgoXQhgHmf6p5b" name="OnePlus-Pad-3--08" alt="OnePlus Pad 3 playing Ex Astris" src="https://cdn.mos.cms.futurecdn.net/KijJkBHVmgoXQhgHmf6p5b-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The basic OnePlus Pad 3 spec comes with 12GB RAM and 256GB storage. The higher spec, which offers 16GB RAM/512GB storage, is the only variant offered in the U.S.. That's unfortunate from a cost perspective, but on the plus side, the 16GB spec not only offers more capacity but a higher spec LPDDR5T memory type, which is faster and more power efficient than the LPDDR5x kind used in the 12GB edition and most other tablets.</p><h3 class="article-body__section" id="section-oneplus-pad-3-audio"><span>OnePlus Pad 3: Audio</span></h3><p>The OnePlus Pad 3 blows your mind with its audio without even playing anything, simply because it features an octo-speaker set-up, doubling the usual quad-speaker arrangement that many premium tablets have. This gives anything you play through the Pad 3 an amazingly wide soundstage effect, and also enables a neat feature called Holo Audio.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="sCcmWoioSibtVM37TDhn5b" name="OnePlus-Pad-3--04" alt="OnePlus Pad 3 Holo Audio" src="https://cdn.mos.cms.futurecdn.net/sCcmWoioSibtVM37TDhn5b-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Holo Audio lets the tablet pipe certain kinds of sound in specific directions to help you pick them out more clearly from other sounds. So while your music or video audio would come at you as if from the centre of the OnePlus Pad 3, you can have ongoing voice calls come in from the left, and notifications from the right to help you perceive these as three separate sources and deal with them accordingly. This works both through the Pad 3's speakers or through headphones, and can be left on automatic or customized in surprising depth if you want.</p><p>However, I have to dock points from the OnePlus Pad 3 for being the least bassy tablet I've ever tested. Compared to the Galaxy Tab S10 Plus, the OnePlus did help separate out the instruments and vocals in the thrilling track "Carpe Diem" from the Guilty Gear: Strive soundtrack more effectively, making Naoki's snarling vocals easier to hear. But anything from the bass guitar or the lower registers of the lead guitar or synth was almost completely lost.</p><h3 class="article-body__section" id="section-oneplus-pad-3-battery-and-charging"><span>OnePlus Pad 3: Battery and charging</span></h3><p>I expected nothing less than excellent from the OnePlus Pad 3's battery, given this is an area of focus for every one of the company's devices. And sure enough, with a new 12,140 mAh battery (about 27% larger than the Pad 2's) and an upgraded chipset, the Pad 3 lasted an astonishing 16 hours and 21 minutes in adaptive refresh rate mode on the TG custom battery test.</p><p>First off, this is a good improvement on the 14 hours and 8 minutes that the OnePlus Pad 2 managed. It also beats the 15 hours and 43 minutes managed by the Galaxy Tab S10 FE Plus, and utterly thrashed the Galaxy Tab S10 Plus, which lasted almost half as long at 8 hours and 22 minutes. Even the otherwise fantastic 13-inch iPad Pro M4 is shown up, with its 13 hours and 13 minutes result still hours behind the OnePlus.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mZTctMwBdraxVTmxdJbA4b" name="OnePlus-Pad-3--13" alt="OnePlus Pad 3 back and camera block" src="https://cdn.mos.cms.futurecdn.net/mZTctMwBdraxVTmxdJbA4b-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>OnePlus gave the Pad 3 80W charging, up from 67W on the previous model, but you'll need to buy the charger separately in Europe in order to use it. Fortunately, our U.S. testing model came with the charger, so we were able to test how fast it fills the tablet.</p><p>We recorded the OnePlus Pad 3 charging to 20% in 15 minutes and 34% in 30 minutes in our lab, similar to the OnePlus Pad 2. This is slower in terms of percentage than the 40% the Tab S10 Plus manages, but that seems fair given the extra capacity of the OnePlus slate.</p><h3 class="article-body__section" id="section-oneplus-pad-3-cameras"><span>OnePlus Pad 3: Cameras</span></h3><p>The OnePlus Pad 3's cameras have remained the same as the Pad 2's - a 13MP rear camera and an 8MP front camera.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/A2L9rv7NaupjKbdSvsZn9b-1920-80.jpg" alt="OnePlus Pad 3 main camera sample" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/xmEMC2iZwSTNUiFWs7ij9b-1920-80.jpg" alt="OnePlus Pad 3 main camera comparison, taken with Samsung Galaxy Tab S10 Plus" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure></figure><p>Tablet cameras aren't meant to be a user's primary camera, but even still, I'd rather take my photos with the warmer-toned OnePlus Pad 3 than the Galaxy Tab S10 Plus — everything just looks more inviting through its lenses. Then again, Samsung's more natural coloring and greater contrast do help elements like the wood grain of these shelves, which is perhaps ideal if your video calls involve showing off more than just your pretty face.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/D5uUggt4NuYoPJVQbtNN8b-1920-80.jpg" alt="OnePlus Pad 3 selfie camera sample" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/iYWZYMguzeXD8YG7iqYF6b-1920-80.jpg" alt="OnePlus Pad 3 selfie comparison, taken with Samsung Galaxy Tab S10 Plus" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure></figure><h3 class="article-body__section" id="section-oneplus-pad-3-accessories"><span>OnePlus Pad 3: Accessories</span></h3><p>There's a mix of old and new with the first-party accessories for the OnePlus Pad 3. The headliner this year is an updated $199 / £169 keyboard case, comes in two parts, with an adjustable kickstand section and a separate lower deck if you want to leave the keyboard behind.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JGfb2vW9nRLYzVkBp2Es4b" name="OnePlus-Pad-3--15" alt="OnePlus Pad 3 in keyboard case" src="https://cdn.mos.cms.futurecdn.net/JGfb2vW9nRLYzVkBp2Es4b-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The new keyboard case offers larger keys compared to OnePlus' previous keyboard cases, and the pogo pin connector is now much flatter, attaching to the back of the tablet for an easier time positioning and transporting the tablet and keyboard together. But there's one important detail to highlight here: OnePlus' new keyboard has both Bluetooth and physical pogo pin connection options in the U.S., but due to regulatory differences, there is no Bluetooth in Europe, including the U.K. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rERNCETcrrXbnXe5yZBS6b" name="OnePlus-Pad-3--09" alt="OnePlus Pad 3 Keyboard" src="https://cdn.mos.cms.futurecdn.net/rERNCETcrrXbnXe5yZBS6b-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>This is likely why there's a larger price difference between the prices for this accessory in USD and GBP. And it also unfortunately means one of the most unique parts of OnePlus' keyboard is locked off for a large number of users.</p><p>I didn't get to try the new $49 / £59 folio case, but it looks like a smart option for users who don't need to do large amounts of typing on their tablet, or value the option to stand the Pad 3 both vertically and horizontally at a variety of angles. This also comes with a magnetized fastener to keep the folio closed and your stylus in place, something lacking from the keyboard case.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GUNQTVRAtczVGKbK5F485b" name="OnePlus-Pad-3--10" alt="OnePlus Pad 3 writing with Stylo 2" src="https://cdn.mos.cms.futurecdn.net/GUNQTVRAtczVGKbK5F485b-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Speaking of the stylus, the $99 / £99 OnePlus Stylo 2 is carried over from the OnePlus Pad 2 last year. It's a responsive input method, and the haptic feedback helps make writing on the smooth screen feel like a blend of the solid-tipped Apple Pencil and the rubber-tipped S Pen included with Samsung tablets. But I really wish that the magnetic connection between the Stylo and the Pad 3 could be stronger, as I'd regularly knock the stylus off the tablet when putting it in or taking it out of my bag. This still happens when I have a Galaxy Tab or iPad, but not quite so frequently.</p><h3 class="article-body__section" id="section-oneplus-pad-3-software-and-ai-features"><span>OnePlus Pad 3: Software and AI features</span></h3><p>OnePlus' OxygenOS 15 skin for Android 15 works excellently on phones, and makes just as much sense when blown up for a tablet screen. OnePlus adds a taskbar with a recent files and app drawer built-in to help navigation, and lets you use some apps in a two-pane view for easier navigation, two sensible additions for a large tablet screen.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="sHv4ggDShpVKtcseAMnY4b" name="OnePlus-Pad-3--06" alt="OnePlus Pad 3 interface" src="https://cdn.mos.cms.futurecdn.net/sHv4ggDShpVKtcseAMnY4b-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p><a href="https://www.tomsguide.com/features/i-tried-oneplus-open-multitasking-open-canvas">Open Canvas</a> is back again to provide the best multitasking experience on any tablet right now, letting users set up up to three apps in a flexible interface that lets you keep them at your preferred size, switching your view as needed. The Pad 3 also makes suggested pairings if you keep switching between apps frequently, reminding you to take advantage of the feature.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="R6qvYbi6AJbUMPGvMNxd5b" name="OnePlus-Pad-3--03" alt="OnePlus Pad 3 Open Canvas" src="https://cdn.mos.cms.futurecdn.net/R6qvYbi6AJbUMPGvMNxd5b-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>New to the Pad 3 are some improved connectivity options with other devices. You can now share files with OnePlus phones and mirror their screens too, if you want to keep your eyes on your tablet screen only. But, as we saw OnePlus' stablemate Oppo introduce on the <a href="https://www.tomsguide.com/phones/android-phones/oppo-find-n5-review-simply-superior">Find N5</a> foldable a few months back, the OnePlus Pad 3 also allows an unexpected level of collaboration with Apple made gadgets, using its O+ Connect app to enable file sharing between the tablet and iPhones, iPads and Macs, along with the Mac Remote Control feature to use your laptop or desktop and its apps and files securely from anywhere with an internet connection. It takes a bit of setting up, but I have no doubt it could prove invaluable to Mac users in a pinch. Plus, it's something that iPads have no way of matching, outside of hoping you saved your files in iCloud.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mQMn7B8cTF8LYR3onTu27b" name="OnePlus-Pad-3--02" alt="OnePlus Pad 3 using Mac Remote Control" src="https://cdn.mos.cms.futurecdn.net/mQMn7B8cTF8LYR3onTu27b-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>On the AI front, the OnePlus Pad 3 has standard features like summaries, text generation, translation, all in a toolbar that you can quickly access with a swipe in from the side of the tablet at any time, as well as dedicated buttons for these abilities in relevant apps. Circle to Search and Gemini are here too for Google-powered image searches and AI requests.</p><p>This has all been pretty positive so far, but there is one unfortunate element of the OnePlus Pad 3's software — the support window. It's been guaranteed 3 Android upgrades and 6 years of security updates, two more years of security compared to the OnePlus Pad 2. However, this is not in line with the five or so years of OS updates that iPads normally get, or the seven and six years of full updates that Samsung guarantees for the Tab S10 and Tab S10 FE series, respectively.</p><h3 class="article-body__section" id="section-oneplus-pad-3-review-verdict"><span>OnePlus Pad 3 review: Verdict</span></h3><p>I genuinely think the OnePlus Pad 3 would be a strong fit for basically any user with the budget for an upper-end tablet. Even Mac or iPhone owners who might default to an iPad could still be swayed by the Pad 3 thanks to its O+ Connect integrations with Apple devices. And anyone invested in Android or Windows-powered machines will have just as good a time passing files and controlling their apps via the Pad 3.</p><p>Granted, the OnePlus Pad 3's display is good, but Samsung's OLED tablets and the Tandem OLED iPad Pro are still superior. The iPad Air is more powerful, but it costs quite a bit more. And OnePlus' continued lack of biometric security baffles me. But for multitasking, battery life, and overall value, the OnePlus Pad 3 is an outstanding tablet, one of the best tablets you can buy today, and is going to stick by my side as my slate of choice long after this review is published.</p><div data-model-name="OnePlus Pad 3" data-widget-type="review"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tested the Galaxy Tab S10 FE Plus — great value, premium feel ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Coming from a line of tablets that have let us down in the past, the Samsung Galaxy Tab S10 Plus FE has turned things around to show that Samsung can do cheaper tablets just as well as premium ones, while making forgivable sacrifices to keep the cost down.</p><p>Offering a larger screen than the more premium <a href="https://www.tomsguide.com/tablets/android-tablets/samsung-galaxy-tab-s10-plus-review-watch-out-ipad-pro">Samsung Galaxy Tab S10 Plus</a>, but with better battery life and only one less year of update support, the Galaxy Tab S10 FE Plus is Samsung's answer to the <a href="https://www.tomsguide.com/tablets/ipads/ipad-air-m3-review">iPad Air</a>, which we rank as one of the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a>. But unlike the <a href="https://www.tomsguide.com/tablets/android-tablets/oneplus-pad-2-review">OnePlus Pad 2</a>, our current top player for the <a href="https://www.tomsguide.com/best-picks/best-android-tablets">best Android tablets</a>, the Tab S10 FE Plus is not focused on power, even if it is just as practical for light workloads.</p><p>It's a huge but portable slate that can be a brilliant addition to anyone who finds flagship chipsets or the latest AI features unnecessary distractions from their main goals of note-taking, drawing or streaming video.</p><p>I've enjoyed my time with the Samsung Galaxy Tab S10 Plus a whole lot, even though I know there are more potent tablets I could use instead. You'll see why I don't mind the power gap, enjoy the surprising ways it beats far more expensive tablets and how well it plays early ‘00s British rap if you read on.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-fe-plus-specs"><span>Samsung Galaxy Tab S10 FE Plus: Specs</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Samsung Galaxy Tab S10 FE Plus (starting)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$649/£649/AU$1,299</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>13.1-inch LCD</p></td></tr><tr><td class="firstcol " ><p><strong>Refresh rate</strong></p></td><td  ><p>90Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Rear cameras</strong></p></td><td  ><p>13MP main</p></td></tr><tr><td class="firstcol " ><p><strong>Front cameras</strong></p></td><td  ><p>12MP selfie</p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong></p></td><td  ><p>Exynos 1580</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>8GB, 12GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>128GB, 256GB, microSD support up to 2TB</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>10,090 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Charging</strong></p></td><td  ><p>45W wired</p></td></tr><tr><td class="firstcol " ><p><strong>Operating system</strong></p></td><td  ><p>Android 15 with One UI 7</p></td></tr><tr><td class="firstcol " ><p><strong>Water/dust resistance</strong></p></td><td  ><p>IP68</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>7.67 x 11.83 x 0.24 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>1.47 pounds (5G), 1.46 (Wi-Fi)</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Gray, Silver, Blue</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-fe-plus-price-and-availability"><span>Samsung Galaxy Tab S10 FE Plus: Price and availability</span></h3><p>You can buy the Galaxy Tab S10 FE Plus right now for $649/£649/AU$ 1,299 for 128GB storage, or up that to $749/£749/AU$ 1,449 if you want 256GB storage. </p><p>These are the prices for the basic Wi-Fi-only model, but for just £100/AU$ 200 you can add 5G compatibility if you're in the U.K. or Australia. Sadly, U.S. users don't have access to the 5G edition of the Plus model —you'll have to downsize to the regular Tab S10 FE if you want mobile data on the tablet.</p><p>This is $50 more than the Galaxy Tab S9 FE Plus was last year, but that old model measures 12.4 inches, while the new one is noticeably larger at 13.1 inches. Meanwhile, the Galaxy Tab S10 Plus starts at $999/£999, and comes with several more features in accordance with its flagship status and price. But the Tab S10 Plus also measures 12.4 inches across, keeping the Tab S10 FE as the better one for cost to size ratio.</p><p>Looking beyond Samsung, the closest Apple-made rival, a 13-inch iPad Air, costs at least $799, and doesn't come with a bundled stylus like the Galaxy Tab does. The OnePlus Pad 2, our favorite Android tablet, costs $549, but uses a 12.1-inch display, and also comes without a stylus by default.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-fe-plus-design"><span>Samsung Galaxy Tab S10 FE Plus: Design</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="62MeKfSzVRz7zmjzvcFhjn" name="Galaxy Tab S10 FE Plus-11" alt="Samsung Galaxy Tab S10 FE Plus" src="https://cdn.mos.cms.futurecdn.net/62MeKfSzVRz7zmjzvcFhjn-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Galaxy Tab S10 FE Plus does not deviate from Samsung's basic tablet design principles, with rounded corners, a landscape-first layout with the front camera on the long side of the tablet and the antenna lines on the back the only decoration along with the Samsung logo. There is no stripe down the back of the tablet following the rear camera downwards, but there are still magnets in this area, despite this, making it an ideal S Pen stylus storage location.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YsqNxvKyGcPHXBmTYx8g27" name="Galaxy Tab S10 FE Plus-07" alt="Samsung Galaxy Tab S10 FE Plus" src="https://cdn.mos.cms.futurecdn.net/YsqNxvKyGcPHXBmTYx8g27-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>At 13.1 inches, the Galaxy Tab S10 FE Plus is 0.7 inches larger than the Tab S9 FE Plus it replaces, giving you a whole lot of extra screen space for your money. But even with the extra room, the Galaxy Tab S10 Plus FE remains noticeably more rectangular than most tablets, especially compared to the square-ish 13-inch iPad Air.</p><p>But the Galaxy Tab and the iPad are equally thin at 0.24 inches thick, even if Samsung’s slate is about an ounce heavier. But the Samsung scores extra points by making its tablet's body more durable, with an IP68 rating against dust and water.</p><p>Coming in Gray, Silver or Blue, there's no particularly loud color option for the Tab S10 Plus FE. But I doubt that will be a dealbreaker for anyone.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-fe-plus-display"><span>Samsung Galaxy Tab S10 FE Plus: Display</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="pkVy4Jyo2ZePK4cqLwuX9H" name="Galaxy Tab S10 FE Plus-03" alt="Samsung Galaxy Tab S10 FE Plus" src="https://cdn.mos.cms.futurecdn.net/pkVy4Jyo2ZePK4cqLwuX9H-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>A 13.1-inch LCD panel covers the front of the Galaxy Tab S10 FE Plus, offering a 90Hz refresh rate like the previous Tab FE models. And in line with its predecessors, Samsung runs rings around the competition when it comes to brightness, color and color accuracy.</p><div ><table><caption>Display benchmark results</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Galaxy Tab S10 FE Plus (Vivid/Natural display mode)</strong></p></td><td  ><p><strong>OnePlus Pad 2</strong></p></td><td  ><p><strong>iPad Air 2025 (11-inch)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Peak brightness (nits)</strong></p></td><td  ><p>782</p></td><td  ><p>580</p></td><td  ><p>486</p></td></tr><tr><td class="firstcol " ><p><strong>sRGB color gamut coverage (%)</strong></p></td><td  ><p>129.5% / 117.4%</p></td><td  ><p>105.7%</p></td><td  ><p>117.6%</p></td></tr><tr><td class="firstcol " ><p><strong>DCI-P3 color gamut coverage (%)</strong></p></td><td  ><p>91.7% / 83.2%</p></td><td  ><p>74.9%</p></td><td  ><p>83.3%</p></td></tr><tr><td class="firstcol " ><p><strong>Delta-E color accuracy (lower is better)</strong></p></td><td  ><p>0.31 / 0.23</p></td><td  ><p>0.25</p></td><td  ><p>0.22</p></td></tr></tbody></table></div><p>It's a shame that Samsung kept the anti-reflective coating exclusive for its non-FE Tab S models, because with that, the Tab S10 FE Plus would inarguably have one of the best tablet displays around.</p><p>As things stand, it's still brilliant for watching video or browsing, with the 90Hz refresh rate still high enough to keep things feeling responsive and smooth, unlike the 60Hz tech that Apple still uses on all its iPads except for the Pro models.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-fe-plus-performance"><span>Samsung Galaxy Tab S10 FE Plus: 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JJnSE9arNwNcUsKA5RwaEC" name="Galaxy Tab S10 FE Plus-14" alt="Samsung Galaxy Tab S10 FE Plus" src="https://cdn.mos.cms.futurecdn.net/JJnSE9arNwNcUsKA5RwaEC-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As one of the most expensive parts of any device, the chipset is normally a prime candidate for downgrading when trying to make a cheaper version, and that applies to the Galaxy Tab S10 FE Plus.</p><p>Samsung isn't using the capable Dimensity 9300 Plus from the regular Tab S10 models, but instead its own Exynos 1580. You can see how far behind that leaves it compared to the competition in the table below, where it lags on our three key benchmarks.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Galaxy Tab S10 FE Plus</strong></p></td><td  ><p><strong>OnePlus Pad 2</strong></p></td><td  ><p><strong>iPad Air 2025 (11-inch)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong></p></td><td  ><p>Exynos 1580</p></td><td  ><p>Snapdragon 8 Gen 3</p></td><td  ><p>Apple M3</p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6 score (single-core / multi-core)</strong></p></td><td  ><p>1362/3923</p></td><td  ><p>2033 / 6161</p></td><td  ><p>3042 / 11804</p></td></tr><tr><td class="firstcol " ><p><strong>3DMark Wild Life Extreme Unlimited (score / fps)</strong></p></td><td  ><p>1352/8.1</p></td><td  ><p>4440 / 26.59</p></td><td  ><p>5806 / 34.8</p></td></tr><tr><td class="firstcol " ><p><strong>Adobe Premiere Rush time to transcode (mins:secs)</strong></p></td><td  ><p>3:15</p></td><td  ><p>0:58</p></td><td  ><p>0:18</p></td></tr></tbody></table></div><p>This was noticeable outside the formal tests, too. When I played Ex Astris, an RPG with demanding graphics, the Tab S10 FE couldn't keep up. Only taking my party indoors and into tight corridors helped bring the refresh rate back up, and even then, only until I started doing anything more involved than just moving around the rooms. The Tab S10 Plus FE isn't built for gaming.</p><p>On the plus side, Samsung doesn't shortchange you with memory. The basic spec for the Galaxy Tab S10 Plus FE is 8GB RAM with 128GB storage, but you can also get a 12GB RAM/256GB storage version that puts the tablet on par with the best Android slates in terms of memory space for multitasking or storing files. There's microSD card support too, giving up to another 2TB of swappable storage if you need it.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-fe-plus-audio"><span>Samsung Galaxy Tab S10 FE Plus: Audio</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8qx3UrzQFAtsRebsM8AFFT" name="Galaxy Tab S10 FE Plus-13" alt="Samsung Galaxy Tab S10 FE Plus" src="https://cdn.mos.cms.futurecdn.net/8qx3UrzQFAtsRebsM8AFFT-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The stereo speakers on the Galaxy Tab S10 FE Plus offer reasonable power and audio definition. But it's still way behind premium tablets like Samsung's own Galaxy Tab S10 Plus.</p><p>Even at 50% volume, Roots Manuva's "Witness" was plenty loud enough for me on the Tab S10 FE Plus. The track's signature squish bass was as punchy as you'd want it to be, Root's lyrics were clear and the higher-pitched effects and percussion, while a little muted compared to the lower-frequency sounds, were still well represented.</p><p>But at the same volume, the Tab S10 Plus was way louder and had a superior soundstage with its quad speaker set-up. And all at the same quality, too. It's not a big enough difference for me to feel poorly served by the Galaxy Tab S10 FE Plus. But it is still a mid-tier tablet, and premium slates have all kinds of advantages you may not expect.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-fe-plus-battery-and-charging"><span>Samsung Galaxy Tab S10 FE Plus: Battery and charging</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="s5oZZQ7PE76ipUBZTfV7DZ" name="Galaxy Tab S10 FE Plus-02" alt="Samsung Galaxy Tab S10 FE Plus" src="https://cdn.mos.cms.futurecdn.net/s5oZZQ7PE76ipUBZTfV7DZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Although Samsung enlarged the Galaxy Tab S10 FE Plus compared to the Tab S9 FE Plus, it still uses the same 10,090 mAh battery capacity. On our custom battery test, the Tab S10 FE Plus lasted 15 hours and 43 minutes with its adaptive refresh rate. That's nearly two and a half hours shorter than the Tab S9 FE Plus, but close to two hours longer than the 14:08 result of the OnePlus Pad 2.</p><p>Samsung also kept the same 45W wired charging system for the latest generation of Tab S FE. It fills the tablet from empty to 8% in 15 minutes and 16% after half an hour. The OnePlus Pad managed to reach 36% after half an hour of charging, showing how Samsung still lags behind on refuelling, even if its tablets do well on efficiency.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-fe-plus-cameras"><span>Samsung Galaxy Tab S10 FE Plus: Cameras</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="dP5RzXvzCJ4iM2CUkGz4ue" name="Galaxy Tab S10 FE Plus-08" alt="Samsung Galaxy Tab S10 FE Plus" src="https://cdn.mos.cms.futurecdn.net/dP5RzXvzCJ4iM2CUkGz4ue-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>A simple duo of 13MP main and 12MP selfie cameras serves the Galaxy Tab S10 FE. Those are the same as you get on the Galaxy Tab S10, so we shouldn't see much difference between the photos I took on both tablets.</p><p>There's enough detail to show off your face or what's in front of you while you're on a video call. But these are not designed for proper photography, and given the size of the tablet, it's not practical to even try.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-fe-plus-accessories"><span>Samsung Galaxy Tab S10 FE Plus: Accessories</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qCdECNhD5jjCyDJhTcT8xj" name="Galaxy Tab S10 FE Plus-04" alt="Samsung Galaxy Tab S10 FE Plus" src="https://cdn.mos.cms.futurecdn.net/qCdECNhD5jjCyDJhTcT8xj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Samsung’s main tablet accessory is the S Pen, which, in usual Samsung fashion, comes in the Tab S10 FE Plus’ box as part of the entry price. There are no Bluetooth features available for this stylus, but the built-in button and fine, rubbery tip make it an excellent precision writing or drawing tool.</p><p>There are also several case and cover options that Samsung will sell you. You can get a simple Smart Book Cover, which acts as a stand or screen protector as needed. There are also two keyboard covers — an all-in-one style without a trackpad, and one with a trackpad that has separate stand and keyboard elements for greater flexibility.</p><p>I didn't get to try any of these cases, but going by previous Samsung tablet keyboard cases I've used, they are useful, albeit somewhat expensive, additions that make the tablet more suitable for work or school.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-fe-plus-software-and-ai-features"><span>Samsung Galaxy Tab S10 FE Plus: Software and AI features</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="eA3wRy629u25X9KZsLjxh3" name="Galaxy Tab S10 FE Plus-12" alt="Samsung Galaxy Tab S10 FE Plus" src="https://cdn.mos.cms.futurecdn.net/eA3wRy629u25X9KZsLjxh3-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>One UI 7 brings a fresh look to the Galaxy Tab S10 FE Plus' interface, in keeping with the regular Galaxy Tab S10 series and the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-s25-review">Galaxy S25</a> line of phones. But this resemblance is somewhat skin-deep, as a lot of the <a href="https://www.tomsguide.com/ai/samsung-galaxy-s25-ai-features-heres-everything-thats-new">Galaxy AI</a> features found on these devices aren't available on the Galaxy Tab S10 FE Plus.</p><p>You still get Circle to Search, the visual Google Search tool to help find out more about what's on your screen. And inside the Notes app, you can use the Solve Math feature to help with equations, or adjust your handwriting with the app's Handwriting Help tools to tidy up your notes. But this isn't designed to be an AI-focused device, unlike the iPad Air, which can use all the same Apple Intelligence features as other recent Apple devices.</p><p>Samsung's DeX desktop mode is still present on the Galaxy Tab S10 FE Plus, as it has been on previous Galaxy Tab generations. Turning this mode on makes the tablet more laptop-like when required, and is ideal for use with a keyboard case or a separate keyboard and mouse.</p><p>While Samsung's flagship tablets get seven years of full update support, the Galaxy Tab S10 FE Plus gets six years of full support, along with six generations of Android. This is one of the best offers for software longevity in the tablet space, with most iPads getting around five years of support, and the OnePlus Pad 2 only getting three years of Android updates and four years of security updates guaranteed.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-fe-plus-review-verdict"><span>Samsung Galaxy Tab S10 FE Plus review: Verdict</span></h3><p>Samsung's been generous with how much the Galaxy Tab S10 FE Plus offers, except in two key areas. Performance is one — this isn't a machine for high-fidelity gaming, or for work beyond some typing or spreadsheet editing. The other is the lack of AI features, which you'd perhaps expect on a tablet of this price in 2025, but may not matter too much given the Tab S10 FE Plus isn't focused on productivity.</p><p>The Tab S10 FE Plus' display size and quality, its strong battery life and the value for money for its hardware (plus the bundled stylus) make it a better mid-range tablet than others. It's just the right combination of features for anyone who wants something better than a standard iPad or Galaxy Tab A series model, but finds the laptop-grade M3 chip in the iPad Air excessive, let alone the price.</p><p>The OnePlus Pad 2 remains our top Android tablet pick for its overall performance and value for money. But if you're happy trading away some power and features for a longer battery life and extra display quality, the Galaxy Tab S10 FE Plus might be the ideal middle ground for you.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/android-tablets/samsung-galaxy-tab-s10-fe-plus-review</link>
                                                                            <description>
                            <![CDATA[ Samsung's latest entry-level flagship tablet packs enough high-quality hardware to make you forget about more expensive Android tablets and iPads. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">icpcPU4FfVs2HSqoQmhhuG</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/7jwNpdArhZFDpPJSan86sM-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 27 May 2025 09:00:00 +0000</pubDate>                                                                                                                                <updated>Thu, 26 Mar 2026 10:30:09 +0000</updated>
                                                                                                                                            <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></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-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Richard is a writer based in London, covering 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&amp;#39;s features with similar devices&amp;#39;, and figure out if something&amp;#39;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&amp;#39;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&amp;#39;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&amp;#39;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/7jwNpdArhZFDpPJSan86sM-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Tab S10 FE Plus]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Tab S10 FE Plus]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Tab S10 FE Plus]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/7jwNpdArhZFDpPJSan86sM-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Coming from a line of tablets that have let us down in the past, the Samsung Galaxy Tab S10 Plus FE has turned things around to show that Samsung can do cheaper tablets just as well as premium ones, while making forgivable sacrifices to keep the cost down.</p><p>Offering a larger screen than the more premium <a href="https://www.tomsguide.com/tablets/android-tablets/samsung-galaxy-tab-s10-plus-review-watch-out-ipad-pro">Samsung Galaxy Tab S10 Plus</a>, but with better battery life and only one less year of update support, the Galaxy Tab S10 FE Plus is Samsung's answer to the <a href="https://www.tomsguide.com/tablets/ipads/ipad-air-m3-review">iPad Air</a>, which we rank as one of the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a>. But unlike the <a href="https://www.tomsguide.com/tablets/android-tablets/oneplus-pad-2-review">OnePlus Pad 2</a>, our current top player for the <a href="https://www.tomsguide.com/best-picks/best-android-tablets">best Android tablets</a>, the Tab S10 FE Plus is not focused on power, even if it is just as practical for light workloads.</p><p>It's a huge but portable slate that can be a brilliant addition to anyone who finds flagship chipsets or the latest AI features unnecessary distractions from their main goals of note-taking, drawing or streaming video.</p><p>I've enjoyed my time with the Samsung Galaxy Tab S10 Plus a whole lot, even though I know there are more potent tablets I could use instead. You'll see why I don't mind the power gap, enjoy the surprising ways it beats far more expensive tablets and how well it plays early ‘00s British rap if you read on.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-fe-plus-specs"><span>Samsung Galaxy Tab S10 FE Plus: Specs</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Samsung Galaxy Tab S10 FE Plus (starting)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$649/£649/AU$1,299</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>13.1-inch LCD</p></td></tr><tr><td class="firstcol " ><p><strong>Refresh rate</strong></p></td><td  ><p>90Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Rear cameras</strong></p></td><td  ><p>13MP main</p></td></tr><tr><td class="firstcol " ><p><strong>Front cameras</strong></p></td><td  ><p>12MP selfie</p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong></p></td><td  ><p>Exynos 1580</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>8GB, 12GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>128GB, 256GB, microSD support up to 2TB</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>10,090 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Charging</strong></p></td><td  ><p>45W wired</p></td></tr><tr><td class="firstcol " ><p><strong>Operating system</strong></p></td><td  ><p>Android 15 with One UI 7</p></td></tr><tr><td class="firstcol " ><p><strong>Water/dust resistance</strong></p></td><td  ><p>IP68</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>7.67 x 11.83 x 0.24 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>1.47 pounds (5G), 1.46 (Wi-Fi)</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Gray, Silver, Blue</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-fe-plus-price-and-availability"><span>Samsung Galaxy Tab S10 FE Plus: Price and availability</span></h3><p>You can buy the Galaxy Tab S10 FE Plus right now for $649/£649/AU$ 1,299 for 128GB storage, or up that to $749/£749/AU$ 1,449 if you want 256GB storage. </p><p>These are the prices for the basic Wi-Fi-only model, but for just £100/AU$ 200 you can add 5G compatibility if you're in the U.K. or Australia. Sadly, U.S. users don't have access to the 5G edition of the Plus model —you'll have to downsize to the regular Tab S10 FE if you want mobile data on the tablet.</p><p>This is $50 more than the Galaxy Tab S9 FE Plus was last year, but that old model measures 12.4 inches, while the new one is noticeably larger at 13.1 inches. Meanwhile, the Galaxy Tab S10 Plus starts at $999/£999, and comes with several more features in accordance with its flagship status and price. But the Tab S10 Plus also measures 12.4 inches across, keeping the Tab S10 FE as the better one for cost to size ratio.</p><p>Looking beyond Samsung, the closest Apple-made rival, a 13-inch iPad Air, costs at least $799, and doesn't come with a bundled stylus like the Galaxy Tab does. The OnePlus Pad 2, our favorite Android tablet, costs $549, but uses a 12.1-inch display, and also comes without a stylus by default.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-fe-plus-design"><span>Samsung Galaxy Tab S10 FE Plus: Design</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="62MeKfSzVRz7zmjzvcFhjn" name="Galaxy Tab S10 FE Plus-11" alt="Samsung Galaxy Tab S10 FE Plus" src="https://cdn.mos.cms.futurecdn.net/62MeKfSzVRz7zmjzvcFhjn-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Galaxy Tab S10 FE Plus does not deviate from Samsung's basic tablet design principles, with rounded corners, a landscape-first layout with the front camera on the long side of the tablet and the antenna lines on the back the only decoration along with the Samsung logo. There is no stripe down the back of the tablet following the rear camera downwards, but there are still magnets in this area, despite this, making it an ideal S Pen stylus storage location.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YsqNxvKyGcPHXBmTYx8g27" name="Galaxy Tab S10 FE Plus-07" alt="Samsung Galaxy Tab S10 FE Plus" src="https://cdn.mos.cms.futurecdn.net/YsqNxvKyGcPHXBmTYx8g27-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>At 13.1 inches, the Galaxy Tab S10 FE Plus is 0.7 inches larger than the Tab S9 FE Plus it replaces, giving you a whole lot of extra screen space for your money. But even with the extra room, the Galaxy Tab S10 Plus FE remains noticeably more rectangular than most tablets, especially compared to the square-ish 13-inch iPad Air.</p><p>But the Galaxy Tab and the iPad are equally thin at 0.24 inches thick, even if Samsung’s slate is about an ounce heavier. But the Samsung scores extra points by making its tablet's body more durable, with an IP68 rating against dust and water.</p><p>Coming in Gray, Silver or Blue, there's no particularly loud color option for the Tab S10 Plus FE. But I doubt that will be a dealbreaker for anyone.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-fe-plus-display"><span>Samsung Galaxy Tab S10 FE Plus: Display</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="pkVy4Jyo2ZePK4cqLwuX9H" name="Galaxy Tab S10 FE Plus-03" alt="Samsung Galaxy Tab S10 FE Plus" src="https://cdn.mos.cms.futurecdn.net/pkVy4Jyo2ZePK4cqLwuX9H-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>A 13.1-inch LCD panel covers the front of the Galaxy Tab S10 FE Plus, offering a 90Hz refresh rate like the previous Tab FE models. And in line with its predecessors, Samsung runs rings around the competition when it comes to brightness, color and color accuracy.</p><div ><table><caption>Display benchmark results</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Galaxy Tab S10 FE Plus (Vivid/Natural display mode)</strong></p></td><td  ><p><strong>OnePlus Pad 2</strong></p></td><td  ><p><strong>iPad Air 2025 (11-inch)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Peak brightness (nits)</strong></p></td><td  ><p>782</p></td><td  ><p>580</p></td><td  ><p>486</p></td></tr><tr><td class="firstcol " ><p><strong>sRGB color gamut coverage (%)</strong></p></td><td  ><p>129.5% / 117.4%</p></td><td  ><p>105.7%</p></td><td  ><p>117.6%</p></td></tr><tr><td class="firstcol " ><p><strong>DCI-P3 color gamut coverage (%)</strong></p></td><td  ><p>91.7% / 83.2%</p></td><td  ><p>74.9%</p></td><td  ><p>83.3%</p></td></tr><tr><td class="firstcol " ><p><strong>Delta-E color accuracy (lower is better)</strong></p></td><td  ><p>0.31 / 0.23</p></td><td  ><p>0.25</p></td><td  ><p>0.22</p></td></tr></tbody></table></div><p>It's a shame that Samsung kept the anti-reflective coating exclusive for its non-FE Tab S models, because with that, the Tab S10 FE Plus would inarguably have one of the best tablet displays around.</p><p>As things stand, it's still brilliant for watching video or browsing, with the 90Hz refresh rate still high enough to keep things feeling responsive and smooth, unlike the 60Hz tech that Apple still uses on all its iPads except for the Pro models.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-fe-plus-performance"><span>Samsung Galaxy Tab S10 FE Plus: 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JJnSE9arNwNcUsKA5RwaEC" name="Galaxy Tab S10 FE Plus-14" alt="Samsung Galaxy Tab S10 FE Plus" src="https://cdn.mos.cms.futurecdn.net/JJnSE9arNwNcUsKA5RwaEC-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As one of the most expensive parts of any device, the chipset is normally a prime candidate for downgrading when trying to make a cheaper version, and that applies to the Galaxy Tab S10 FE Plus.</p><p>Samsung isn't using the capable Dimensity 9300 Plus from the regular Tab S10 models, but instead its own Exynos 1580. You can see how far behind that leaves it compared to the competition in the table below, where it lags on our three key benchmarks.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Galaxy Tab S10 FE Plus</strong></p></td><td  ><p><strong>OnePlus Pad 2</strong></p></td><td  ><p><strong>iPad Air 2025 (11-inch)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong></p></td><td  ><p>Exynos 1580</p></td><td  ><p>Snapdragon 8 Gen 3</p></td><td  ><p>Apple M3</p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6 score (single-core / multi-core)</strong></p></td><td  ><p>1362/3923</p></td><td  ><p>2033 / 6161</p></td><td  ><p>3042 / 11804</p></td></tr><tr><td class="firstcol " ><p><strong>3DMark Wild Life Extreme Unlimited (score / fps)</strong></p></td><td  ><p>1352/8.1</p></td><td  ><p>4440 / 26.59</p></td><td  ><p>5806 / 34.8</p></td></tr><tr><td class="firstcol " ><p><strong>Adobe Premiere Rush time to transcode (mins:secs)</strong></p></td><td  ><p>3:15</p></td><td  ><p>0:58</p></td><td  ><p>0:18</p></td></tr></tbody></table></div><p>This was noticeable outside the formal tests, too. When I played Ex Astris, an RPG with demanding graphics, the Tab S10 FE couldn't keep up. Only taking my party indoors and into tight corridors helped bring the refresh rate back up, and even then, only until I started doing anything more involved than just moving around the rooms. The Tab S10 Plus FE isn't built for gaming.</p><p>On the plus side, Samsung doesn't shortchange you with memory. The basic spec for the Galaxy Tab S10 Plus FE is 8GB RAM with 128GB storage, but you can also get a 12GB RAM/256GB storage version that puts the tablet on par with the best Android slates in terms of memory space for multitasking or storing files. There's microSD card support too, giving up to another 2TB of swappable storage if you need it.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-fe-plus-audio"><span>Samsung Galaxy Tab S10 FE Plus: Audio</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8qx3UrzQFAtsRebsM8AFFT" name="Galaxy Tab S10 FE Plus-13" alt="Samsung Galaxy Tab S10 FE Plus" src="https://cdn.mos.cms.futurecdn.net/8qx3UrzQFAtsRebsM8AFFT-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The stereo speakers on the Galaxy Tab S10 FE Plus offer reasonable power and audio definition. But it's still way behind premium tablets like Samsung's own Galaxy Tab S10 Plus.</p><p>Even at 50% volume, Roots Manuva's "Witness" was plenty loud enough for me on the Tab S10 FE Plus. The track's signature squish bass was as punchy as you'd want it to be, Root's lyrics were clear and the higher-pitched effects and percussion, while a little muted compared to the lower-frequency sounds, were still well represented.</p><p>But at the same volume, the Tab S10 Plus was way louder and had a superior soundstage with its quad speaker set-up. And all at the same quality, too. It's not a big enough difference for me to feel poorly served by the Galaxy Tab S10 FE Plus. But it is still a mid-tier tablet, and premium slates have all kinds of advantages you may not expect.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-fe-plus-battery-and-charging"><span>Samsung Galaxy Tab S10 FE Plus: Battery and charging</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="s5oZZQ7PE76ipUBZTfV7DZ" name="Galaxy Tab S10 FE Plus-02" alt="Samsung Galaxy Tab S10 FE Plus" src="https://cdn.mos.cms.futurecdn.net/s5oZZQ7PE76ipUBZTfV7DZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Although Samsung enlarged the Galaxy Tab S10 FE Plus compared to the Tab S9 FE Plus, it still uses the same 10,090 mAh battery capacity. On our custom battery test, the Tab S10 FE Plus lasted 15 hours and 43 minutes with its adaptive refresh rate. That's nearly two and a half hours shorter than the Tab S9 FE Plus, but close to two hours longer than the 14:08 result of the OnePlus Pad 2.</p><p>Samsung also kept the same 45W wired charging system for the latest generation of Tab S FE. It fills the tablet from empty to 8% in 15 minutes and 16% after half an hour. The OnePlus Pad managed to reach 36% after half an hour of charging, showing how Samsung still lags behind on refuelling, even if its tablets do well on efficiency.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-fe-plus-cameras"><span>Samsung Galaxy Tab S10 FE Plus: Cameras</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="dP5RzXvzCJ4iM2CUkGz4ue" name="Galaxy Tab S10 FE Plus-08" alt="Samsung Galaxy Tab S10 FE Plus" src="https://cdn.mos.cms.futurecdn.net/dP5RzXvzCJ4iM2CUkGz4ue-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>A simple duo of 13MP main and 12MP selfie cameras serves the Galaxy Tab S10 FE. Those are the same as you get on the Galaxy Tab S10, so we shouldn't see much difference between the photos I took on both tablets.</p><p>There's enough detail to show off your face or what's in front of you while you're on a video call. But these are not designed for proper photography, and given the size of the tablet, it's not practical to even try.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-fe-plus-accessories"><span>Samsung Galaxy Tab S10 FE Plus: Accessories</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qCdECNhD5jjCyDJhTcT8xj" name="Galaxy Tab S10 FE Plus-04" alt="Samsung Galaxy Tab S10 FE Plus" src="https://cdn.mos.cms.futurecdn.net/qCdECNhD5jjCyDJhTcT8xj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Samsung’s main tablet accessory is the S Pen, which, in usual Samsung fashion, comes in the Tab S10 FE Plus’ box as part of the entry price. There are no Bluetooth features available for this stylus, but the built-in button and fine, rubbery tip make it an excellent precision writing or drawing tool.</p><p>There are also several case and cover options that Samsung will sell you. You can get a simple Smart Book Cover, which acts as a stand or screen protector as needed. There are also two keyboard covers — an all-in-one style without a trackpad, and one with a trackpad that has separate stand and keyboard elements for greater flexibility.</p><p>I didn't get to try any of these cases, but going by previous Samsung tablet keyboard cases I've used, they are useful, albeit somewhat expensive, additions that make the tablet more suitable for work or school.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-fe-plus-software-and-ai-features"><span>Samsung Galaxy Tab S10 FE Plus: Software and AI features</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="eA3wRy629u25X9KZsLjxh3" name="Galaxy Tab S10 FE Plus-12" alt="Samsung Galaxy Tab S10 FE Plus" src="https://cdn.mos.cms.futurecdn.net/eA3wRy629u25X9KZsLjxh3-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>One UI 7 brings a fresh look to the Galaxy Tab S10 FE Plus' interface, in keeping with the regular Galaxy Tab S10 series and the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-s25-review">Galaxy S25</a> line of phones. But this resemblance is somewhat skin-deep, as a lot of the <a href="https://www.tomsguide.com/ai/samsung-galaxy-s25-ai-features-heres-everything-thats-new">Galaxy AI</a> features found on these devices aren't available on the Galaxy Tab S10 FE Plus.</p><p>You still get Circle to Search, the visual Google Search tool to help find out more about what's on your screen. And inside the Notes app, you can use the Solve Math feature to help with equations, or adjust your handwriting with the app's Handwriting Help tools to tidy up your notes. But this isn't designed to be an AI-focused device, unlike the iPad Air, which can use all the same Apple Intelligence features as other recent Apple devices.</p><p>Samsung's DeX desktop mode is still present on the Galaxy Tab S10 FE Plus, as it has been on previous Galaxy Tab generations. Turning this mode on makes the tablet more laptop-like when required, and is ideal for use with a keyboard case or a separate keyboard and mouse.</p><p>While Samsung's flagship tablets get seven years of full update support, the Galaxy Tab S10 FE Plus gets six years of full support, along with six generations of Android. This is one of the best offers for software longevity in the tablet space, with most iPads getting around five years of support, and the OnePlus Pad 2 only getting three years of Android updates and four years of security updates guaranteed.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-fe-plus-review-verdict"><span>Samsung Galaxy Tab S10 FE Plus review: Verdict</span></h3><p>Samsung's been generous with how much the Galaxy Tab S10 FE Plus offers, except in two key areas. Performance is one — this isn't a machine for high-fidelity gaming, or for work beyond some typing or spreadsheet editing. The other is the lack of AI features, which you'd perhaps expect on a tablet of this price in 2025, but may not matter too much given the Tab S10 FE Plus isn't focused on productivity.</p><p>The Tab S10 FE Plus' display size and quality, its strong battery life and the value for money for its hardware (plus the bundled stylus) make it a better mid-range tablet than others. It's just the right combination of features for anyone who wants something better than a standard iPad or Galaxy Tab A series model, but finds the laptop-grade M3 chip in the iPad Air excessive, let alone the price.</p><p>The OnePlus Pad 2 remains our top Android tablet pick for its overall performance and value for money. But if you're happy trading away some power and features for a longer battery life and extra display quality, the Galaxy Tab S10 FE Plus might be the ideal middle ground for you.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Exclusive: OnePlus Pad 3 launches in June with Snapdragon 8 Elite, a new design and 'remote Mac control' ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The OnePlus Pad 3, the sequel to the top-ranked device on our <a href="https://www.tomsguide.com/best-picks/best-android-tablets">best Android tablets</a> guide available today, is debuting on June 5, TG has learned in an exclusive interview with Celina Shi, Chief Marketing Officer at OnePlus Europe.</p><p>As well as the reveal date, Shi had some fascinating insight on what OnePlus' new tablet will offer, such as upgraded internals, smarter software and a fresh look.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DmHEJhiY9YfUautvbzqYa6" name="Celina Shi 16-9" alt="Celina Shi," src="https://cdn.mos.cms.futurecdn.net/DmHEJhiY9YfUautvbzqYa6-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: OnePlus)</span></figcaption></figure><p>"In just two short years, we have built a strong reputation for bringing the most powerful and productive tablets to the market," said Shi. We continue this legacy with the OnePlus Pad 3," which she adds is "ready to redefine the Android tablet market in 2025."</p><h2 id="the-chipset-you-were-hoping-for">The chipset you were hoping for</h2><p>As we'd hope, OnePlus is using a mighty chipset in the Pad 3 — the Snapdragon 8 Elite. It is, in fact, the first tablet to use this chip, Shi says, though several smartphones like the OnePlus 13 have used this silicon for months already.</p><p>Samsung's current <a href="https://www.tomsguide.com/tablets/android-tablets/samsung-galaxy-tab-s10-plus-review-watch-out-ipad-pro">Galaxy Tab S10 Plus</a> and <a href="https://www.tomsguide.com/tablets/android-tablets/samsung-galaxy-tab-s10-ultra-review">Tab S10 Ultra</a> models use a Dimensity 9300 Plus chip, while Apple sticks with it own A-series and M-series chips for the latest iPads like the <a href="https://www.tomsguide.com/tablets/ipads/ipad-air-m3-review">iPad Air</a> and <a href="https://www.tomsguide.com/tablets/ipads/ipad-pro-2024">iPad Pro</a>, so it'll be an exciting three-horse race when we get the Pad 3 into our lab for testing.</p><h2 id="new-productivity-features-for-android-and-apple-users-alike">New productivity features for Android and Apple users alike</h2><p>To nobody's surprise, the OnePlus Pad 3 will run OxygenOS 15, based on Android 15, just like the <a href="https://www.tomsguide.com/phones/oneplus-phones/oneplus-13-review">OnePlus 13</a> series. As well as the general benefits of the new OS version, the Pad 3 will bring an update to <a href="https://www.tomsguide.com/features/i-tried-oneplus-open-multitasking-open-canvas">Open Canvas</a>, the dynamic multi-app interface seen on the Pad 2 and the OnePlus Open foldable.</p><p>"OnePlus' Open Canvas… is the absolute best way to multitask across big screen devices," says Shi. " It allows you to have multiple separate programs open at once and flick between them quickly and easily, making sure nothing gets in the way of your work." Shi also promised that Open Canvas is better, but elected not to elaborate further.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1080px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="mV7qbJ5UYUZqhzyzFFKNB4" name="19 May Asset" alt="OnePlus Pad 3" src="https://cdn.mos.cms.futurecdn.net/mV7qbJ5UYUZqhzyzFFKNB4-1920-80.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: OnePlus)</span></figcaption></figure><p>Apple users, not just existing OnePlus or Android users, will benefit from owning a Pad 3 thanks to some other software upgrades. Shi explains that the OnePlus Pad 3 introduces "new apps and functionality to help Apple Mac users, including remote Mac control and easy file sharing via drag-and-drop." </p><p>Remote Mac control, first seen on the <a href="https://www.tomsguide.com/phones/android-phones/oppo-find-n5-review-simply-superior">Oppo Find N5</a>, the latest foldable from OnePlus' stablemate, allows users to remotely and securely mirror their Mac desktop, with trackpad gestures and a full keyboard offered on-screen as needed. It's something you can't do with an iPad or iPhone, and could be useful for people who need access to a Mac's files at home or work while out and about.</p><h2 id="a-new-and-blue-look">A new and blue look</h2><p>Design-wise, the OnePlus Pad 3 goes in a new direction with its rear camera block. The first and second OnePlus Pads had a rear camera in a circular block placed in the center of the long side of the device. Now however, the camera has moved to the top left corner in a pill-shaped bump, a more typical tablet camera placement that Shi describes as "a fresh, sleek look."</p><p>Shi also told us about the Pad 3's new color: Storm Blue, which is apparently "a dusty royal blue that whispers class and style anywhere you go." This was specified as the European colorway, which suggests other regions could get different colorways, although OnePlus hasn't offered this on any of its previous tablets sold in Europe or North America.</p><p>The OnePlus Pad 3's open sale date remains a secret, but Shi confirmed that pre-orders will open on launch day with "a selection of early-bird discounts and incentives," all on offer from OnePlus' website.</p><p>Taking in all these details as a whole, it's clear that OnePlus has high hopes for the Pad 3, and going by the quality of its previous tablets, it has good reason to be. While we don't have any official info on what display specs, battery tech or accessories the OnePlus Pad 3 will have, there are only a few weeks to wait until we find out on launch day. We'll let you know as soon as we have hands-on time with the OnePlus Pad 3, and give you a full review and verdict as soon as we can.</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/android-tablets/acer-launches-2-new-tablets-at-computex-2025-to-take-on-the-ipad-meet-the-iconia-v11-and-v12">Acer launches 2 new tablets at Computex 2025 to take on the iPad — meet the Iconia V11 and V12</a></li><li><a href="https://www.tomsguide.com/ai/i-gave-chatgpt-vs-gemini-the-same-image-prompts-one-completely-crushed-the-other">I just tested ChatGPT vs Gemini with 7 AI image prompts — and one crushed the other</a></li><li><a href="https://www.tomsguide.com/computing/desktop-computers/acemagic-f3a-mini-pc-review">I replaced my desktop tower with the AceMagic F3a mini PC for 7 days — here are my pros and cons</a></li></ul><div data-model-name="OnePlus Pad 2" data-widget-type="review"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/android-tablets/exclusive-oneplus-pad-3-launches-in-june-with-snapdragon-8-elite-a-new-design-and-remote-mac-control</link>
                                                                            <description>
                            <![CDATA[ The OnePlus Pad 3 is launching next month, and we've spoken to a senior OnePlus spokesperson about the major upgrades to the tablet's performance, design and features. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">CydGwufSxARfhodVTxyv35</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/KiFczhGyqg8o7fpK4KihA4-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 19 May 2025 06:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></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-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Richard is a writer based in London, covering 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&amp;#39;s features with similar devices&amp;#39;, and figure out if something&amp;#39;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&amp;#39;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&amp;#39;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&amp;#39;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/KiFczhGyqg8o7fpK4KihA4-1920-80.jpg">
                                                            <media:credit><![CDATA[OnePlus]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[OnePlus Pad 3]]></media:description>                                                            <media:text><![CDATA[OnePlus Pad 3]]></media:text>
                                <media:title type="plain"><![CDATA[OnePlus Pad 3]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/KiFczhGyqg8o7fpK4KihA4-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The OnePlus Pad 3, the sequel to the top-ranked device on our <a href="https://www.tomsguide.com/best-picks/best-android-tablets">best Android tablets</a> guide available today, is debuting on June 5, TG has learned in an exclusive interview with Celina Shi, Chief Marketing Officer at OnePlus Europe.</p><p>As well as the reveal date, Shi had some fascinating insight on what OnePlus' new tablet will offer, such as upgraded internals, smarter software and a fresh look.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DmHEJhiY9YfUautvbzqYa6" name="Celina Shi 16-9" alt="Celina Shi," src="https://cdn.mos.cms.futurecdn.net/DmHEJhiY9YfUautvbzqYa6-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: OnePlus)</span></figcaption></figure><p>"In just two short years, we have built a strong reputation for bringing the most powerful and productive tablets to the market," said Shi. We continue this legacy with the OnePlus Pad 3," which she adds is "ready to redefine the Android tablet market in 2025."</p><h2 id="the-chipset-you-were-hoping-for">The chipset you were hoping for</h2><p>As we'd hope, OnePlus is using a mighty chipset in the Pad 3 — the Snapdragon 8 Elite. It is, in fact, the first tablet to use this chip, Shi says, though several smartphones like the OnePlus 13 have used this silicon for months already.</p><p>Samsung's current <a href="https://www.tomsguide.com/tablets/android-tablets/samsung-galaxy-tab-s10-plus-review-watch-out-ipad-pro">Galaxy Tab S10 Plus</a> and <a href="https://www.tomsguide.com/tablets/android-tablets/samsung-galaxy-tab-s10-ultra-review">Tab S10 Ultra</a> models use a Dimensity 9300 Plus chip, while Apple sticks with it own A-series and M-series chips for the latest iPads like the <a href="https://www.tomsguide.com/tablets/ipads/ipad-air-m3-review">iPad Air</a> and <a href="https://www.tomsguide.com/tablets/ipads/ipad-pro-2024">iPad Pro</a>, so it'll be an exciting three-horse race when we get the Pad 3 into our lab for testing.</p><h2 id="new-productivity-features-for-android-and-apple-users-alike">New productivity features for Android and Apple users alike</h2><p>To nobody's surprise, the OnePlus Pad 3 will run OxygenOS 15, based on Android 15, just like the <a href="https://www.tomsguide.com/phones/oneplus-phones/oneplus-13-review">OnePlus 13</a> series. As well as the general benefits of the new OS version, the Pad 3 will bring an update to <a href="https://www.tomsguide.com/features/i-tried-oneplus-open-multitasking-open-canvas">Open Canvas</a>, the dynamic multi-app interface seen on the Pad 2 and the OnePlus Open foldable.</p><p>"OnePlus' Open Canvas… is the absolute best way to multitask across big screen devices," says Shi. " It allows you to have multiple separate programs open at once and flick between them quickly and easily, making sure nothing gets in the way of your work." Shi also promised that Open Canvas is better, but elected not to elaborate further.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1080px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="mV7qbJ5UYUZqhzyzFFKNB4" name="19 May Asset" alt="OnePlus Pad 3" src="https://cdn.mos.cms.futurecdn.net/mV7qbJ5UYUZqhzyzFFKNB4-1920-80.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: OnePlus)</span></figcaption></figure><p>Apple users, not just existing OnePlus or Android users, will benefit from owning a Pad 3 thanks to some other software upgrades. Shi explains that the OnePlus Pad 3 introduces "new apps and functionality to help Apple Mac users, including remote Mac control and easy file sharing via drag-and-drop." </p><p>Remote Mac control, first seen on the <a href="https://www.tomsguide.com/phones/android-phones/oppo-find-n5-review-simply-superior">Oppo Find N5</a>, the latest foldable from OnePlus' stablemate, allows users to remotely and securely mirror their Mac desktop, with trackpad gestures and a full keyboard offered on-screen as needed. It's something you can't do with an iPad or iPhone, and could be useful for people who need access to a Mac's files at home or work while out and about.</p><h2 id="a-new-and-blue-look">A new and blue look</h2><p>Design-wise, the OnePlus Pad 3 goes in a new direction with its rear camera block. The first and second OnePlus Pads had a rear camera in a circular block placed in the center of the long side of the device. Now however, the camera has moved to the top left corner in a pill-shaped bump, a more typical tablet camera placement that Shi describes as "a fresh, sleek look."</p><p>Shi also told us about the Pad 3's new color: Storm Blue, which is apparently "a dusty royal blue that whispers class and style anywhere you go." This was specified as the European colorway, which suggests other regions could get different colorways, although OnePlus hasn't offered this on any of its previous tablets sold in Europe or North America.</p><p>The OnePlus Pad 3's open sale date remains a secret, but Shi confirmed that pre-orders will open on launch day with "a selection of early-bird discounts and incentives," all on offer from OnePlus' website.</p><p>Taking in all these details as a whole, it's clear that OnePlus has high hopes for the Pad 3, and going by the quality of its previous tablets, it has good reason to be. While we don't have any official info on what display specs, battery tech or accessories the OnePlus Pad 3 will have, there are only a few weeks to wait until we find out on launch day. We'll let you know as soon as we have hands-on time with the OnePlus Pad 3, and give you a full review and verdict as soon as we can.</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/android-tablets/acer-launches-2-new-tablets-at-computex-2025-to-take-on-the-ipad-meet-the-iconia-v11-and-v12">Acer launches 2 new tablets at Computex 2025 to take on the iPad — meet the Iconia V11 and V12</a></li><li><a href="https://www.tomsguide.com/ai/i-gave-chatgpt-vs-gemini-the-same-image-prompts-one-completely-crushed-the-other">I just tested ChatGPT vs Gemini with 7 AI image prompts — and one crushed the other</a></li><li><a href="https://www.tomsguide.com/computing/desktop-computers/acemagic-f3a-mini-pc-review">I replaced my desktop tower with the AceMagic F3a mini PC for 7 days — here are my pros and cons</a></li></ul><div data-model-name="OnePlus Pad 2" data-widget-type="review"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Acer launches 2 new tablets at Computex 2025 to take on the iPad — meet the Iconia V11 and V12 ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Acer has launched two new Android-based Iconia tablets at <a href="https://www.tomsguide.com/computing/computex-2025-what-to-expect">Computex 2025</a> with an eye towards capturing budget-conscious customers on the lookout for a new Android tablet. </p><p>The Iconia V11 and V12 arrive running Android 15 powered by a MediaTek Helio G99 processor backed by up to 8GB of DDR4 RAM. </p><p>Judging from the European pricing (U.S. and U.K. prices haven't been revealed yet) of €289 for the V12 and €229 for the V11, we're looking at sub-$300 mid-tier devices vying for a spot on the <a href="https://www.tomsguide.com/best-picks/best-cheap-tablets">best cheap tablets</a> list.</p><p>So, what do you get for the money? Acer is packing these devices with 11- and 12-inch, 16:10 aspect ratio screens with up to a 2K resolution and a 90Hz refresh rate.</p><p>Both tablets feature an aluminum chassis and while the V12 weighs in at 595g (1.3 pounds), the V11 is quite a bit lighter at 500g (1.1 pounds).</p><div><blockquote><p>Both devices come with an iPad-style magnetic folio case that doubles up as a kickstand with three different viewing angles.</p></blockquote></div><p>Both devices come with an iPad-style magnetic folio case that doubles up as a kickstand with three different viewing angles. Acer also has an accompanying stylus it's selling separately. You only get one color option, and it's an eye-pleasing "mist green".</p><p>There's 256GB of built-in storage in each tablet with the option to expand that up to 1TB via microSD.</p><p>Acer quotes a 10-hour battery life from the integrated 8,000mAh batteries — but that's obviously something we'll have to test independently once we get our hands on these tablets.</p><p>Camera-wise, you're looking at an 8-megapixel rear shooter and a 5-megapixel front one for video calls. Again, we'll  have to test these out in the hand to determine if the quality is any good.</p><p>USB fast charging is on offer and Wi-Fi 6 and Bluetooth 5.2 round out the connectivity options. Acer has a 4G LTE version of the Iconia V11 for anyone who wants to include a cellular connection.</p><h2 id="how-do-they-stack-up">How do they stack 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:2971px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="VZNWaBxRgRMxXbBAP834hE" name="Acer Iconia V12" alt="Acer Iconia V12 tablet" src="https://cdn.mos.cms.futurecdn.net/VZNWaBxRgRMxXbBAP834hE-1920-80.png" mos="" align="middle" fullscreen="" width="2971" height="1671" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">The Acer Iconia V12 Android tablet in mist green </span><span class="credit" itemprop="copyrightHolder">(Image credit: Acer)</span></figcaption></figure><p>We won't know exactly how good these devices are until we've got them into the Tom's Guide testing labs for a full review. But it's safe to say competition to offer the best cheap tablets is fierce right now.</p><p>The <a href="https://www.tomsguide.com/reviews/samsung-galaxy-tab-a7">Samsung Galaxy Tab A7</a> can be had for<a href="https://www.amazon.com/Samsung-Galaxy-10-4-Wi-Fi-SM-T500NZAAXAR/dp/B08GH2C64R/?th=1" target="_blank" rel="nofollow"> under $200 at Amazon right now</a> thanks to a 13% discount. For Android users, this is a solid entry-level option with a 10.4-inch 2,000 x 1,200 display and a Snapdragon 662 processor inside along with 3GB of RAM.</p><p>Of course, for those with a little bit more to spend, there's the <a href="https://www.tomsguide.com/reviews/ipad-2022-10th-gen">11-inch iPad (10th generation) </a>which is <a href="https://www.amazon.com/Apple-iPad-11-inch-Display-All-Day/dp/B0DZ75TN5F?th=1" target="_blank" rel="nofollow">hovering at $321 at Amazon at time of writing</a> due to an 8% discount. That's the best overall cheap tablet you can buy right now and a tough opponent for Acer to match.</p><p>The Iconia tablets are far from the only products Acer is unleashing at Computex this year. Tom's Guide will be reporting from the show floor all week so make sure you check back for the latest news as it happens.</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/monitors/i-tested-a-curved-oled-gaming-monitor-with-a-secret-side-quest-its-also-a-killer-smart-tv">I tested a curved OLED gaming monitor with a secret side quest — it's also a killer smart TV</a></li><li><a href="https://www.tomsguide.com/computing/monitors/i-found-the-perfect-monitor-for-my-rtx-5060-ti-and-its-a-qhd-oled-dream-that-wont-break-the-bank">I found the perfect monitor for my RTX 5060 Ti — and it’s a QHD OLED dream that won’t break the bank</a></li><li><a href="https://www.tomsguide.com/computing/smart-glasses/spacetop-is-the-ar-productivity-software-ive-always-wanted-heres-why">I just saw the future of computing — and it makes me a believer in AR smart glasses</a></li></ul><div data-model-name="Asus ROG Zephyrus G14 2025,MSI Cyborg 15,Alienware ˇXM18,Alienware x14 R2 Gaming Laptop,Samsung Galaxy Book3 Ultra" data-widget-type="comparison" data-widget-title="Today’s gaming laptop deals"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/android-tablets/acer-launches-2-new-tablets-at-computex-2025-to-take-on-the-ipad-meet-the-iconia-v11-and-v12</link>
                                                                            <description>
                            <![CDATA[ Acer has unveiled two new Iconia tablets at Computex 2025, powered by MediaTek chips and offering 10 hours of battery life. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">TYh3gqScHRDk8vuoUDM48K</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/uBNYDy7NwmHSNWNdFxevhE-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 16 May 2025 13:00:30 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></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-320-70.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/uBNYDy7NwmHSNWNdFxevhE-1920-80.jpg">
                                                            <media:credit><![CDATA[Acer]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Acer Iconia V12 tablet]]></media:description>                                                            <media:text><![CDATA[Acer Iconia V12 tablet]]></media:text>
                                <media:title type="plain"><![CDATA[Acer Iconia V12 tablet]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/uBNYDy7NwmHSNWNdFxevhE-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Acer has launched two new Android-based Iconia tablets at <a href="https://www.tomsguide.com/computing/computex-2025-what-to-expect">Computex 2025</a> with an eye towards capturing budget-conscious customers on the lookout for a new Android tablet. </p><p>The Iconia V11 and V12 arrive running Android 15 powered by a MediaTek Helio G99 processor backed by up to 8GB of DDR4 RAM. </p><p>Judging from the European pricing (U.S. and U.K. prices haven't been revealed yet) of €289 for the V12 and €229 for the V11, we're looking at sub-$300 mid-tier devices vying for a spot on the <a href="https://www.tomsguide.com/best-picks/best-cheap-tablets">best cheap tablets</a> list.</p><p>So, what do you get for the money? Acer is packing these devices with 11- and 12-inch, 16:10 aspect ratio screens with up to a 2K resolution and a 90Hz refresh rate.</p><p>Both tablets feature an aluminum chassis and while the V12 weighs in at 595g (1.3 pounds), the V11 is quite a bit lighter at 500g (1.1 pounds).</p><div><blockquote><p>Both devices come with an iPad-style magnetic folio case that doubles up as a kickstand with three different viewing angles.</p></blockquote></div><p>Both devices come with an iPad-style magnetic folio case that doubles up as a kickstand with three different viewing angles. Acer also has an accompanying stylus it's selling separately. You only get one color option, and it's an eye-pleasing "mist green".</p><p>There's 256GB of built-in storage in each tablet with the option to expand that up to 1TB via microSD.</p><p>Acer quotes a 10-hour battery life from the integrated 8,000mAh batteries — but that's obviously something we'll have to test independently once we get our hands on these tablets.</p><p>Camera-wise, you're looking at an 8-megapixel rear shooter and a 5-megapixel front one for video calls. Again, we'll  have to test these out in the hand to determine if the quality is any good.</p><p>USB fast charging is on offer and Wi-Fi 6 and Bluetooth 5.2 round out the connectivity options. Acer has a 4G LTE version of the Iconia V11 for anyone who wants to include a cellular connection.</p><h2 id="how-do-they-stack-up">How do they stack 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:2971px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="VZNWaBxRgRMxXbBAP834hE" name="Acer Iconia V12" alt="Acer Iconia V12 tablet" src="https://cdn.mos.cms.futurecdn.net/VZNWaBxRgRMxXbBAP834hE-1920-80.png" mos="" align="middle" fullscreen="" width="2971" height="1671" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">The Acer Iconia V12 Android tablet in mist green </span><span class="credit" itemprop="copyrightHolder">(Image credit: Acer)</span></figcaption></figure><p>We won't know exactly how good these devices are until we've got them into the Tom's Guide testing labs for a full review. But it's safe to say competition to offer the best cheap tablets is fierce right now.</p><p>The <a href="https://www.tomsguide.com/reviews/samsung-galaxy-tab-a7">Samsung Galaxy Tab A7</a> can be had for<a href="https://www.amazon.com/Samsung-Galaxy-10-4-Wi-Fi-SM-T500NZAAXAR/dp/B08GH2C64R/?th=1" target="_blank" rel="nofollow"> under $200 at Amazon right now</a> thanks to a 13% discount. For Android users, this is a solid entry-level option with a 10.4-inch 2,000 x 1,200 display and a Snapdragon 662 processor inside along with 3GB of RAM.</p><p>Of course, for those with a little bit more to spend, there's the <a href="https://www.tomsguide.com/reviews/ipad-2022-10th-gen">11-inch iPad (10th generation) </a>which is <a href="https://www.amazon.com/Apple-iPad-11-inch-Display-All-Day/dp/B0DZ75TN5F?th=1" target="_blank" rel="nofollow">hovering at $321 at Amazon at time of writing</a> due to an 8% discount. That's the best overall cheap tablet you can buy right now and a tough opponent for Acer to match.</p><p>The Iconia tablets are far from the only products Acer is unleashing at Computex this year. Tom's Guide will be reporting from the show floor all week so make sure you check back for the latest news as it happens.</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/monitors/i-tested-a-curved-oled-gaming-monitor-with-a-secret-side-quest-its-also-a-killer-smart-tv">I tested a curved OLED gaming monitor with a secret side quest — it's also a killer smart TV</a></li><li><a href="https://www.tomsguide.com/computing/monitors/i-found-the-perfect-monitor-for-my-rtx-5060-ti-and-its-a-qhd-oled-dream-that-wont-break-the-bank">I found the perfect monitor for my RTX 5060 Ti — and it’s a QHD OLED dream that won’t break the bank</a></li><li><a href="https://www.tomsguide.com/computing/smart-glasses/spacetop-is-the-ar-productivity-software-ive-always-wanted-heres-why">I just saw the future of computing — and it makes me a believer in AR smart glasses</a></li></ul><div data-model-name="Asus ROG Zephyrus G14 2025,MSI Cyborg 15,Alienware ˇXM18,Alienware x14 R2 Gaming Laptop,Samsung Galaxy Book3 Ultra" data-widget-type="comparison" data-widget-title="Today’s gaming laptop deals"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Amazon Big Spring Sale — last minute deals on iPads, Samsung and Fire tablets ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Today is the final day of the <a href="https://www.tomsguide.com/live/news/amazon-big-spring-sale-2025">Amazon Big Spring Sale</a>! That means you only have a few hours to find some of the <a href="https://www.tomsguide.com/best-picks/best-tablet" target="_blank">best tablets</a> at a discount. This includes slates from Apple, Samsung, and, of course, Amazon.</p><p>Some of the <a href="https://www.tomsguide.com/best-picks/best-ipad">best iPad</a> deals right now include the new <a href="https://www.amazon.com/Apple-11-inch-Intelligence-Display-All-Day/dp/B0DZ74YQ1V" target="_blank" rel="nofollow">11-inch iPad Air M3 for $549</a> and the <a href="https://www.amazon.com/Apple-13-inch-Intelligence-Display-All-Day/dp/B0DZ76QBLQ" target="_blank" rel="nofollow">13-inch iPad Air M3 for $738</a>. I also like the <a href="https://www.amazon.com/dp/B0D3J6L2ZC?th=1" target="_blank" rel="nofollow">11-inch iPad Pro M4 for $919</a>, which is a $100 deal. Another awesome deal is the <a href="https://www.amazon.com/New-Apple-iPad-Mini-A17/dp/B0DK3W4YHS?th=1" target="_blank" rel="nofollow">iPad mini 7 for $399</a>.</p><p>Into the <a href="https://www.tomsguide.com/best-picks/best-android-tablets">best Android tablets</a>? If so, you can get a <a href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZMFZ84J?th=1" target="_blank" rel="nofollow">Google Pixel Tablet for $279</a> (a 30% discount) and a <a href="https://www.amazon.com/SAMSUNG-Android-Durability-Included-Moonstone/dp/B0D84MHZX5?th=1" target="_blank" rel="nofollow">Samsung Galaxy Tab S10+ for $150 off</a>. Naturally, Amazon has slashed the price of its tablets, such as the <a href="https://www.amazon.com/Fire-7-Tablet/dp/B096WJQNZ4" target="_blank" rel="nofollow">Amazon Fire 7 for $44</a>.</p><p>Below are the best last-minute tablet deals for the Amazon Big Spring Sale.</p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><strong>Amazon Fire 7: </strong><a href="https://www.amazon.com/Fire-7-Tablet/dp/B096WJQNZ4" target="_blank" rel="nofollow"><strong>was $59 now $44 @ Amazon</strong></a></li><li><strong>Apple 11" iPad (WiFi/128GB): </strong><a href="https://www.amazon.com/dp/B0DZ75TN5F" target="_blank" rel="nofollow"><strong>was $349 now $327 @ Amazon</strong></a><strong></strong></li><li><strong>Apple iPad mini 7: </strong><a href="https://www.amazon.com/New-Apple-iPad-Mini-A17/dp/B0DK3W4YHS" target="_blank" rel="nofollow"><strong>was $499 now $399 @ Amazon</strong></a><strong></strong></li><li><strong>Google Pixel Tablet: </strong><a href="https://www.amazon.com/dp/B0C1SHGHSZ" target="_blank" rel="nofollow"><strong>was $499 now $399 @ Amazon</strong></a><strong></strong></li><li><strong>Apple 11" iPad Air (WiFi/128GB): </strong><a href="https://www.amazon.com/Apple-11-inch-Intelligence-Display-All-Day/dp/B0DZ74YQ1V" target="_blank" rel="nofollow"><strong>was $599 now $549 at Amazon</strong></a><strong></strong></li><li><strong>Apple 13" iPad Air (WiFi/128GB): </strong><a href="https://www.amazon.com/Apple-13-inch-Intelligence-Display-All-Day/dp/B0DZ76QBLQ" target="_blank" rel="nofollow"><strong>was $799 now $738 @ Amazon</strong></a><strong></strong></li><li><strong>Samsung Galaxy Tab S10 Plus: </strong><a href="https://www.amazon.com/SAMSUNG-Android-Durability-Included-Moonstone/dp/B0D84MHZX5" target="_blank" rel="nofollow"><strong>was $999 now $849 @ Amazon</strong></a><strong></strong></li><li><strong>Apple 11" iPad Pro (WiFi/256GB): </strong><a href="https://www.amazon.com/dp/B0D3J6L2ZC" target="_blank" rel="nofollow"><strong>was $999 now $919 @ Amazon</strong></a><strong></strong></li><li><strong>Apple 13" iPad Pro (Wi-Fi/256GB): </strong><a href="https://www.amazon.com/dp/B0D3J98W75" target="_blank" rel="nofollow"><strong>was $1,299 now $1,185 @ Amazon</strong></a><strong></strong></li></ul><h3 class="article-body__section" id="section-ipad-deals"><span>iPad deals</span></h3><div class="product"><a data-dimension112="bd7de28e-f670-4b48-b644-154fd38343db" data-action="Deal Block" data-label="11" iPad (WiFi/128GB)" data-dimension48="11" iPad (WiFi/128GB)" data-dimension25="$327" href="https://www.amazon.com/dp/B0DZ75TN5F" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1325px;"><p class="vanilla-image-block" style="padding-top:113.21%;"><img id="oi25obYHzoyNfMHoycGamh" name="iPad 2022 Blue.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/oi25obYHzoyNfMHoycGamh-1920-80.jpg" mos="" align="middle" fullscreen="" width="1325" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/dp/B0DZ75TN5F" target="_blank" rel="nofollow" data-dimension112="bd7de28e-f670-4b48-b644-154fd38343db" data-action="Deal Block" data-label='11" iPad (WiFi/128GB)' data-dimension48='11" iPad (WiFi/128GB)' data-dimension25="$327">11" iPad (WiFi/128GB): was $349 now $327</a></strong><br>The 2025 iPad features a larger 11-inch (2360 x 1640) screen, A16 CPU, 12MP rear/front cameras, USB-C connectivity, and Magic Keyboard Folio ($249) support. The base model features 128GB of storage, which double the capacity of its predecessor. It's available in 128GB, 256GB, and 512GB capacities. <a class="view-deal button" href="https://www.amazon.com/dp/B0DZ75TN5F" target="_blank" rel="nofollow" data-dimension112="bd7de28e-f670-4b48-b644-154fd38343db" data-action="Deal Block" data-label="11" iPad (WiFi/128GB)" data-dimension48="11" iPad (WiFi/128GB)" data-dimension25="$327">View Deal</a></p></div><div class="product"><a data-dimension112="2ea50fbf-55da-4e46-8cf4-f3b39e1b3c9e" data-action="Deal Block" data-label="iPad mini 7" data-dimension48="iPad mini 7" data-dimension25="$399" href="https://www.amazon.com/New-Apple-iPad-Mini-A17/dp/B0DK3W4YHS" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1203px;"><p class="vanilla-image-block" style="padding-top:124.69%;"><img id="G2PjHEjHsRfuddfWSzPBjd" name="iPad mini 2024 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/G2PjHEjHsRfuddfWSzPBjd-1920-80.jpg" mos="" align="middle" fullscreen="" width="1203" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The new iPad mini is already getting a discount, and any price cut to this small tablet is welcome. We're big fans of its incredibly portable design and long battery life (it lasted 10 hours in our battery life tests.) It comes with speedy performance thanks to Apple's A17 Pro chip, and has a gorgeous 8.3-inch (2,266 x 1,488) Liquid Retina display. You also get 12MP cameras on the front and back and Wi-Fi 6e support. In our <a href="https://www.tomsguide.com/tablets/ipads/ipad-mini-7-review" data-dimension112="2ea50fbf-55da-4e46-8cf4-f3b39e1b3c9e" data-action="Deal Block" data-label="iPad mini 7" data-dimension48="iPad mini 7" data-dimension25="$399">iPad mini 7 review</a>, we said it delivers the full iPad experience in a tiny size. <a class="view-deal button" href="https://www.amazon.com/New-Apple-iPad-Mini-A17/dp/B0DK3W4YHS" target="_blank" rel="nofollow" data-dimension112="2ea50fbf-55da-4e46-8cf4-f3b39e1b3c9e" data-action="Deal Block" data-label="iPad mini 7" data-dimension48="iPad mini 7" data-dimension25="$399">View Deal</a></p></div><div class="product"><a data-dimension112="9ae2f4e8-e1fd-481a-b4a8-d93cac4f3fce" data-action="Deal Block" data-label="11" iPad Air (WiFi/128GB)" data-dimension48="11" iPad Air (WiFi/128GB)" data-dimension25="$549" href="https://www.amazon.com/Apple-11-inch-Intelligence-Display-All-Day/dp/B0DZ74YQ1V" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1325px;"><p class="vanilla-image-block" style="padding-top:113.21%;"><img id="NVZkwX7FuVd3CYdiYHdsgm" name="iPad Air 11 2024 deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/NVZkwX7FuVd3CYdiYHdsgm-1920-80.jpg" mos="" align="middle" fullscreen="" width="1325" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Apple-11-inch-Intelligence-Display-All-Day/dp/B0DZ74YQ1V" target="_blank" rel="nofollow" data-dimension112="9ae2f4e8-e1fd-481a-b4a8-d93cac4f3fce" data-action="Deal Block" data-label='11" iPad Air (WiFi/128GB)' data-dimension48='11" iPad Air (WiFi/128GB)' data-dimension25="$549">11" iPad Air (WiFi/128GB): was $599 now $549</a></strong><br>The 2025 iPad Air packs Apple's M3 processor, an 11-inch LED (2360 x 1640) display, 128GB of storage, 12MP rear camera, and 12MP front camera. The tablet packs a more powerful 8-core CPU, which makes the M3 up to 35% faster for multithreaded CPU workflows than the iPad Air M1. There's also a 9-core GPU on board with 40% faster graphics performance than the M1. In our <a href="https://www.tomsguide.com/tablets/ipads/ipad-air-m3-review">iPad Air M3 review</a> we said its fun Apple Intelligence features, reliable battery life (9 hours w/ 41 minutes), and overall thin design make it a winning Apple slate.<a class="view-deal button" href="https://www.amazon.com/Apple-11-inch-Intelligence-Display-All-Day/dp/B0DZ74YQ1V" target="_blank" rel="nofollow" data-dimension112="9ae2f4e8-e1fd-481a-b4a8-d93cac4f3fce" data-action="Deal Block" data-label="11" iPad Air (WiFi/128GB)" data-dimension48="11" iPad Air (WiFi/128GB)" data-dimension25="$549">View Deal</a></p></div><div class="product"><a data-dimension112="f29bfd88-dfac-49f4-900d-3d224199486f" data-action="Deal Block" data-label="13" iPad Air (WiFi/128GB)" data-dimension48="13" iPad Air (WiFi/128GB)" data-dimension25="$738" href="https://www.amazon.com/Apple-13-inch-Intelligence-Display-All-Day/dp/B0DZ76QBLQ" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1368px;"><p class="vanilla-image-block" style="padding-top:109.65%;"><img id="5LtYHnqoh7QQJRLor82SEG" name="iPad Air 13 2024 deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/5LtYHnqoh7QQJRLor82SEG-1920-80.jpg" mos="" align="middle" fullscreen="" width="1368" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Apple-13-inch-Intelligence-Display-All-Day/dp/B0DZ76QBLQ" target="_blank" rel="nofollow" data-dimension112="f29bfd88-dfac-49f4-900d-3d224199486f" data-action="Deal Block" data-label='13" iPad Air (WiFi/128GB)' data-dimension48='13" iPad Air (WiFi/128GB)' data-dimension25="$738">13" iPad Air (WiFi/128GB): was $799 now $738</a></strong><br>This larger size iPad Air sports the same M3 processor as its 11-inch counterpart, but it's coupled with a 13-inch LED (2732 x 2048) display. Otherwise, it packs the same 128GB of storage, 12MP rear camera, WiFi 6E support, and 12MP front camera. The new CPU and larger display should make this iPad a favorite for gamers.<a class="view-deal button" href="https://www.amazon.com/Apple-13-inch-Intelligence-Display-All-Day/dp/B0DZ76QBLQ" target="_blank" rel="nofollow" data-dimension112="f29bfd88-dfac-49f4-900d-3d224199486f" data-action="Deal Block" data-label="13" iPad Air (WiFi/128GB)" data-dimension48="13" iPad Air (WiFi/128GB)" data-dimension25="$738">View Deal</a></p></div><div class="product"><a data-dimension112="b671be49-bba0-4972-8c3a-b508f7797398" data-action="Deal Block" data-label="11" iPad Pro (WiFi/256GB)" data-dimension48="11" iPad Pro (WiFi/256GB)" data-dimension25="$919" href="https://www.amazon.com/dp/B0D3J6L2ZC" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1309px;"><p class="vanilla-image-block" style="padding-top:114.59%;"><img id="xpzdCL9sJUsDBqZ83ZpxEA" name="iPad Pro 11 M4 deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xpzdCL9sJUsDBqZ83ZpxEA-1920-80.jpg" mos="" align="middle" fullscreen="" width="1309" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/dp/B0D3J6L2ZC" target="_blank" rel="nofollow" data-dimension112="b671be49-bba0-4972-8c3a-b508f7797398" data-action="Deal Block" data-label='11" iPad Pro (WiFi/256GB)' data-dimension48='11" iPad Pro (WiFi/256GB)' data-dimension25="$919">11" iPad Pro (WiFi/256GB): was $999 now $919</a></strong><br>The 11-inch iPad Pro packs Apple's latest M4 processor paired with a stunning 11-inch Tandem OLED (2420 x 1668) display. The new M4 processor features 9 CPU cores and 10 GPU cores. In our <a href="https://www.tomsguide.com/tablets/ipads/ipad-pro-2024">iPad Pro 2024 review,</a> we said it could very well be the most stunning tablet ever made.<a class="view-deal button" href="https://www.amazon.com/dp/B0D3J6L2ZC" target="_blank" rel="nofollow" data-dimension112="b671be49-bba0-4972-8c3a-b508f7797398" data-action="Deal Block" data-label="11" iPad Pro (WiFi/256GB)" data-dimension48="11" iPad Pro (WiFi/256GB)" data-dimension25="$919">View Deal</a></p></div><div class="product"><a data-dimension112="2a29054d-3083-41f0-81b6-53feb34a26dc" data-action="Deal Block" data-label="13" iPad Pro (Wi-Fi/256GB)" data-dimension48="13" iPad Pro (Wi-Fi/256GB)" data-dimension25="$1185" href="https://www.amazon.com/dp/B0D3J98W75" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:954px;"><p class="vanilla-image-block" style="padding-top:109.96%;"><img id="mDVBPrQDtsBwRgt9E49kE" name="6533540cv11d.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/mDVBPrQDtsBwRgt9E49kE-1920-80.jpg" mos="" align="middle" fullscreen="" width="954" height="1049" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/dp/B0D3J98W75" target="_blank" rel="nofollow" data-dimension112="2a29054d-3083-41f0-81b6-53feb34a26dc" data-action="Deal Block" data-label='13" iPad Pro (Wi-Fi/256GB)' data-dimension48='13" iPad Pro (Wi-Fi/256GB)' data-dimension25="$1185">13" iPad Pro (Wi-Fi/256GB): was $1299 now $1185</a></strong><br>At 5.1mm thick, this is one of the thinnest iPads Apple has ever made. It packs Apple's new M4 processor, a 13-inch Ultra Retina XDR display, and 12MP camera.<a class="view-deal button" href="https://www.amazon.com/dp/B0D3J98W75" target="_blank" rel="nofollow" data-dimension112="2a29054d-3083-41f0-81b6-53feb34a26dc" data-action="Deal Block" data-label="13" iPad Pro (Wi-Fi/256GB)" data-dimension48="13" iPad Pro (Wi-Fi/256GB)" data-dimension25="$1185">View Deal</a></p></div><h3 class="article-body__section" id="section-android-tablet-deals"><span>Android tablet deals</span></h3><div class="product"><a data-dimension112="04602701-7ceb-4f21-9375-1250b1dd6c68" data-action="Deal Block" data-label="Fire 7" data-dimension48="Fire 7" data-dimension25="$44" href="https://www.amazon.com/Fire-7-Tablet/dp/B096WJQNZ4" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1310px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="3Y7NWRTUUPUEsgYsWxL9vb" name="hd-fire-8-quick-grid" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/3Y7NWRTUUPUEsgYsWxL9vb-1920-80.jpg" mos="" align="middle" fullscreen="" width="1310" height="1310" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Fire-7-Tablet/dp/B096WJQNZ4" target="_blank" rel="nofollow" data-dimension112="04602701-7ceb-4f21-9375-1250b1dd6c68" data-action="Deal Block" data-label="Fire 7" data-dimension48="Fire 7" data-dimension25="$44">Fire 7: was $59 now $44</a></strong><br>The Amazon Fire HD 7 represents the best value Amazon slate. This tablet packs more power than the last model but is still light and durable. It is an amazingly solid tablet for this reduced price.<a class="view-deal button" href="https://www.amazon.com/Fire-7-Tablet/dp/B096WJQNZ4" target="_blank" rel="nofollow" data-dimension112="04602701-7ceb-4f21-9375-1250b1dd6c68" data-action="Deal Block" data-label="Fire 7" data-dimension48="Fire 7" data-dimension25="$44">View Deal</a></p></div><div class="product"><a data-dimension112="dca6958e-31dc-455e-89f6-7a9234a4628e" data-action="Deal Block" data-label="Fire HD 10" data-dimension48="Fire HD 10" data-dimension25="$104" href="https://www.amazon.com/Amazon_Fire_HD_10/dp/B0BL5PYD69" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:801px;"><p class="vanilla-image-block" style="padding-top:72.03%;"><img id="fFvm9YGaPLpxCWvUNy7zJZ" name="amazon-fire-hd-10-tablet.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/fFvm9YGaPLpxCWvUNy7zJZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="801" height="577" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Amazon Fire HD 10 is an affordable tablet that offers access to a wide range of games and essential apps. It boasts a 25% performance boost over the previous generation and packs a vibrant 10-inch Full HD display. This model comes with 64GB of storage. It's now on sale for a steep discount. As we said in our <a href="https://www.tomsguide.com/reviews/amazon-fire-hd-10-2023" data-dimension112="dca6958e-31dc-455e-89f6-7a9234a4628e" data-action="Deal Block" data-label="Fire HD 10" data-dimension48="Fire HD 10" data-dimension25="$104">Amazon Fire HD 10 review</a>, this is a great entry-level tablet.<a class="view-deal button" href="https://www.amazon.com/Amazon_Fire_HD_10/dp/B0BL5PYD69" target="_blank" rel="nofollow" data-dimension112="dca6958e-31dc-455e-89f6-7a9234a4628e" data-action="Deal Block" data-label="Fire HD 10" data-dimension48="Fire HD 10" data-dimension25="$104">View Deal</a></p></div><div class="product"><a data-dimension112="e15e0269-cd76-4e86-abec-9d81b43477bd" data-action="Deal Block" data-label="Fire Max 11" data-dimension48="Fire Max 11" data-dimension25="$184" href="https://www.amazon.com/Amazon-powerful-display-octa-core-processor/dp/B0B1VQ1ZQY" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="WrgXt6HQ4Vq8HtgRyuqjVn" name="fire-hd-max-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/WrgXt6HQ4Vq8HtgRyuqjVn-1920-80.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/tag/amazon" data-dimension112="e15e0269-cd76-4e86-abec-9d81b43477bd" data-action="Deal Block" data-label="Fire Max 11" data-dimension48="Fire Max 11" data-dimension25="$184">Amazon</a> Fire Max 11 is the company's biggest, most expensive tablet yet, delivering all the promise and pitfalls of FireOS in a sleek 11-inch slate. With its bright 2K (2,000 x 1,200 pixels) display, 4GB of RAM and 2.2Ghz Mediatek chip the Fire Max 11 sets a new bar for what we should expect from a premium Amazon tablet.<a class="view-deal button" href="https://www.amazon.com/Amazon-powerful-display-octa-core-processor/dp/B0B1VQ1ZQY" target="_blank" rel="nofollow" data-dimension112="e15e0269-cd76-4e86-abec-9d81b43477bd" data-action="Deal Block" data-label="Fire Max 11" data-dimension48="Fire Max 11" data-dimension25="$184">View Deal</a></p></div><div class="product"><a data-dimension112="930ee909-edbd-403f-9ff7-6b67953bad64" data-action="Deal Block" data-label="Pixel Tablet" data-dimension48="Pixel Tablet" data-dimension25="$399" href="https://www.amazon.com/dp/B0C1SHGHSZ" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="u8yDk6yKYeXMkdRrQocf9n" name="Google Pixel Tablet.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/u8yDk6yKYeXMkdRrQocf9n-1920-80.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Google Pixel Tablet is one of the best tablets on the market. In our <a href="https://www.tomsguide.com/reviews/google-pixel-tablet" data-dimension112="930ee909-edbd-403f-9ff7-6b67953bad64" data-action="Deal Block" data-label="Pixel Tablet" data-dimension48="Pixel Tablet" data-dimension25="$399">Google Pixel Tablet review</a>, we praised its sharp 8MP f/2.0 cameras, bright 11-inch 2560 x 1600 display, and useful photo editing features. The charging dock adds a strong speaker and excellent smart home functionality. The Google Pixel Tablet is on sale for the first time ever.<a class="view-deal button" href="https://www.amazon.com/dp/B0C1SHGHSZ" target="_blank" rel="nofollow" data-dimension112="930ee909-edbd-403f-9ff7-6b67953bad64" data-action="Deal Block" data-label="Pixel Tablet" data-dimension48="Pixel Tablet" data-dimension25="$399">View Deal</a></p></div><div class="product"><a data-dimension112="8b9e5d69-2b04-43c8-b9a7-2706c54136d3" data-action="Deal Block" data-label="Galaxy Tab S10 Plus" data-dimension48="Galaxy Tab S10 Plus" data-dimension25="$849" href="https://www.amazon.com/SAMSUNG-Android-Durability-Included-Moonstone/dp/B0D84MHZX5" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="LZCYvbnsqbthE8UMb6Pq4T" name="Samsung Galaxy Tab S10 Plus" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/LZCYvbnsqbthE8UMb6Pq4T-1920-80.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Samsung's premium tablet dazzles with its display, AI features and surprisingly good value for a $1k slate. As we said in our <a href="https://www.tomsguide.com/tablets/android-tablets/samsung-galaxy-tab-s10-plus-review-watch-out-ipad-pro" data-dimension112="8b9e5d69-2b04-43c8-b9a7-2706c54136d3" data-action="Deal Block" data-label="Galaxy Tab S10 Plus" data-dimension48="Galaxy Tab S10 Plus" data-dimension25="$849">Samsung Galaxy Tab S10 Plus review</a>, it lacks power and battery longevity compared to its rivals, but still offers enough of both to make this a great high-end purchase for regular users and a potential laptop replacement for certain types of work if you buy the right accessories.<a class="view-deal button" href="https://www.amazon.com/SAMSUNG-Android-Durability-Included-Moonstone/dp/B0D84MHZX5" target="_blank" rel="nofollow" data-dimension112="8b9e5d69-2b04-43c8-b9a7-2706c54136d3" data-action="Deal Block" data-label="Galaxy Tab S10 Plus" data-dimension48="Galaxy Tab S10 Plus" data-dimension25="$849">View Deal</a></p></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/sales-events/amazon-big-spring-sale-my-9-favorite-deals-on-ipads-samsung-and-fire-tablets</link>
                                                                            <description>
                            <![CDATA[ The Amazon Big Spring Sale is almost over, but you can still find some incredible tablet deals. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">9XWdeX4UTE7iURNqKbzdV5</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Q3uwCKekhZsFzMKXdx7Yfm-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 20 Mar 2025 15:34:41 +0000</pubDate>                                                                                                                                <updated>Mon, 31 Mar 2025 13:50:26 +0000</updated>
                                                                                                                                            <category><![CDATA[Sales Events]]></category>
                                                                                                <author><![CDATA[ tony.polanco@futurenet.com (Tony Polanco) ]]></author>                    <dc:creator><![CDATA[ Tony Polanco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/atzRNqFt5wYgEUPBDahWsD-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/Q3uwCKekhZsFzMKXdx7Yfm-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Amazon Big Spring Sale]]></media:description>                                                            <media:text><![CDATA[Amazon Big Spring Sale]]></media:text>
                                <media:title type="plain"><![CDATA[Amazon Big Spring Sale]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Q3uwCKekhZsFzMKXdx7Yfm-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Today is the final day of the <a href="https://www.tomsguide.com/live/news/amazon-big-spring-sale-2025">Amazon Big Spring Sale</a>! That means you only have a few hours to find some of the <a href="https://www.tomsguide.com/best-picks/best-tablet" target="_blank">best tablets</a> at a discount. This includes slates from Apple, Samsung, and, of course, Amazon.</p><p>Some of the <a href="https://www.tomsguide.com/best-picks/best-ipad">best iPad</a> deals right now include the new <a href="https://www.amazon.com/Apple-11-inch-Intelligence-Display-All-Day/dp/B0DZ74YQ1V" target="_blank" rel="nofollow">11-inch iPad Air M3 for $549</a> and the <a href="https://www.amazon.com/Apple-13-inch-Intelligence-Display-All-Day/dp/B0DZ76QBLQ" target="_blank" rel="nofollow">13-inch iPad Air M3 for $738</a>. I also like the <a href="https://www.amazon.com/dp/B0D3J6L2ZC?th=1" target="_blank" rel="nofollow">11-inch iPad Pro M4 for $919</a>, which is a $100 deal. Another awesome deal is the <a href="https://www.amazon.com/New-Apple-iPad-Mini-A17/dp/B0DK3W4YHS?th=1" target="_blank" rel="nofollow">iPad mini 7 for $399</a>.</p><p>Into the <a href="https://www.tomsguide.com/best-picks/best-android-tablets">best Android tablets</a>? If so, you can get a <a href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZMFZ84J?th=1" target="_blank" rel="nofollow">Google Pixel Tablet for $279</a> (a 30% discount) and a <a href="https://www.amazon.com/SAMSUNG-Android-Durability-Included-Moonstone/dp/B0D84MHZX5?th=1" target="_blank" rel="nofollow">Samsung Galaxy Tab S10+ for $150 off</a>. Naturally, Amazon has slashed the price of its tablets, such as the <a href="https://www.amazon.com/Fire-7-Tablet/dp/B096WJQNZ4" target="_blank" rel="nofollow">Amazon Fire 7 for $44</a>.</p><p>Below are the best last-minute tablet deals for the Amazon Big Spring Sale.</p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><strong>Amazon Fire 7: </strong><a href="https://www.amazon.com/Fire-7-Tablet/dp/B096WJQNZ4" target="_blank" rel="nofollow"><strong>was $59 now $44 @ Amazon</strong></a></li><li><strong>Apple 11" iPad (WiFi/128GB): </strong><a href="https://www.amazon.com/dp/B0DZ75TN5F" target="_blank" rel="nofollow"><strong>was $349 now $327 @ Amazon</strong></a><strong></strong></li><li><strong>Apple iPad mini 7: </strong><a href="https://www.amazon.com/New-Apple-iPad-Mini-A17/dp/B0DK3W4YHS" target="_blank" rel="nofollow"><strong>was $499 now $399 @ Amazon</strong></a><strong></strong></li><li><strong>Google Pixel Tablet: </strong><a href="https://www.amazon.com/dp/B0C1SHGHSZ" target="_blank" rel="nofollow"><strong>was $499 now $399 @ Amazon</strong></a><strong></strong></li><li><strong>Apple 11" iPad Air (WiFi/128GB): </strong><a href="https://www.amazon.com/Apple-11-inch-Intelligence-Display-All-Day/dp/B0DZ74YQ1V" target="_blank" rel="nofollow"><strong>was $599 now $549 at Amazon</strong></a><strong></strong></li><li><strong>Apple 13" iPad Air (WiFi/128GB): </strong><a href="https://www.amazon.com/Apple-13-inch-Intelligence-Display-All-Day/dp/B0DZ76QBLQ" target="_blank" rel="nofollow"><strong>was $799 now $738 @ Amazon</strong></a><strong></strong></li><li><strong>Samsung Galaxy Tab S10 Plus: </strong><a href="https://www.amazon.com/SAMSUNG-Android-Durability-Included-Moonstone/dp/B0D84MHZX5" target="_blank" rel="nofollow"><strong>was $999 now $849 @ Amazon</strong></a><strong></strong></li><li><strong>Apple 11" iPad Pro (WiFi/256GB): </strong><a href="https://www.amazon.com/dp/B0D3J6L2ZC" target="_blank" rel="nofollow"><strong>was $999 now $919 @ Amazon</strong></a><strong></strong></li><li><strong>Apple 13" iPad Pro (Wi-Fi/256GB): </strong><a href="https://www.amazon.com/dp/B0D3J98W75" target="_blank" rel="nofollow"><strong>was $1,299 now $1,185 @ Amazon</strong></a><strong></strong></li></ul><h3 class="article-body__section" id="section-ipad-deals"><span>iPad deals</span></h3><div class="product"><a data-dimension112="bd7de28e-f670-4b48-b644-154fd38343db" data-action="Deal Block" data-label="11" iPad (WiFi/128GB)" data-dimension48="11" iPad (WiFi/128GB)" data-dimension25="$327" href="https://www.amazon.com/dp/B0DZ75TN5F" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1325px;"><p class="vanilla-image-block" style="padding-top:113.21%;"><img id="oi25obYHzoyNfMHoycGamh" name="iPad 2022 Blue.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/oi25obYHzoyNfMHoycGamh-1920-80.jpg" mos="" align="middle" fullscreen="" width="1325" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/dp/B0DZ75TN5F" target="_blank" rel="nofollow" data-dimension112="bd7de28e-f670-4b48-b644-154fd38343db" data-action="Deal Block" data-label='11" iPad (WiFi/128GB)' data-dimension48='11" iPad (WiFi/128GB)' data-dimension25="$327">11" iPad (WiFi/128GB): was $349 now $327</a></strong><br>The 2025 iPad features a larger 11-inch (2360 x 1640) screen, A16 CPU, 12MP rear/front cameras, USB-C connectivity, and Magic Keyboard Folio ($249) support. The base model features 128GB of storage, which double the capacity of its predecessor. It's available in 128GB, 256GB, and 512GB capacities. <a class="view-deal button" href="https://www.amazon.com/dp/B0DZ75TN5F" target="_blank" rel="nofollow" data-dimension112="bd7de28e-f670-4b48-b644-154fd38343db" data-action="Deal Block" data-label="11" iPad (WiFi/128GB)" data-dimension48="11" iPad (WiFi/128GB)" data-dimension25="$327">View Deal</a></p></div><div class="product"><a data-dimension112="2ea50fbf-55da-4e46-8cf4-f3b39e1b3c9e" data-action="Deal Block" data-label="iPad mini 7" data-dimension48="iPad mini 7" data-dimension25="$399" href="https://www.amazon.com/New-Apple-iPad-Mini-A17/dp/B0DK3W4YHS" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1203px;"><p class="vanilla-image-block" style="padding-top:124.69%;"><img id="G2PjHEjHsRfuddfWSzPBjd" name="iPad mini 2024 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/G2PjHEjHsRfuddfWSzPBjd-1920-80.jpg" mos="" align="middle" fullscreen="" width="1203" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The new iPad mini is already getting a discount, and any price cut to this small tablet is welcome. We're big fans of its incredibly portable design and long battery life (it lasted 10 hours in our battery life tests.) It comes with speedy performance thanks to Apple's A17 Pro chip, and has a gorgeous 8.3-inch (2,266 x 1,488) Liquid Retina display. You also get 12MP cameras on the front and back and Wi-Fi 6e support. In our <a href="https://www.tomsguide.com/tablets/ipads/ipad-mini-7-review" data-dimension112="2ea50fbf-55da-4e46-8cf4-f3b39e1b3c9e" data-action="Deal Block" data-label="iPad mini 7" data-dimension48="iPad mini 7" data-dimension25="$399">iPad mini 7 review</a>, we said it delivers the full iPad experience in a tiny size. <a class="view-deal button" href="https://www.amazon.com/New-Apple-iPad-Mini-A17/dp/B0DK3W4YHS" target="_blank" rel="nofollow" data-dimension112="2ea50fbf-55da-4e46-8cf4-f3b39e1b3c9e" data-action="Deal Block" data-label="iPad mini 7" data-dimension48="iPad mini 7" data-dimension25="$399">View Deal</a></p></div><div class="product"><a data-dimension112="9ae2f4e8-e1fd-481a-b4a8-d93cac4f3fce" data-action="Deal Block" data-label="11" iPad Air (WiFi/128GB)" data-dimension48="11" iPad Air (WiFi/128GB)" data-dimension25="$549" href="https://www.amazon.com/Apple-11-inch-Intelligence-Display-All-Day/dp/B0DZ74YQ1V" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1325px;"><p class="vanilla-image-block" style="padding-top:113.21%;"><img id="NVZkwX7FuVd3CYdiYHdsgm" name="iPad Air 11 2024 deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/NVZkwX7FuVd3CYdiYHdsgm-1920-80.jpg" mos="" align="middle" fullscreen="" width="1325" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Apple-11-inch-Intelligence-Display-All-Day/dp/B0DZ74YQ1V" target="_blank" rel="nofollow" data-dimension112="9ae2f4e8-e1fd-481a-b4a8-d93cac4f3fce" data-action="Deal Block" data-label='11" iPad Air (WiFi/128GB)' data-dimension48='11" iPad Air (WiFi/128GB)' data-dimension25="$549">11" iPad Air (WiFi/128GB): was $599 now $549</a></strong><br>The 2025 iPad Air packs Apple's M3 processor, an 11-inch LED (2360 x 1640) display, 128GB of storage, 12MP rear camera, and 12MP front camera. The tablet packs a more powerful 8-core CPU, which makes the M3 up to 35% faster for multithreaded CPU workflows than the iPad Air M1. There's also a 9-core GPU on board with 40% faster graphics performance than the M1. In our <a href="https://www.tomsguide.com/tablets/ipads/ipad-air-m3-review">iPad Air M3 review</a> we said its fun Apple Intelligence features, reliable battery life (9 hours w/ 41 minutes), and overall thin design make it a winning Apple slate.<a class="view-deal button" href="https://www.amazon.com/Apple-11-inch-Intelligence-Display-All-Day/dp/B0DZ74YQ1V" target="_blank" rel="nofollow" data-dimension112="9ae2f4e8-e1fd-481a-b4a8-d93cac4f3fce" data-action="Deal Block" data-label="11" iPad Air (WiFi/128GB)" data-dimension48="11" iPad Air (WiFi/128GB)" data-dimension25="$549">View Deal</a></p></div><div class="product"><a data-dimension112="f29bfd88-dfac-49f4-900d-3d224199486f" data-action="Deal Block" data-label="13" iPad Air (WiFi/128GB)" data-dimension48="13" iPad Air (WiFi/128GB)" data-dimension25="$738" href="https://www.amazon.com/Apple-13-inch-Intelligence-Display-All-Day/dp/B0DZ76QBLQ" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1368px;"><p class="vanilla-image-block" style="padding-top:109.65%;"><img id="5LtYHnqoh7QQJRLor82SEG" name="iPad Air 13 2024 deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/5LtYHnqoh7QQJRLor82SEG-1920-80.jpg" mos="" align="middle" fullscreen="" width="1368" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Apple-13-inch-Intelligence-Display-All-Day/dp/B0DZ76QBLQ" target="_blank" rel="nofollow" data-dimension112="f29bfd88-dfac-49f4-900d-3d224199486f" data-action="Deal Block" data-label='13" iPad Air (WiFi/128GB)' data-dimension48='13" iPad Air (WiFi/128GB)' data-dimension25="$738">13" iPad Air (WiFi/128GB): was $799 now $738</a></strong><br>This larger size iPad Air sports the same M3 processor as its 11-inch counterpart, but it's coupled with a 13-inch LED (2732 x 2048) display. Otherwise, it packs the same 128GB of storage, 12MP rear camera, WiFi 6E support, and 12MP front camera. The new CPU and larger display should make this iPad a favorite for gamers.<a class="view-deal button" href="https://www.amazon.com/Apple-13-inch-Intelligence-Display-All-Day/dp/B0DZ76QBLQ" target="_blank" rel="nofollow" data-dimension112="f29bfd88-dfac-49f4-900d-3d224199486f" data-action="Deal Block" data-label="13" iPad Air (WiFi/128GB)" data-dimension48="13" iPad Air (WiFi/128GB)" data-dimension25="$738">View Deal</a></p></div><div class="product"><a data-dimension112="b671be49-bba0-4972-8c3a-b508f7797398" data-action="Deal Block" data-label="11" iPad Pro (WiFi/256GB)" data-dimension48="11" iPad Pro (WiFi/256GB)" data-dimension25="$919" href="https://www.amazon.com/dp/B0D3J6L2ZC" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1309px;"><p class="vanilla-image-block" style="padding-top:114.59%;"><img id="xpzdCL9sJUsDBqZ83ZpxEA" name="iPad Pro 11 M4 deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xpzdCL9sJUsDBqZ83ZpxEA-1920-80.jpg" mos="" align="middle" fullscreen="" width="1309" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/dp/B0D3J6L2ZC" target="_blank" rel="nofollow" data-dimension112="b671be49-bba0-4972-8c3a-b508f7797398" data-action="Deal Block" data-label='11" iPad Pro (WiFi/256GB)' data-dimension48='11" iPad Pro (WiFi/256GB)' data-dimension25="$919">11" iPad Pro (WiFi/256GB): was $999 now $919</a></strong><br>The 11-inch iPad Pro packs Apple's latest M4 processor paired with a stunning 11-inch Tandem OLED (2420 x 1668) display. The new M4 processor features 9 CPU cores and 10 GPU cores. In our <a href="https://www.tomsguide.com/tablets/ipads/ipad-pro-2024">iPad Pro 2024 review,</a> we said it could very well be the most stunning tablet ever made.<a class="view-deal button" href="https://www.amazon.com/dp/B0D3J6L2ZC" target="_blank" rel="nofollow" data-dimension112="b671be49-bba0-4972-8c3a-b508f7797398" data-action="Deal Block" data-label="11" iPad Pro (WiFi/256GB)" data-dimension48="11" iPad Pro (WiFi/256GB)" data-dimension25="$919">View Deal</a></p></div><div class="product"><a data-dimension112="2a29054d-3083-41f0-81b6-53feb34a26dc" data-action="Deal Block" data-label="13" iPad Pro (Wi-Fi/256GB)" data-dimension48="13" iPad Pro (Wi-Fi/256GB)" data-dimension25="$1185" href="https://www.amazon.com/dp/B0D3J98W75" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:954px;"><p class="vanilla-image-block" style="padding-top:109.96%;"><img id="mDVBPrQDtsBwRgt9E49kE" name="6533540cv11d.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/mDVBPrQDtsBwRgt9E49kE-1920-80.jpg" mos="" align="middle" fullscreen="" width="954" height="1049" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/dp/B0D3J98W75" target="_blank" rel="nofollow" data-dimension112="2a29054d-3083-41f0-81b6-53feb34a26dc" data-action="Deal Block" data-label='13" iPad Pro (Wi-Fi/256GB)' data-dimension48='13" iPad Pro (Wi-Fi/256GB)' data-dimension25="$1185">13" iPad Pro (Wi-Fi/256GB): was $1299 now $1185</a></strong><br>At 5.1mm thick, this is one of the thinnest iPads Apple has ever made. It packs Apple's new M4 processor, a 13-inch Ultra Retina XDR display, and 12MP camera.<a class="view-deal button" href="https://www.amazon.com/dp/B0D3J98W75" target="_blank" rel="nofollow" data-dimension112="2a29054d-3083-41f0-81b6-53feb34a26dc" data-action="Deal Block" data-label="13" iPad Pro (Wi-Fi/256GB)" data-dimension48="13" iPad Pro (Wi-Fi/256GB)" data-dimension25="$1185">View Deal</a></p></div><h3 class="article-body__section" id="section-android-tablet-deals"><span>Android tablet deals</span></h3><div class="product"><a data-dimension112="04602701-7ceb-4f21-9375-1250b1dd6c68" data-action="Deal Block" data-label="Fire 7" data-dimension48="Fire 7" data-dimension25="$44" href="https://www.amazon.com/Fire-7-Tablet/dp/B096WJQNZ4" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1310px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="3Y7NWRTUUPUEsgYsWxL9vb" name="hd-fire-8-quick-grid" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/3Y7NWRTUUPUEsgYsWxL9vb-1920-80.jpg" mos="" align="middle" fullscreen="" width="1310" height="1310" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Fire-7-Tablet/dp/B096WJQNZ4" target="_blank" rel="nofollow" data-dimension112="04602701-7ceb-4f21-9375-1250b1dd6c68" data-action="Deal Block" data-label="Fire 7" data-dimension48="Fire 7" data-dimension25="$44">Fire 7: was $59 now $44</a></strong><br>The Amazon Fire HD 7 represents the best value Amazon slate. This tablet packs more power than the last model but is still light and durable. It is an amazingly solid tablet for this reduced price.<a class="view-deal button" href="https://www.amazon.com/Fire-7-Tablet/dp/B096WJQNZ4" target="_blank" rel="nofollow" data-dimension112="04602701-7ceb-4f21-9375-1250b1dd6c68" data-action="Deal Block" data-label="Fire 7" data-dimension48="Fire 7" data-dimension25="$44">View Deal</a></p></div><div class="product"><a data-dimension112="dca6958e-31dc-455e-89f6-7a9234a4628e" data-action="Deal Block" data-label="Fire HD 10" data-dimension48="Fire HD 10" data-dimension25="$104" href="https://www.amazon.com/Amazon_Fire_HD_10/dp/B0BL5PYD69" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:801px;"><p class="vanilla-image-block" style="padding-top:72.03%;"><img id="fFvm9YGaPLpxCWvUNy7zJZ" name="amazon-fire-hd-10-tablet.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/fFvm9YGaPLpxCWvUNy7zJZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="801" height="577" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Amazon Fire HD 10 is an affordable tablet that offers access to a wide range of games and essential apps. It boasts a 25% performance boost over the previous generation and packs a vibrant 10-inch Full HD display. This model comes with 64GB of storage. It's now on sale for a steep discount. As we said in our <a href="https://www.tomsguide.com/reviews/amazon-fire-hd-10-2023" data-dimension112="dca6958e-31dc-455e-89f6-7a9234a4628e" data-action="Deal Block" data-label="Fire HD 10" data-dimension48="Fire HD 10" data-dimension25="$104">Amazon Fire HD 10 review</a>, this is a great entry-level tablet.<a class="view-deal button" href="https://www.amazon.com/Amazon_Fire_HD_10/dp/B0BL5PYD69" target="_blank" rel="nofollow" data-dimension112="dca6958e-31dc-455e-89f6-7a9234a4628e" data-action="Deal Block" data-label="Fire HD 10" data-dimension48="Fire HD 10" data-dimension25="$104">View Deal</a></p></div><div class="product"><a data-dimension112="e15e0269-cd76-4e86-abec-9d81b43477bd" data-action="Deal Block" data-label="Fire Max 11" data-dimension48="Fire Max 11" data-dimension25="$184" href="https://www.amazon.com/Amazon-powerful-display-octa-core-processor/dp/B0B1VQ1ZQY" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="WrgXt6HQ4Vq8HtgRyuqjVn" name="fire-hd-max-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/WrgXt6HQ4Vq8HtgRyuqjVn-1920-80.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/tag/amazon" data-dimension112="e15e0269-cd76-4e86-abec-9d81b43477bd" data-action="Deal Block" data-label="Fire Max 11" data-dimension48="Fire Max 11" data-dimension25="$184">Amazon</a> Fire Max 11 is the company's biggest, most expensive tablet yet, delivering all the promise and pitfalls of FireOS in a sleek 11-inch slate. With its bright 2K (2,000 x 1,200 pixels) display, 4GB of RAM and 2.2Ghz Mediatek chip the Fire Max 11 sets a new bar for what we should expect from a premium Amazon tablet.<a class="view-deal button" href="https://www.amazon.com/Amazon-powerful-display-octa-core-processor/dp/B0B1VQ1ZQY" target="_blank" rel="nofollow" data-dimension112="e15e0269-cd76-4e86-abec-9d81b43477bd" data-action="Deal Block" data-label="Fire Max 11" data-dimension48="Fire Max 11" data-dimension25="$184">View Deal</a></p></div><div class="product"><a data-dimension112="930ee909-edbd-403f-9ff7-6b67953bad64" data-action="Deal Block" data-label="Pixel Tablet" data-dimension48="Pixel Tablet" data-dimension25="$399" href="https://www.amazon.com/dp/B0C1SHGHSZ" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="u8yDk6yKYeXMkdRrQocf9n" name="Google Pixel Tablet.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/u8yDk6yKYeXMkdRrQocf9n-1920-80.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Google Pixel Tablet is one of the best tablets on the market. In our <a href="https://www.tomsguide.com/reviews/google-pixel-tablet" data-dimension112="930ee909-edbd-403f-9ff7-6b67953bad64" data-action="Deal Block" data-label="Pixel Tablet" data-dimension48="Pixel Tablet" data-dimension25="$399">Google Pixel Tablet review</a>, we praised its sharp 8MP f/2.0 cameras, bright 11-inch 2560 x 1600 display, and useful photo editing features. The charging dock adds a strong speaker and excellent smart home functionality. The Google Pixel Tablet is on sale for the first time ever.<a class="view-deal button" href="https://www.amazon.com/dp/B0C1SHGHSZ" target="_blank" rel="nofollow" data-dimension112="930ee909-edbd-403f-9ff7-6b67953bad64" data-action="Deal Block" data-label="Pixel Tablet" data-dimension48="Pixel Tablet" data-dimension25="$399">View Deal</a></p></div><div class="product"><a data-dimension112="8b9e5d69-2b04-43c8-b9a7-2706c54136d3" data-action="Deal Block" data-label="Galaxy Tab S10 Plus" data-dimension48="Galaxy Tab S10 Plus" data-dimension25="$849" href="https://www.amazon.com/SAMSUNG-Android-Durability-Included-Moonstone/dp/B0D84MHZX5" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="LZCYvbnsqbthE8UMb6Pq4T" name="Samsung Galaxy Tab S10 Plus" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/LZCYvbnsqbthE8UMb6Pq4T-1920-80.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Samsung's premium tablet dazzles with its display, AI features and surprisingly good value for a $1k slate. As we said in our <a href="https://www.tomsguide.com/tablets/android-tablets/samsung-galaxy-tab-s10-plus-review-watch-out-ipad-pro" data-dimension112="8b9e5d69-2b04-43c8-b9a7-2706c54136d3" data-action="Deal Block" data-label="Galaxy Tab S10 Plus" data-dimension48="Galaxy Tab S10 Plus" data-dimension25="$849">Samsung Galaxy Tab S10 Plus review</a>, it lacks power and battery longevity compared to its rivals, but still offers enough of both to make this a great high-end purchase for regular users and a potential laptop replacement for certain types of work if you buy the right accessories.<a class="view-deal button" href="https://www.amazon.com/SAMSUNG-Android-Durability-Included-Moonstone/dp/B0D84MHZX5" target="_blank" rel="nofollow" data-dimension112="8b9e5d69-2b04-43c8-b9a7-2706c54136d3" data-action="Deal Block" data-label="Galaxy Tab S10 Plus" data-dimension48="Galaxy Tab S10 Plus" data-dimension25="$849">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Google Pixel Tablet just crashed to $279 on Amazon — get $120 off right now ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Google Pixel Tablet is quite an underrated device. Not only does it come with Google's Pixel launcher and super fast Android updates, it’s also incredibly useful if you want a slate that seamlessly links with your smart home. </p><p>So when I tell you that you can pick up the<a href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZMFZ84J" target="_blank" rel="nofollow"> Pixel Tablet for just $279 at Amazon</a>, you might want to pay attention. That’s $120 off the usual price of $399, and one of the lowest prices we’ve ever seen this device go.</p><p>If you need more storage space, <a href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZM9N4ZS" target="_blank" rel="nofollow">the 256GB model is $359,</a> down from $499 — a $140 savings.</p><div class="product"><a data-dimension112="084b4ce1-103e-47b9-8690-67cf61f3d794" data-action="Deal Block" data-label="Pixel Tablet (128GB)" data-dimension48="Pixel Tablet (128GB)" data-dimension25="$279" href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZMFZ84J" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="jJFW9x8Ji4jgNdto5SGnLD" name="google pixel tablet deal image" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/jJFW9x8Ji4jgNdto5SGnLD-1920-80.png" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZMFZ84J" target="_blank" rel="nofollow" data-dimension112="084b4ce1-103e-47b9-8690-67cf61f3d794" data-action="Deal Block" data-label="Pixel Tablet (128GB)" data-dimension48="Pixel Tablet (128GB)" data-dimension25="$279">Pixel Tablet (128GB): was $399 now $279</a></strong><br>Save $120 on Google's Pixel tablet over at Amazon. With it comes excellent screen quality, solid battery life and the ability to control your smart home.</p><p><strong>Price Check:</strong> <a href="https://store.google.com/config/pixel_tablet?hl=en-US&selections=eyJwcm9kdWN0RmFtaWx5IjoiY0dsNFpXeGZkR0ZpYkdWMCJ9" target="_blank" rel="nofollow">$279 @ Google</a> | <a href="https://www.bestbuy.com/site/google-pixel-tablet-11-android-tablet-128gb-wifi-porcelain/6578701.p?" target="_blank" rel="nofollow">$279 @ Best Buy</a><a class="view-deal button" href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZMFZ84J" target="_blank" rel="nofollow" data-dimension112="084b4ce1-103e-47b9-8690-67cf61f3d794" data-action="Deal Block" data-label="Pixel Tablet (128GB)" data-dimension48="Pixel Tablet (128GB)" data-dimension25="$279">View Deal</a></p></div><div class="product"><a data-dimension112="ad083970-bfd3-460c-adc3-a1b32982a1b6" data-action="Deal Block" data-label="Pixel Tablet (256GB)" data-dimension48="Pixel Tablet (256GB)" data-dimension25="$359" href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZM9N4ZS" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:683px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="EDWTJxZzCV6P2ULKZr8bhU" name="google pixel tablet" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/EDWTJxZzCV6P2ULKZr8bhU-1920-80.png" mos="" align="middle" fullscreen="" width="683" height="683" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZM9N4ZS" target="_blank" rel="nofollow" data-dimension112="ad083970-bfd3-460c-adc3-a1b32982a1b6" data-action="Deal Block" data-label="Pixel Tablet (256GB)" data-dimension48="Pixel Tablet (256GB)" data-dimension25="$359">Pixel Tablet (256GB): was $499 now $359</a></strong><br>Since Pixel devices don't support microSD cards, you might want to pay for a little bit more storage. The 256GB Pixel Tablet is the exact same device, just with double the free space. Save $140.</p><p><strong>Price Check: </strong><a href="https://store.google.com/config/pixel_tablet?hl=en-US&selections=eyJwcm9kdWN0RmFtaWx5IjoiY0dsNFpXeGZkR0ZpYkdWMCIsInZhcmlhbnRzIjpbWyI3IiwiTVE9PSJdLFsiMiIsIk13PT0iXSxbIjEiLCJNalUyIl1dfQ%3D%3D" target="_blank" rel="nofollow">$359 @ Google</a> | <a href="https://www.bestbuy.com/site/google-pixel-tablet-11-android-tablet-128gb-wifi-porcelain/6578701.p?" target="_blank" rel="nofollow">$359 @ Best Buy</a><a class="view-deal button" href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZM9N4ZS" target="_blank" rel="nofollow" data-dimension112="ad083970-bfd3-460c-adc3-a1b32982a1b6" data-action="Deal Block" data-label="Pixel Tablet (256GB)" data-dimension48="Pixel Tablet (256GB)" data-dimension25="$359">View Deal</a></p></div><p>The Pixel Tablet is an excellent device. For starters, it shares many of the same attributes as Google Pixel phone series. The Tensor G2 chipset is a little old, but it still supports a bunch of great AI features, including photo editing and speech recognition.</p><p>We also found that the 11-inch display with 2560 x 1600 resolution was pleasantly crisp in our <a href="https://www.tomsguide.com/reviews/google-pixel-tablet">Google Pixel Tablet review</a>. Not only does content look great on the tablet, it also has some pretty wide viewing angles.</p><p>Camera quality is generally excellent too, for those of you that actually want to take photos with a tablet. You’re also looking at around 12 hours of battery life on a single charge, according to our custom battery test, which beats out the similarly-price <a href="https://www.tomsguide.com/reviews/ipad-2022-10th-gen">iPad 10th generation.</a></p><p>Smart home users can get a lot from the Pixel Tablet as well, since the optional speaker dock can turn the display into a bonafide smart home hub — complete with Chromecast capabilities and smart home controls.</p><p>Sadly, the discounted models don’t come with the dock, and you’ll have to <a href="https://www.amazon.com/Google-Pixel-Tablet-Charging-Speaker/dp/B0C1SLD1PK" target="_blank" rel="nofollow">pay $399 if you want to buy both devices as a bundle</a>. </p><p>Or, if you decide you want to buy the dock later, you can pick one up by itself <a href="https://store.google.com/product/pixel_tablet_charging_speaker_dock?hl=en-US" target="_blank" rel="nofollow">at the Google Store for $129.</a></p><div data-model-name="Google Pixel Tablet" data-widget-type="review"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/tablets/android-tablets/google-pixel-tablet-just-crashed-to-usd279-on-amazon-get-usd120-off-right-now</link>
                                                                            <description>
                            <![CDATA[ Google's Pixel Tablet is an excellent Android slate, and it can be yours for $120 off the regular price. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">fQ8NpzqBuwBhhpB2CTv6aA</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/33iysgTujDKY2mEG8i2xu7-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 18 Mar 2025 13:26:29 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/33iysgTujDKY2mEG8i2xu7-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[google pixel tablet held in hand with deal tag]]></media:description>                                                            <media:text><![CDATA[google pixel tablet held in hand with deal tag]]></media:text>
                                <media:title type="plain"><![CDATA[google pixel tablet held in hand with deal tag]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/33iysgTujDKY2mEG8i2xu7-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Google Pixel Tablet is quite an underrated device. Not only does it come with Google's Pixel launcher and super fast Android updates, it’s also incredibly useful if you want a slate that seamlessly links with your smart home. </p><p>So when I tell you that you can pick up the<a href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZMFZ84J" target="_blank" rel="nofollow"> Pixel Tablet for just $279 at Amazon</a>, you might want to pay attention. That’s $120 off the usual price of $399, and one of the lowest prices we’ve ever seen this device go.</p><p>If you need more storage space, <a href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZM9N4ZS" target="_blank" rel="nofollow">the 256GB model is $359,</a> down from $499 — a $140 savings.</p><div class="product"><a data-dimension112="084b4ce1-103e-47b9-8690-67cf61f3d794" data-action="Deal Block" data-label="Pixel Tablet (128GB)" data-dimension48="Pixel Tablet (128GB)" data-dimension25="$279" href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZMFZ84J" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="jJFW9x8Ji4jgNdto5SGnLD" name="google pixel tablet deal image" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/jJFW9x8Ji4jgNdto5SGnLD-1920-80.png" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZMFZ84J" target="_blank" rel="nofollow" data-dimension112="084b4ce1-103e-47b9-8690-67cf61f3d794" data-action="Deal Block" data-label="Pixel Tablet (128GB)" data-dimension48="Pixel Tablet (128GB)" data-dimension25="$279">Pixel Tablet (128GB): was $399 now $279</a></strong><br>Save $120 on Google's Pixel tablet over at Amazon. With it comes excellent screen quality, solid battery life and the ability to control your smart home.</p><p><strong>Price Check:</strong> <a href="https://store.google.com/config/pixel_tablet?hl=en-US&selections=eyJwcm9kdWN0RmFtaWx5IjoiY0dsNFpXeGZkR0ZpYkdWMCJ9" target="_blank" rel="nofollow">$279 @ Google</a> | <a href="https://www.bestbuy.com/site/google-pixel-tablet-11-android-tablet-128gb-wifi-porcelain/6578701.p?" target="_blank" rel="nofollow">$279 @ Best Buy</a><a class="view-deal button" href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZMFZ84J" target="_blank" rel="nofollow" data-dimension112="084b4ce1-103e-47b9-8690-67cf61f3d794" data-action="Deal Block" data-label="Pixel Tablet (128GB)" data-dimension48="Pixel Tablet (128GB)" data-dimension25="$279">View Deal</a></p></div><div class="product"><a data-dimension112="ad083970-bfd3-460c-adc3-a1b32982a1b6" data-action="Deal Block" data-label="Pixel Tablet (256GB)" data-dimension48="Pixel Tablet (256GB)" data-dimension25="$359" href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZM9N4ZS" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:683px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="EDWTJxZzCV6P2ULKZr8bhU" name="google pixel tablet" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/EDWTJxZzCV6P2ULKZr8bhU-1920-80.png" mos="" align="middle" fullscreen="" width="683" height="683" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZM9N4ZS" target="_blank" rel="nofollow" data-dimension112="ad083970-bfd3-460c-adc3-a1b32982a1b6" data-action="Deal Block" data-label="Pixel Tablet (256GB)" data-dimension48="Pixel Tablet (256GB)" data-dimension25="$359">Pixel Tablet (256GB): was $499 now $359</a></strong><br>Since Pixel devices don't support microSD cards, you might want to pay for a little bit more storage. The 256GB Pixel Tablet is the exact same device, just with double the free space. Save $140.</p><p><strong>Price Check: </strong><a href="https://store.google.com/config/pixel_tablet?hl=en-US&selections=eyJwcm9kdWN0RmFtaWx5IjoiY0dsNFpXeGZkR0ZpYkdWMCIsInZhcmlhbnRzIjpbWyI3IiwiTVE9PSJdLFsiMiIsIk13PT0iXSxbIjEiLCJNalUyIl1dfQ%3D%3D" target="_blank" rel="nofollow">$359 @ Google</a> | <a href="https://www.bestbuy.com/site/google-pixel-tablet-11-android-tablet-128gb-wifi-porcelain/6578701.p?" target="_blank" rel="nofollow">$359 @ Best Buy</a><a class="view-deal button" href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZM9N4ZS" target="_blank" rel="nofollow" data-dimension112="ad083970-bfd3-460c-adc3-a1b32982a1b6" data-action="Deal Block" data-label="Pixel Tablet (256GB)" data-dimension48="Pixel Tablet (256GB)" data-dimension25="$359">View Deal</a></p></div><p>The Pixel Tablet is an excellent device. For starters, it shares many of the same attributes as Google Pixel phone series. The Tensor G2 chipset is a little old, but it still supports a bunch of great AI features, including photo editing and speech recognition.</p><p>We also found that the 11-inch display with 2560 x 1600 resolution was pleasantly crisp in our <a href="https://www.tomsguide.com/reviews/google-pixel-tablet">Google Pixel Tablet review</a>. Not only does content look great on the tablet, it also has some pretty wide viewing angles.</p><p>Camera quality is generally excellent too, for those of you that actually want to take photos with a tablet. You’re also looking at around 12 hours of battery life on a single charge, according to our custom battery test, which beats out the similarly-price <a href="https://www.tomsguide.com/reviews/ipad-2022-10th-gen">iPad 10th generation.</a></p><p>Smart home users can get a lot from the Pixel Tablet as well, since the optional speaker dock can turn the display into a bonafide smart home hub — complete with Chromecast capabilities and smart home controls.</p><p>Sadly, the discounted models don’t come with the dock, and you’ll have to <a href="https://www.amazon.com/Google-Pixel-Tablet-Charging-Speaker/dp/B0C1SLD1PK" target="_blank" rel="nofollow">pay $399 if you want to buy both devices as a bundle</a>. </p><p>Or, if you decide you want to buy the dock later, you can pick one up by itself <a href="https://store.google.com/product/pixel_tablet_charging_speaker_dock?hl=en-US" target="_blank" rel="nofollow">at the Google Store for $129.</a></p><div data-model-name="Google Pixel Tablet" data-widget-type="review"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ OnePlus Pad 2 Pro specs leak — this tablet is a beast ]]></title>
                                                                                                <dc:content><![CDATA[ <p>OnePlus may be working on a powerful new tablet that could launch this year. The new tablet is reportedly the OnePlus Pad 2 Pro.</p><p>Specs for the beastly new tablet were shared by regular leaker <a href="https://m.weibo.cn/detail/5143384205560370" target="_blank">Digital Chat Station</a> over on Weibo. DCS claimed that that Pro version of the Pad 2 is one of only two tablets expected to launch in the first half of 2025 featuring Qualcomm's Snapdragon 8 Elite chipset.</p><p>However, it's unclear what the other tablet supposedly is and we couldn't find it mentioned in his Weibo feed.</p><h2 id="oneplus-pad-2-pro-reported-specs">OnePlus Pad 2 Pro reported specs</h2><p>As for the OnePlus Pad 2 Pro, DCS says (via machine translation) that the tablet is "more oriented towards gaming and e-sports."</p><p>It's supposed to feature the Snapdragon chip and 16GB of LPDDR5X RAM alongside 1TB of storage. </p><p>It'll also be larger the than the <a href="https://www.tomsguide.com/tablets/android-tablets/oneplus-pad-2-review#section-oneplus-pad-2-review-specs">OnePlus Pad 2</a> with a 13.2-inch LCD display about an inch larger than the 12.1-inch panel on last year's tablet. It should match the Pad 2 with a 3.4K resolution. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="pe6D7tRnQtUZNbseJ7nuLR" name="OnePlus Pad 2--4.jpg" alt="OnePlus Pad 2" src="https://cdn.mos.cms.futurecdn.net/pe6D7tRnQtUZNbseJ7nuLR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>For cameras, the Pro version is supposed to have a 13MP rear camera and an 8MP front cam. </p><p>For charging it'll either have 67W or 80W charging with a "super 10,000-level large battery." If OnePlus is known for one thing it has to be battery life and last year's tablet ran out a 9,000 mAh battery that had provided epic battery life in Tom's Guide testing at nearly 15 hours.</p><p>It's looking like the Pad 2 Pro will likely have even longer battery life with its larger battery and optimization and efficiency with the Qualcomm chip.</p><h2 id="oneplus-pad-3-possible-release-date">OnePlus Pad 3 possible release date</h2><p>If this tablet turns out to be real, the question is whether or not the global audience will get this version. Last year, OnePlus released the OnePlus Pad Pro as a China-only tablet. </p><p>However, the OnePlus Pad 2 that came out in the United States was the same tablet specs-wise. </p><p>If we do see this Pad 2 Pro outside of China it will likely launch as the OnePlus Pad 3. The Pad 2 came out in June of 2024 so we expect a similar launch window for the Pad 3, if it comes to the States.</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/oneplus-phones/oneplus-13-review">OnePlus 13 review: The best Android flagship for the money</a></li><li><a href="https://www.tomsguide.com/phones/oneplus-phones/there-will-be-no-oneplus-open-2-this-year-and-thats-bad-news-for-foldables">OnePlus Open 2 could have been the best foldable of the year — so why is it not happening?</a></li><li><a href="https://www.tomsguide.com/phones/oneplus-is-ditching-this-iconic-feature-and-theres-serious-backlash">OnePlus is ditching this iconic feature — and there's serious backlash</a></li></ul><div data-widget-type="review" data-model-name="Pad 2"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/tablets/android-tablets/oneplus-pad-2-pro-specs-leak-this-tablet-is-a-beast</link>
                                                                            <description>
                            <![CDATA[ Specs for a Pro version of the OnePlus Pad 2 have leaked, revealing a pretty powerful tablet. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Kxfy4LNi257qe9XbfheUqf</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/B2efUu89eYhDvJdGqwzt6L-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 13 Mar 2025 18:11:02 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;br&gt;Send secure tips on Signal: scyo1.55.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/B2efUu89eYhDvJdGqwzt6L-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[OnePlus Pad 2 with keyboard]]></media:description>                                                            <media:text><![CDATA[OnePlus Pad 2 with keyboard]]></media:text>
                                <media:title type="plain"><![CDATA[OnePlus Pad 2 with keyboard]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/B2efUu89eYhDvJdGqwzt6L-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>OnePlus may be working on a powerful new tablet that could launch this year. The new tablet is reportedly the OnePlus Pad 2 Pro.</p><p>Specs for the beastly new tablet were shared by regular leaker <a href="https://m.weibo.cn/detail/5143384205560370" target="_blank">Digital Chat Station</a> over on Weibo. DCS claimed that that Pro version of the Pad 2 is one of only two tablets expected to launch in the first half of 2025 featuring Qualcomm's Snapdragon 8 Elite chipset.</p><p>However, it's unclear what the other tablet supposedly is and we couldn't find it mentioned in his Weibo feed.</p><h2 id="oneplus-pad-2-pro-reported-specs">OnePlus Pad 2 Pro reported specs</h2><p>As for the OnePlus Pad 2 Pro, DCS says (via machine translation) that the tablet is "more oriented towards gaming and e-sports."</p><p>It's supposed to feature the Snapdragon chip and 16GB of LPDDR5X RAM alongside 1TB of storage. </p><p>It'll also be larger the than the <a href="https://www.tomsguide.com/tablets/android-tablets/oneplus-pad-2-review#section-oneplus-pad-2-review-specs">OnePlus Pad 2</a> with a 13.2-inch LCD display about an inch larger than the 12.1-inch panel on last year's tablet. It should match the Pad 2 with a 3.4K resolution. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="pe6D7tRnQtUZNbseJ7nuLR" name="OnePlus Pad 2--4.jpg" alt="OnePlus Pad 2" src="https://cdn.mos.cms.futurecdn.net/pe6D7tRnQtUZNbseJ7nuLR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>For cameras, the Pro version is supposed to have a 13MP rear camera and an 8MP front cam. </p><p>For charging it'll either have 67W or 80W charging with a "super 10,000-level large battery." If OnePlus is known for one thing it has to be battery life and last year's tablet ran out a 9,000 mAh battery that had provided epic battery life in Tom's Guide testing at nearly 15 hours.</p><p>It's looking like the Pad 2 Pro will likely have even longer battery life with its larger battery and optimization and efficiency with the Qualcomm chip.</p><h2 id="oneplus-pad-3-possible-release-date">OnePlus Pad 3 possible release date</h2><p>If this tablet turns out to be real, the question is whether or not the global audience will get this version. Last year, OnePlus released the OnePlus Pad Pro as a China-only tablet. </p><p>However, the OnePlus Pad 2 that came out in the United States was the same tablet specs-wise. </p><p>If we do see this Pad 2 Pro outside of China it will likely launch as the OnePlus Pad 3. The Pad 2 came out in June of 2024 so we expect a similar launch window for the Pad 3, if it comes to the States.</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/oneplus-phones/oneplus-13-review">OnePlus 13 review: The best Android flagship for the money</a></li><li><a href="https://www.tomsguide.com/phones/oneplus-phones/there-will-be-no-oneplus-open-2-this-year-and-thats-bad-news-for-foldables">OnePlus Open 2 could have been the best foldable of the year — so why is it not happening?</a></li><li><a href="https://www.tomsguide.com/phones/oneplus-is-ditching-this-iconic-feature-and-theres-serious-backlash">OnePlus is ditching this iconic feature — and there's serious backlash</a></li></ul><div data-widget-type="review" data-model-name="Pad 2"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung Galaxy Tab S10 Plus review: Watch out iPad Pro ]]></title>
                                                                                                <dc:content><![CDATA[ <div data-model-name="Samsung Galaxy Tab S10 Plus" data-widget-type="review"></div><p>The Samsung Galaxy Tab S10 Plus has arrived with little fanfare, which seems unfair given that it is the Android tablet world's best answer to the <a href="https://www.tomsguide.com/tablets/ipads/ipad-pro-2024" target="_blank">iPad Pro</a>, for better or for worse.</p><p>While it's smaller than its sibling, the <a href="https://www.tomsguide.com/tablets/android-tablets/samsung-galaxy-tab-s10-ultra-review">Samsung Galaxy Tab S10 Ultra</a>, this is still a big tablet with big specs, which is especially noticeable with its display. And although it's got a higher up-front cost than many tablets, the included S Pen stylus and guaranteed seven years of updates mean it's got more immediate and long-term benefits than its rivals.</p><p>All it asks for in return are regular visits to the charger and that you forgive it for not scoring as highly on benchmarks as its Apple-made competition.</p><p>Even setting the <a href="https://www.tomsguide.com/best-picks/best-ipad">best iPads</a> aside, we have other Android tablets we'd recommend ahead of the Tab S10 Plus for both typical and pro-level users. But maybe users who want to split the difference between power, size and price, and especially users who own a Galaxy phone, will find this as one of the <a href="https://www.tomsguide.com/best-picks/best-android-tablets">best Android tablets</a> by the end of this Galaxy Tab S10 Plus review.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-plus-review-specs"><span>Samsung Galaxy Tab S10 Plus review: Specs</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Samsung Galaxy Tab S10 Plus</strong>    </p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong>    </p></td><td  ><p>$999    </p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong>    </p></td><td  ><p>12.4-inch AMOLED (2,800 x 1,752), 120Hz refresh rate    </p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong>    </p></td><td  ><p>Dimensity 9300+    </p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong>    </p></td><td  ><p>12GB    </p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong>    </p></td><td  ><p>256GB, 512GB    </p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong>    </p></td><td  ><p>1 x USB-C    </p></td></tr><tr><td class="firstcol " ><p><strong>Cameras</strong>    </p></td><td  ><p>13MP main rear, 12MP ultrawide, 12MP front    </p></td></tr><tr><td class="firstcol " ><p><strong>Battery life</strong>    </p></td><td  ><p>8 hours 22 minutes (tested)    </p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong>    </p></td><td  ><p>11.24 x 7.30 x 0.22 inches    </p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong>    </p></td><td  ><p>1.26 pounds    </p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-plus-price-and-availability"><span>Samsung Galaxy Tab S10 Plus: Price and availability</span></h3><p>Samsung put the Galaxy Tab S10 series up for sale at a $999/£999 start price for the standard 256GB Wi-Fi model. There's a 512GB option costing $1,199/£1,099 too, plus 5G versions for those who want built-in connectivity, which are another £150/$150 on top of the price of either storage option.</p><p>This is $200 less than the Galaxy Tab S10 Ultra while offering most of the same functionality in a smaller package. Next to Apple's tablet range, the closest comparison is the <a href="https://www.tomsguide.com/tablets/ipads/ipad-pro-2024">iPad Pro M4</a>, which begins at $999 for the 11-inch version and $1,299 for the larger 13-inch one.</p><p>Going for the Samsung gets you more tablet and more accessories for the money, but you don't have a size choice unless you want to pay the extra to get the cheapest 14.6-inch Tab S10 Ultra.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-plus-design-and-display"><span>Samsung Galaxy Tab S10 Plus: Design and display</span></h3><p>At 1.26 pounds, the Galaxy Tab S10 Plus is lighter than the smaller <a href="https://www.tomsguide.com/tablets/android-tablets/oneplus-pad-2-review">OnePlus Pad 2</a> and Apple's 13-inch Apple tablets. It's only a fraction of a millimeter thicker than the iPad Pro M4, too, showing that Samsung remains competitive even with the toughest of rivals.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XvijAtLw3WBvBTUPTDcCnn" name="Samsung Galaxy Tab S10 Plus" alt="Samsung Galaxy Tab S10 Plus from side, in a case" src="https://cdn.mos.cms.futurecdn.net/XvijAtLw3WBvBTUPTDcCnn-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>That's just as well since the Tab S10 has the same design as the Galaxy Tab S9 series, featuring flat sides with power and volume buttons and a front-facing camera on the long side of the display. Ideal for horizontal use, which is how many tablet apps now expect you to use it.</p><p>The S Pen, an included accessory, has a home in a magnetic strip on the back of the tablet, in line with the dual rear cameras. Other than the antenna lines decorating the edges of the panel, the back of the Tab S10 Plus is as plain as the front.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Turg6VZ8CeUuSdjyrmuahn" name="Samsung Galaxy Tab S10 Plus" alt="Samsung Galaxy Tab S10 Plus back" src="https://cdn.mos.cms.futurecdn.net/Turg6VZ8CeUuSdjyrmuahn-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The optical fingerprint scanner sits under the display on the right side of the tablet (when holding it horizontally), offering a speedy way to log into the tablet. But I'm not sure why the scanner doesn't prompt you to set it up by default. Seems like an obvious thing to do during the setup flow rather than having the user decide later on if they want it or not.</p><p>Colors are the typical limited bland options that premium tablets like to stick to. The Moonstone Gray of my test device looks fine, as does the brighter Platinum option. I'd love for there to be one more fun option, even if there isn't the rainbow of color options you see for cheaper tablets.</p><p>What the Galaxy Tab S10 Plus lacks in dramatic looks, it makes up for with durability. It features IP68 dust/water resistance to protect the tablet's insides from damage and Armor Aluminum for peace of mind in case you drop or scrape the edge of the Tab.</p><p>You can rely on a Samsung tablet to offer some exceptional screen technology. The 12.4-inch AMOLED screen, with its 120Hz maximum refresh rate, is delightfully smooth to navigate and eye-searingly bright at its highest levels.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="eHJ8YVR6nTn43UYum8KYqn" name="Samsung Galaxy Tab S10 Plus" alt="Samsung Galaxy Tab S10 Plus display" src="https://cdn.mos.cms.futurecdn.net/eHJ8YVR6nTn43UYum8KYqn-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>When using the Galaxy Tab horizontally, as Samsung intends you to use it, it feels quite normal, even if I'd prefer a little more vertical space when trying to work from it laptop-style.</p><p>But when held vertically, the Tab feels quite narrow, though that could be because I'm used to using a much squarer iPad Pro. It makes a difference if I'm using the Galaxy Tab as a notepad, as I tend to run out of space quickly when writing, but it feels fine when using apps with regular taps and swipes.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Samsung Galaxy Tab S10 Plus</strong>    </p></td><td  ><p><strong>OnePlus Pad 2</strong>    </p></td><td  ><p><strong>iPad Air (13-inch)</strong>    </p></td><td  ><p><strong>iPad Pro (13-inch)</strong>    </p></td></tr><tr><td class="firstcol " ><p><strong>SDR brightness (nits)</strong>    </p></td><td  ><p>446    </p></td><td  ><p>580    </p></td><td  ><p>572    </p></td><td  ><p>561    </p></td></tr><tr><td class="firstcol " ><p><strong>HDR brightness (nits)</strong>    </p></td><td  ><p>559    </p></td><td  ><p>555    </p></td><td  ><p>577    </p></td><td  ><p>1510    </p></td></tr><tr><td class="firstcol " ><p><strong>sRGB color gamut coverage (%)</strong>    </p></td><td  ><p>139.8    </p></td><td  ><p>105.7    </p></td><td  ><p>110.9    </p></td><td  ><p>117.4    </p></td></tr><tr><td class="firstcol " ><p><strong>DCI-P3 color gamut coverage (%)</strong>    </p></td><td  ><p>99    </p></td><td  ><p>74.9    </p></td><td  ><p>78.6    </p></td><td  ><p>83.2    </p></td></tr><tr><td class="firstcol " ><p><strong>Delta-E color accuracy (lower is better)</strong>    </p></td><td  ><p>0.23    </p></td><td  ><p>0.25    </p></td><td  ><p>0.27    </p></td><td  ><p>0.2    </p></td></tr></tbody></table></div><p>In testing, the Galaxy Tab S10 Plus proved the best in terms of color gamut coverage, especially in its default Vivid color mode. It lags behind the competition in terms of brightness, though, especially compared to the Tandem OLED-powered screen of the iPad Pro.</p><p>Fortunately, the Tab S10 Plus' lower brightness is made up for by my favorite part of its display — its anti-reflective layer. It is easy to see it in action compared to any other screen you'll have to hand (unless you have a <a href="https://www.tomsguide.com/reviews/samsung-galaxy-s24-ultra">Galaxy S24 Ultra</a>, which uses the same style of screen) as soon as you're outside your carefully-lit work environment.</p><p>Using the Galaxy Tab in outdoor or awkward indoor lighting, as is likely to happen when you're trying to use the device on the move, is far easier than other tablets when you combine the anti-glare with the bright OLED display.</p><p>And unlike the nanotexture display option offered on the iPad Pro M4, this coating comes as part of the basic price, is available on all storage options, and doesn't affect the smoothness of the screen either. That's good news for frequent stylus users.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-plus-performance"><span>Samsung Galaxy Tab S10 Plus: Performance</span></h3><p>Unlike previous Samsung Galaxy Tab S models, the Tab S10 series uses a Dimensity 9300+ chipset, rather than one built by Samsung or Qualcomm. But this is still a premium tablet despite the different silicon.</p><p>As the results below show, the Galaxy Tab S10 Plus outperforms the OnePlus Pad 2, currently our favorite Android tablet, on our three main tests. However, Apple's mighty M-series chips still leave the Tab S10 Plus in the dust, especially the latest M4 silicon powering the iPad Pro.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Samsung Galaxy Tab S10 Plus</strong>    </p></td><td  ><p><strong>OnePlus Pad 2</strong>    </p></td><td  ><p><strong>iPad Air (13-inch)</strong>    </p></td><td  ><p><strong>iPad Pro (13-inch)</strong>    </p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong>    </p></td><td  ><p>Dimensity 9300+    </p></td><td  ><p>Snapdragon 8 Gen 3    </p></td><td  ><p>Apple M2    </p></td><td  ><p>Apple M4    </p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6 score (single-core / multi-core)</strong>    </p></td><td  ><p>2,137 / 7,130    </p></td><td  ><p>2,033 / 6,161    </p></td><td  ><p>2,600 / 10,066    </p></td><td  ><p>3,700 / 14,523    </p></td></tr><tr><td class="firstcol " ><p><strong>3DMark Wild Life Extreme Unlimited (score / fps)</strong>    </p></td><td  ><p>5,121 / 30    </p></td><td  ><p>4,440 / 26    </p></td><td  ><p>5829 / 34    </p></td><td  ><p>8,529 / 51    </p></td></tr><tr><td class="firstcol " ><p><strong>Adobe Premiere Rush time to transcode (mins:secs)</strong>    </p></td><td  ><p>0:43    </p></td><td  ><p>0:58    </p></td><td  ><p>0:21    </p></td><td  ><p>0:19    </p></td></tr></tbody></table></div><p>The Tab S10 series retains the vapor chamber cooling of the Tab S9 to keep its performance consistent over long periods of time. While playing Ex Astris, I didn't feel the Tab S10 Plus get warm at all, although with all settings set to Ultra and the frame rate at 60fps, the tablet's performance did stutter, even in sparsely populated areas.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ohhDgbr2tdRfvtyB2v7aqn" name="Samsung Galaxy Tab S10 Plus" alt="Samsung Galaxy Tab S10 Plus playing Ex Astris" src="https://cdn.mos.cms.futurecdn.net/ohhDgbr2tdRfvtyB2v7aqn-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Inside the Tab S10 is 12GB RAM and 256GB storage, or 512GB in its top-specced form. While that's likely enough room for most users, you can still expand the storage with up to a 1.5TB microSD card should you need to. That's not something you can do with the iPad Pro, even if you can get 1TB and 2TB onboard storage versions of that tablet.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-plus-audio"><span>Samsung Galaxy Tab S10 Plus: Audio</span></h3><p>The quad speakers within the Galaxy Tab S10 Plus<strong> </strong>certainly give any audio you play a lot of oomph, especially for low-end notes, making this an ideal tablet for bassheads. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4v9MAnuTVEexo9zT9nYXqn" name="Samsung Galaxy Tab S10 Plus" alt="Samsung Galaxy Tab S10 Plus from behind with stylus, being held in hand" src="https://cdn.mos.cms.futurecdn.net/4v9MAnuTVEexo9zT9nYXqn-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Listening to the complex and chaotic "Transcendental Cha Cha Cha" by Tom Cardy, the synthy bass notes and drum beats anchoring the song came across best on the Samsung tablet, while my old iPad Pro helped emphasize the castanets, drum machine cymbals, guitar and Cardy's vocals.</p><p>Personally, the high-end frequency focus of the iPad Pro's speakers, which brings out more of a track's regular instruments and the percussion parts, is more to my taste. But I still enjoyed listening to music, watching videos and playing games on the Samsung tablet.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-plus-battery-and-charging"><span>Samsung Galaxy Tab S10 Plus: Battery and charging</span></h3><p>The 10,090 mAh battery within the Galaxy Tab S10 Plus is pretty large, but the tablet only lasted 8 hours and 22 minutes on our custom TG battery test (constantly browsing the internet from 100% to 0% charge).</p><p>Compared to the incredible 14 hours and 8 minutes that the OnePlus Pad 2 lasted, or the similarly strong 13 hours and 13 minutes or 9 hours and 41 minutes that the iPad Pro M4 and <a href="https://www.tomsguide.com/tablets/ipads/ipad-air-m3-review">iPad Air M3</a> (respectively) achieved, that's not particularly impressive.</p><p>Anecdotally, I got about 10 hours of screen-on time per charge, perhaps because most of my use wasn't as power-hungry as opening web pages non-stop. I imagine I'd still get more use between charges out of the other tablets we've mentioned, but you can still be confident in the Tab S10 Plus lasting a full day of work if you're nervous about the benchmark result above.</p><p>The Tab S10 Plus supports 45W wired charging, but you won't find a charger in the box. Fortunately, we have a compatible charger in our test lab, and we found that the Tab S10 Plus powers from 0% to 40% in 30 minutes. That's pretty good if you need a mid-day refuel, but it's a pity you'll be paying extra for the privilege of this speed.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-plus-cameras"><span>Samsung Galaxy Tab S10 Plus: Cameras</span></h3><p>Samsung has stuck to including two cameras on the back Galaxy Tab S10 series, even while Apple's dropped the ultrawide from the back of the iPad Pro. The 13MP main and 12MP ultrawide sensors are identical between the Tab S10 Plus and Tab S10 Ultra, as is the 12MP front camera.</p><p>But the Ultra gets an additional 12MP ultrawide sensor in its camera notch, as befitting its higher status and price.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/88xeFWMyLHBortECvPaauU-1920-80.jpg" alt="Main camera sample from the Samsung Galaxy Tab S10 Plus" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/AwBoAJX4iXfbG7NJ6PQ8pU-1920-80.jpg" alt="Selfie camera sample from the Samsung Galaxy Tab S10 Plus" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure></figure><p>Tablet cameras are not meant for hardcore photography, which is why it's not surprising to see these shots of a coffee plant and a selfie look a little grainy and dark, even for an indoor environment.</p><p>The cameras are more than passable for making video calls, though, which is by far the most common thing you'll be using them for on the Tab S10 Plus.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-plus-accessories"><span>Samsung Galaxy Tab S10 Plus: Accessories</span></h3><p>The S Pen still comes with the Galaxy Tab by default, and is a smooth and low-latency stylus that I loved using.</p><p>It's very different from using an Apple Pencil Pro, with its mechanical button for accessing alternative tools and softer tip. But as someone who mostly uses styluses for taking notes and the odd doodle, I don't miss advanced features like Hover or Barrel Roll.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Vgtxs2mNhkndnxkRD8yRpn" name="Samsung Galaxy Tab S10 Plus" alt="Samsung Galaxy Tab S10 Plus S Pen on magnetic storage strip, with case storage flap held up" src="https://cdn.mos.cms.futurecdn.net/Vgtxs2mNhkndnxkRD8yRpn-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The other main accessory Samsung offers is the AI Book Cover Keyboard, which costs $229/£229 extra. As well as adding an adjustable stand to the tablet, the keyboard itself feels pretty nice to type on and can be used separately from the stand, depending on your needs. However, the trackpad can feel a bit wonky depending on the app you try to use it in.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="er66rEgUUJ7z9Qi9rk8uon" name="Samsung Galaxy Tab S10 Plus" alt="Samsung Galaxy Tab S10 Plus with keyboard" src="https://cdn.mos.cms.futurecdn.net/er66rEgUUJ7z9Qi9rk8uon-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>This revised keyboard also features an AI key, which acts as a shortcut to either Bixby or Google Gemini, as you prefer. It doesn't activate any contextual Galaxy AI features sadly, which I feel would have been a better use of a dedicated key.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-plus-software-and-ai"><span>Samsung Galaxy Tab S10 Plus: Software and AI</span></h3><p>Samsung has brought its seven-year software support promise from its recent phones to the Galaxy Tab S10 series. That means the Tab S10 series will see full OS and security updates until the end of October 2031, which is the best guaranteed software support of any tablet.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="srf4aswErwWwateTCeLtpn" name="Samsung Galaxy Tab S10 Plus" alt="Samsung Galaxy Tab S10 Plus in DeX mode" src="https://cdn.mos.cms.futurecdn.net/srf4aswErwWwateTCeLtpn-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Returning from previous Galaxy Tabs is DeX mode, which switches the standard Android interface to a more laptop-style one. You can open multiple windows and move them around freely or into up to four tiled spots, which offers a reasonable amount of freedom for work if your workflow can be translated into Android apps.</p><p>In my case, this was normally very easy since I'm usually writing in or referring to one Google Workspace app or another. However, when I would normally use a company-made Chrome extension to make adjustments to a document or go into Tom's Guide's back-end, it was normally wiser to lock the Tab S10 Plus and open up my laptop instead.</p><p>If you prefer to keep things traditional, split view for apps is back, letting you divide the screen between three apps. But this is the traditional style of cramming everything into the screen, rather than the smarter OnePlus Open Canvas system that lets you shift parts of the interface off-screen as required. But the 12.4-inch screen is still plenty large enough to work off an app running at a quarter of its regular size.</p><p>I wrote a large part of this review with Google Docs squished into the corner of the screen while my notes and Chrome were open at the same time. It's still not the same level of multitasking that a proper laptop can manage, but it's probably more than enough for most people.</p><p>Galaxy AI isn't new to the Galaxy Tab line, but the Tab S10 series is the first set of models to launch with Samsung's AI features included. Once you're settled into the tablet, you can try out features like transforming doodles into more polished versions with Sketch to Image, translating PDFs via an overlay, recording and transcription tools and equation-solving built into the Notes app. You also get the ability to reformat, translate or summarize text across the tablet's One UI interface.</p><p>And if that wasn't enough, Google Circle to Search is also available to help you learn about anything curious that appears on your travels.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RPaFh9rr9nxZgt3JCpj8mn" name="Samsung Galaxy Tab S10 Plus" alt="Samsung Galaxy Tab S10 Plus drawing tools" src="https://cdn.mos.cms.futurecdn.net/RPaFh9rr9nxZgt3JCpj8mn-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Having a larger, split-screen canvas makes sense for many of these tools, even if they're no different in function from the version you'll get on a <a href="https://www.tomsguide.com/reviews/samsung-galaxy-s24">Galaxy S24</a> or <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-6-review-test-results">Galaxy Z Fold 6</a>.</p><p>Some abilities, like live translation or photo editing, still suit those smaller, more camera-focused devices. But in tablet terms, Samsung has a far more mature AI suite than the OnePlus Pad's OxygenOS or Apple's iPadOS, and makes up for any features it lacks compared to the Pixel Tablet by offering far superior hardware.</p><p>For me, the translation tools (which work without an internet connection if you've downloaded the languages needed already) plus the text formatting tools are well worth using.</p><p>Since I'm not much of an artist or photo editor, Sketch to Image doesn't have much to offer me beyond showing it to curious friends. And while I wish the audio transcription tools sounded amazing, these are still flummoxed by anyone reading at above-average pace with less-than-perfect enunciation.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-plus-review-verdict"><span>Samsung Galaxy Tab S10 Plus review: Verdict </span></h3><p>While not Samsung's ultimate tablet, the Galaxy Tab S10 Plus seems a more well-rounded choice in terms of price and portability compared to the Tab S10 Ultra. And that applies to the competition too, since it roughly splits the difference between the 11-inch and 13-inch size of Apple's comparable iPads, while being no more expensive, especially when you consider the stylus is bundled in for free.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kZ5iXCz8x7XvRUhEMA3Jon" name="Samsung Galaxy Tab S10 Plus" alt="Samsung Galaxy Tab S10 Plus from behind" src="https://cdn.mos.cms.futurecdn.net/kZ5iXCz8x7XvRUhEMA3Jon-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Tablet users, be it for work or play, will appreciate the Tab S10 Plus' brilliant screen and its generous software updates. The bevy of productivity and creativity features between regular software and Galaxy AI also makes this tablet handy for all kinds of users.</p><p>However, the weak battery life and middling performance perhaps mean this isn't as capable a laptop replacement as an iPad would be, although that changes depending on what other devices you're using.</p><p>Samsung has once again staked a claim on a spot on our best Android tablets list with the Galaxy Tab S10 Plus. The OnePlus Pad remains a far better value device, and could win you over with its battery life alone, but Samsung is the way to go if you seek the best and most complete experience for your Android tablet.</p><div data-model-name="Samsung Galaxy Tab S10 Plus" data-widget-type="review"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/tablets/android-tablets/samsung-galaxy-tab-s10-plus-review-watch-out-ipad-pro</link>
                                                                            <description>
                            <![CDATA[ The Galaxy Tab S10 Plus is overshadowed by its Ultra sibling, but its smaller size, impressive display, stylus, and software make it a brilliant premium tablet nonetheless. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">jVg3wEXKHa8yVLxj6FvdKc</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/CLouTWTapkq8teDyuVRVon-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 13 Mar 2025 14:02:39 +0000</pubDate>                                                                                                                                <updated>Thu, 04 Jun 2026 12:51:43 +0000</updated>
                                                                                                                                            <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></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-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Richard is a writer based in London, covering 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&amp;#39;s features with similar devices&amp;#39;, and figure out if something&amp;#39;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&amp;#39;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&amp;#39;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&amp;#39;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/CLouTWTapkq8teDyuVRVon-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Tab S10 Plus with keyboard and S Pen]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Tab S10 Plus with keyboard and S Pen]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Tab S10 Plus with keyboard and S Pen]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/CLouTWTapkq8teDyuVRVon-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div data-model-name="Samsung Galaxy Tab S10 Plus" data-widget-type="review"></div><p>The Samsung Galaxy Tab S10 Plus has arrived with little fanfare, which seems unfair given that it is the Android tablet world's best answer to the <a href="https://www.tomsguide.com/tablets/ipads/ipad-pro-2024" target="_blank">iPad Pro</a>, for better or for worse.</p><p>While it's smaller than its sibling, the <a href="https://www.tomsguide.com/tablets/android-tablets/samsung-galaxy-tab-s10-ultra-review">Samsung Galaxy Tab S10 Ultra</a>, this is still a big tablet with big specs, which is especially noticeable with its display. And although it's got a higher up-front cost than many tablets, the included S Pen stylus and guaranteed seven years of updates mean it's got more immediate and long-term benefits than its rivals.</p><p>All it asks for in return are regular visits to the charger and that you forgive it for not scoring as highly on benchmarks as its Apple-made competition.</p><p>Even setting the <a href="https://www.tomsguide.com/best-picks/best-ipad">best iPads</a> aside, we have other Android tablets we'd recommend ahead of the Tab S10 Plus for both typical and pro-level users. But maybe users who want to split the difference between power, size and price, and especially users who own a Galaxy phone, will find this as one of the <a href="https://www.tomsguide.com/best-picks/best-android-tablets">best Android tablets</a> by the end of this Galaxy Tab S10 Plus review.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-plus-review-specs"><span>Samsung Galaxy Tab S10 Plus review: Specs</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Samsung Galaxy Tab S10 Plus</strong>    </p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong>    </p></td><td  ><p>$999    </p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong>    </p></td><td  ><p>12.4-inch AMOLED (2,800 x 1,752), 120Hz refresh rate    </p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong>    </p></td><td  ><p>Dimensity 9300+    </p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong>    </p></td><td  ><p>12GB    </p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong>    </p></td><td  ><p>256GB, 512GB    </p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong>    </p></td><td  ><p>1 x USB-C    </p></td></tr><tr><td class="firstcol " ><p><strong>Cameras</strong>    </p></td><td  ><p>13MP main rear, 12MP ultrawide, 12MP front    </p></td></tr><tr><td class="firstcol " ><p><strong>Battery life</strong>    </p></td><td  ><p>8 hours 22 minutes (tested)    </p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong>    </p></td><td  ><p>11.24 x 7.30 x 0.22 inches    </p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong>    </p></td><td  ><p>1.26 pounds    </p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-plus-price-and-availability"><span>Samsung Galaxy Tab S10 Plus: Price and availability</span></h3><p>Samsung put the Galaxy Tab S10 series up for sale at a $999/£999 start price for the standard 256GB Wi-Fi model. There's a 512GB option costing $1,199/£1,099 too, plus 5G versions for those who want built-in connectivity, which are another £150/$150 on top of the price of either storage option.</p><p>This is $200 less than the Galaxy Tab S10 Ultra while offering most of the same functionality in a smaller package. Next to Apple's tablet range, the closest comparison is the <a href="https://www.tomsguide.com/tablets/ipads/ipad-pro-2024">iPad Pro M4</a>, which begins at $999 for the 11-inch version and $1,299 for the larger 13-inch one.</p><p>Going for the Samsung gets you more tablet and more accessories for the money, but you don't have a size choice unless you want to pay the extra to get the cheapest 14.6-inch Tab S10 Ultra.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-plus-design-and-display"><span>Samsung Galaxy Tab S10 Plus: Design and display</span></h3><p>At 1.26 pounds, the Galaxy Tab S10 Plus is lighter than the smaller <a href="https://www.tomsguide.com/tablets/android-tablets/oneplus-pad-2-review">OnePlus Pad 2</a> and Apple's 13-inch Apple tablets. It's only a fraction of a millimeter thicker than the iPad Pro M4, too, showing that Samsung remains competitive even with the toughest of rivals.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XvijAtLw3WBvBTUPTDcCnn" name="Samsung Galaxy Tab S10 Plus" alt="Samsung Galaxy Tab S10 Plus from side, in a case" src="https://cdn.mos.cms.futurecdn.net/XvijAtLw3WBvBTUPTDcCnn-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>That's just as well since the Tab S10 has the same design as the Galaxy Tab S9 series, featuring flat sides with power and volume buttons and a front-facing camera on the long side of the display. Ideal for horizontal use, which is how many tablet apps now expect you to use it.</p><p>The S Pen, an included accessory, has a home in a magnetic strip on the back of the tablet, in line with the dual rear cameras. Other than the antenna lines decorating the edges of the panel, the back of the Tab S10 Plus is as plain as the front.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Turg6VZ8CeUuSdjyrmuahn" name="Samsung Galaxy Tab S10 Plus" alt="Samsung Galaxy Tab S10 Plus back" src="https://cdn.mos.cms.futurecdn.net/Turg6VZ8CeUuSdjyrmuahn-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The optical fingerprint scanner sits under the display on the right side of the tablet (when holding it horizontally), offering a speedy way to log into the tablet. But I'm not sure why the scanner doesn't prompt you to set it up by default. Seems like an obvious thing to do during the setup flow rather than having the user decide later on if they want it or not.</p><p>Colors are the typical limited bland options that premium tablets like to stick to. The Moonstone Gray of my test device looks fine, as does the brighter Platinum option. I'd love for there to be one more fun option, even if there isn't the rainbow of color options you see for cheaper tablets.</p><p>What the Galaxy Tab S10 Plus lacks in dramatic looks, it makes up for with durability. It features IP68 dust/water resistance to protect the tablet's insides from damage and Armor Aluminum for peace of mind in case you drop or scrape the edge of the Tab.</p><p>You can rely on a Samsung tablet to offer some exceptional screen technology. The 12.4-inch AMOLED screen, with its 120Hz maximum refresh rate, is delightfully smooth to navigate and eye-searingly bright at its highest levels.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="eHJ8YVR6nTn43UYum8KYqn" name="Samsung Galaxy Tab S10 Plus" alt="Samsung Galaxy Tab S10 Plus display" src="https://cdn.mos.cms.futurecdn.net/eHJ8YVR6nTn43UYum8KYqn-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>When using the Galaxy Tab horizontally, as Samsung intends you to use it, it feels quite normal, even if I'd prefer a little more vertical space when trying to work from it laptop-style.</p><p>But when held vertically, the Tab feels quite narrow, though that could be because I'm used to using a much squarer iPad Pro. It makes a difference if I'm using the Galaxy Tab as a notepad, as I tend to run out of space quickly when writing, but it feels fine when using apps with regular taps and swipes.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Samsung Galaxy Tab S10 Plus</strong>    </p></td><td  ><p><strong>OnePlus Pad 2</strong>    </p></td><td  ><p><strong>iPad Air (13-inch)</strong>    </p></td><td  ><p><strong>iPad Pro (13-inch)</strong>    </p></td></tr><tr><td class="firstcol " ><p><strong>SDR brightness (nits)</strong>    </p></td><td  ><p>446    </p></td><td  ><p>580    </p></td><td  ><p>572    </p></td><td  ><p>561    </p></td></tr><tr><td class="firstcol " ><p><strong>HDR brightness (nits)</strong>    </p></td><td  ><p>559    </p></td><td  ><p>555    </p></td><td  ><p>577    </p></td><td  ><p>1510    </p></td></tr><tr><td class="firstcol " ><p><strong>sRGB color gamut coverage (%)</strong>    </p></td><td  ><p>139.8    </p></td><td  ><p>105.7    </p></td><td  ><p>110.9    </p></td><td  ><p>117.4    </p></td></tr><tr><td class="firstcol " ><p><strong>DCI-P3 color gamut coverage (%)</strong>    </p></td><td  ><p>99    </p></td><td  ><p>74.9    </p></td><td  ><p>78.6    </p></td><td  ><p>83.2    </p></td></tr><tr><td class="firstcol " ><p><strong>Delta-E color accuracy (lower is better)</strong>    </p></td><td  ><p>0.23    </p></td><td  ><p>0.25    </p></td><td  ><p>0.27    </p></td><td  ><p>0.2    </p></td></tr></tbody></table></div><p>In testing, the Galaxy Tab S10 Plus proved the best in terms of color gamut coverage, especially in its default Vivid color mode. It lags behind the competition in terms of brightness, though, especially compared to the Tandem OLED-powered screen of the iPad Pro.</p><p>Fortunately, the Tab S10 Plus' lower brightness is made up for by my favorite part of its display — its anti-reflective layer. It is easy to see it in action compared to any other screen you'll have to hand (unless you have a <a href="https://www.tomsguide.com/reviews/samsung-galaxy-s24-ultra">Galaxy S24 Ultra</a>, which uses the same style of screen) as soon as you're outside your carefully-lit work environment.</p><p>Using the Galaxy Tab in outdoor or awkward indoor lighting, as is likely to happen when you're trying to use the device on the move, is far easier than other tablets when you combine the anti-glare with the bright OLED display.</p><p>And unlike the nanotexture display option offered on the iPad Pro M4, this coating comes as part of the basic price, is available on all storage options, and doesn't affect the smoothness of the screen either. That's good news for frequent stylus users.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-plus-performance"><span>Samsung Galaxy Tab S10 Plus: Performance</span></h3><p>Unlike previous Samsung Galaxy Tab S models, the Tab S10 series uses a Dimensity 9300+ chipset, rather than one built by Samsung or Qualcomm. But this is still a premium tablet despite the different silicon.</p><p>As the results below show, the Galaxy Tab S10 Plus outperforms the OnePlus Pad 2, currently our favorite Android tablet, on our three main tests. However, Apple's mighty M-series chips still leave the Tab S10 Plus in the dust, especially the latest M4 silicon powering the iPad Pro.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Samsung Galaxy Tab S10 Plus</strong>    </p></td><td  ><p><strong>OnePlus Pad 2</strong>    </p></td><td  ><p><strong>iPad Air (13-inch)</strong>    </p></td><td  ><p><strong>iPad Pro (13-inch)</strong>    </p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong>    </p></td><td  ><p>Dimensity 9300+    </p></td><td  ><p>Snapdragon 8 Gen 3    </p></td><td  ><p>Apple M2    </p></td><td  ><p>Apple M4    </p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6 score (single-core / multi-core)</strong>    </p></td><td  ><p>2,137 / 7,130    </p></td><td  ><p>2,033 / 6,161    </p></td><td  ><p>2,600 / 10,066    </p></td><td  ><p>3,700 / 14,523    </p></td></tr><tr><td class="firstcol " ><p><strong>3DMark Wild Life Extreme Unlimited (score / fps)</strong>    </p></td><td  ><p>5,121 / 30    </p></td><td  ><p>4,440 / 26    </p></td><td  ><p>5829 / 34    </p></td><td  ><p>8,529 / 51    </p></td></tr><tr><td class="firstcol " ><p><strong>Adobe Premiere Rush time to transcode (mins:secs)</strong>    </p></td><td  ><p>0:43    </p></td><td  ><p>0:58    </p></td><td  ><p>0:21    </p></td><td  ><p>0:19    </p></td></tr></tbody></table></div><p>The Tab S10 series retains the vapor chamber cooling of the Tab S9 to keep its performance consistent over long periods of time. While playing Ex Astris, I didn't feel the Tab S10 Plus get warm at all, although with all settings set to Ultra and the frame rate at 60fps, the tablet's performance did stutter, even in sparsely populated areas.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ohhDgbr2tdRfvtyB2v7aqn" name="Samsung Galaxy Tab S10 Plus" alt="Samsung Galaxy Tab S10 Plus playing Ex Astris" src="https://cdn.mos.cms.futurecdn.net/ohhDgbr2tdRfvtyB2v7aqn-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Inside the Tab S10 is 12GB RAM and 256GB storage, or 512GB in its top-specced form. While that's likely enough room for most users, you can still expand the storage with up to a 1.5TB microSD card should you need to. That's not something you can do with the iPad Pro, even if you can get 1TB and 2TB onboard storage versions of that tablet.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-plus-audio"><span>Samsung Galaxy Tab S10 Plus: Audio</span></h3><p>The quad speakers within the Galaxy Tab S10 Plus<strong> </strong>certainly give any audio you play a lot of oomph, especially for low-end notes, making this an ideal tablet for bassheads. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4v9MAnuTVEexo9zT9nYXqn" name="Samsung Galaxy Tab S10 Plus" alt="Samsung Galaxy Tab S10 Plus from behind with stylus, being held in hand" src="https://cdn.mos.cms.futurecdn.net/4v9MAnuTVEexo9zT9nYXqn-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Listening to the complex and chaotic "Transcendental Cha Cha Cha" by Tom Cardy, the synthy bass notes and drum beats anchoring the song came across best on the Samsung tablet, while my old iPad Pro helped emphasize the castanets, drum machine cymbals, guitar and Cardy's vocals.</p><p>Personally, the high-end frequency focus of the iPad Pro's speakers, which brings out more of a track's regular instruments and the percussion parts, is more to my taste. But I still enjoyed listening to music, watching videos and playing games on the Samsung tablet.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-plus-battery-and-charging"><span>Samsung Galaxy Tab S10 Plus: Battery and charging</span></h3><p>The 10,090 mAh battery within the Galaxy Tab S10 Plus is pretty large, but the tablet only lasted 8 hours and 22 minutes on our custom TG battery test (constantly browsing the internet from 100% to 0% charge).</p><p>Compared to the incredible 14 hours and 8 minutes that the OnePlus Pad 2 lasted, or the similarly strong 13 hours and 13 minutes or 9 hours and 41 minutes that the iPad Pro M4 and <a href="https://www.tomsguide.com/tablets/ipads/ipad-air-m3-review">iPad Air M3</a> (respectively) achieved, that's not particularly impressive.</p><p>Anecdotally, I got about 10 hours of screen-on time per charge, perhaps because most of my use wasn't as power-hungry as opening web pages non-stop. I imagine I'd still get more use between charges out of the other tablets we've mentioned, but you can still be confident in the Tab S10 Plus lasting a full day of work if you're nervous about the benchmark result above.</p><p>The Tab S10 Plus supports 45W wired charging, but you won't find a charger in the box. Fortunately, we have a compatible charger in our test lab, and we found that the Tab S10 Plus powers from 0% to 40% in 30 minutes. That's pretty good if you need a mid-day refuel, but it's a pity you'll be paying extra for the privilege of this speed.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-plus-cameras"><span>Samsung Galaxy Tab S10 Plus: Cameras</span></h3><p>Samsung has stuck to including two cameras on the back Galaxy Tab S10 series, even while Apple's dropped the ultrawide from the back of the iPad Pro. The 13MP main and 12MP ultrawide sensors are identical between the Tab S10 Plus and Tab S10 Ultra, as is the 12MP front camera.</p><p>But the Ultra gets an additional 12MP ultrawide sensor in its camera notch, as befitting its higher status and price.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/88xeFWMyLHBortECvPaauU-1920-80.jpg" alt="Main camera sample from the Samsung Galaxy Tab S10 Plus" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/AwBoAJX4iXfbG7NJ6PQ8pU-1920-80.jpg" alt="Selfie camera sample from the Samsung Galaxy Tab S10 Plus" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure></figure><p>Tablet cameras are not meant for hardcore photography, which is why it's not surprising to see these shots of a coffee plant and a selfie look a little grainy and dark, even for an indoor environment.</p><p>The cameras are more than passable for making video calls, though, which is by far the most common thing you'll be using them for on the Tab S10 Plus.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-plus-accessories"><span>Samsung Galaxy Tab S10 Plus: Accessories</span></h3><p>The S Pen still comes with the Galaxy Tab by default, and is a smooth and low-latency stylus that I loved using.</p><p>It's very different from using an Apple Pencil Pro, with its mechanical button for accessing alternative tools and softer tip. But as someone who mostly uses styluses for taking notes and the odd doodle, I don't miss advanced features like Hover or Barrel Roll.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Vgtxs2mNhkndnxkRD8yRpn" name="Samsung Galaxy Tab S10 Plus" alt="Samsung Galaxy Tab S10 Plus S Pen on magnetic storage strip, with case storage flap held up" src="https://cdn.mos.cms.futurecdn.net/Vgtxs2mNhkndnxkRD8yRpn-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The other main accessory Samsung offers is the AI Book Cover Keyboard, which costs $229/£229 extra. As well as adding an adjustable stand to the tablet, the keyboard itself feels pretty nice to type on and can be used separately from the stand, depending on your needs. However, the trackpad can feel a bit wonky depending on the app you try to use it in.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="er66rEgUUJ7z9Qi9rk8uon" name="Samsung Galaxy Tab S10 Plus" alt="Samsung Galaxy Tab S10 Plus with keyboard" src="https://cdn.mos.cms.futurecdn.net/er66rEgUUJ7z9Qi9rk8uon-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>This revised keyboard also features an AI key, which acts as a shortcut to either Bixby or Google Gemini, as you prefer. It doesn't activate any contextual Galaxy AI features sadly, which I feel would have been a better use of a dedicated key.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-plus-software-and-ai"><span>Samsung Galaxy Tab S10 Plus: Software and AI</span></h3><p>Samsung has brought its seven-year software support promise from its recent phones to the Galaxy Tab S10 series. That means the Tab S10 series will see full OS and security updates until the end of October 2031, which is the best guaranteed software support of any tablet.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="srf4aswErwWwateTCeLtpn" name="Samsung Galaxy Tab S10 Plus" alt="Samsung Galaxy Tab S10 Plus in DeX mode" src="https://cdn.mos.cms.futurecdn.net/srf4aswErwWwateTCeLtpn-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Returning from previous Galaxy Tabs is DeX mode, which switches the standard Android interface to a more laptop-style one. You can open multiple windows and move them around freely or into up to four tiled spots, which offers a reasonable amount of freedom for work if your workflow can be translated into Android apps.</p><p>In my case, this was normally very easy since I'm usually writing in or referring to one Google Workspace app or another. However, when I would normally use a company-made Chrome extension to make adjustments to a document or go into Tom's Guide's back-end, it was normally wiser to lock the Tab S10 Plus and open up my laptop instead.</p><p>If you prefer to keep things traditional, split view for apps is back, letting you divide the screen between three apps. But this is the traditional style of cramming everything into the screen, rather than the smarter OnePlus Open Canvas system that lets you shift parts of the interface off-screen as required. But the 12.4-inch screen is still plenty large enough to work off an app running at a quarter of its regular size.</p><p>I wrote a large part of this review with Google Docs squished into the corner of the screen while my notes and Chrome were open at the same time. It's still not the same level of multitasking that a proper laptop can manage, but it's probably more than enough for most people.</p><p>Galaxy AI isn't new to the Galaxy Tab line, but the Tab S10 series is the first set of models to launch with Samsung's AI features included. Once you're settled into the tablet, you can try out features like transforming doodles into more polished versions with Sketch to Image, translating PDFs via an overlay, recording and transcription tools and equation-solving built into the Notes app. You also get the ability to reformat, translate or summarize text across the tablet's One UI interface.</p><p>And if that wasn't enough, Google Circle to Search is also available to help you learn about anything curious that appears on your travels.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RPaFh9rr9nxZgt3JCpj8mn" name="Samsung Galaxy Tab S10 Plus" alt="Samsung Galaxy Tab S10 Plus drawing tools" src="https://cdn.mos.cms.futurecdn.net/RPaFh9rr9nxZgt3JCpj8mn-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Having a larger, split-screen canvas makes sense for many of these tools, even if they're no different in function from the version you'll get on a <a href="https://www.tomsguide.com/reviews/samsung-galaxy-s24">Galaxy S24</a> or <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-6-review-test-results">Galaxy Z Fold 6</a>.</p><p>Some abilities, like live translation or photo editing, still suit those smaller, more camera-focused devices. But in tablet terms, Samsung has a far more mature AI suite than the OnePlus Pad's OxygenOS or Apple's iPadOS, and makes up for any features it lacks compared to the Pixel Tablet by offering far superior hardware.</p><p>For me, the translation tools (which work without an internet connection if you've downloaded the languages needed already) plus the text formatting tools are well worth using.</p><p>Since I'm not much of an artist or photo editor, Sketch to Image doesn't have much to offer me beyond showing it to curious friends. And while I wish the audio transcription tools sounded amazing, these are still flummoxed by anyone reading at above-average pace with less-than-perfect enunciation.</p><h3 class="article-body__section" id="section-samsung-galaxy-tab-s10-plus-review-verdict"><span>Samsung Galaxy Tab S10 Plus review: Verdict </span></h3><p>While not Samsung's ultimate tablet, the Galaxy Tab S10 Plus seems a more well-rounded choice in terms of price and portability compared to the Tab S10 Ultra. And that applies to the competition too, since it roughly splits the difference between the 11-inch and 13-inch size of Apple's comparable iPads, while being no more expensive, especially when you consider the stylus is bundled in for free.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kZ5iXCz8x7XvRUhEMA3Jon" name="Samsung Galaxy Tab S10 Plus" alt="Samsung Galaxy Tab S10 Plus from behind" src="https://cdn.mos.cms.futurecdn.net/kZ5iXCz8x7XvRUhEMA3Jon-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Tablet users, be it for work or play, will appreciate the Tab S10 Plus' brilliant screen and its generous software updates. The bevy of productivity and creativity features between regular software and Galaxy AI also makes this tablet handy for all kinds of users.</p><p>However, the weak battery life and middling performance perhaps mean this isn't as capable a laptop replacement as an iPad would be, although that changes depending on what other devices you're using.</p><p>Samsung has once again staked a claim on a spot on our best Android tablets list with the Galaxy Tab S10 Plus. The OnePlus Pad remains a far better value device, and could win you over with its battery life alone, but Samsung is the way to go if you seek the best and most complete experience for your Android tablet.</p><div data-model-name="Samsung Galaxy Tab S10 Plus" data-widget-type="review"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung's Galaxy Tab S10 FE crushes its predecessor with 40% speed boost in leaked benchmark ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Samsung Galaxy Tab S10 FE appears to have taken another step closer to release after benchmarks appeared on the Geekbench website. The scores show a big step forward from the company’s previous mid-range tablet — the Galaxy Tab S9 FE — but performance still falls well short of the premium Galaxy Tab S10 range.</p><p>The <a href="https://browser.geekbench.com/v6/cpu/10965375" target="_blank">listing for a device labelled SM-X520</a> appeared on the site yesterday and shows the tablet’s chip — rumored to be the Exynos 1580 — producing scores of 1,349 in single-core tests and 3,882 for the multi-core equivalents. </p><h2 id="turbo-boost">Turbo boost</h2><p>That’s a significant boost on the Exynos 1380-powered <a href="https://www.tomsguide.com/tablets/samsung-galaxy-tab-s9-fe-plus-review">Samsung Galaxy Tab S9 FE Plus</a>. Our review measurement came on a different version of the benchmarking software and is therefore incomparable, but a <a href="https://browser.geekbench.com/v6/cpu/6419449" target="_blank">listing for the Tab S9 FE</a> on the Geekbench site using the same test gave it scores of 1,005 and 2,923. So we’re looking at a possible boost of 32-34%.</p><p>But it’s important to note that “Fan Edition” remains something of a misnomer, given it relates to lower-cost versions of popular Samsung brands, and thus performance isn’t really comparable to the non-FE versions. The same appears true here: the Samsung Galaxy Tab S10 Plus <a href="https://browser.geekbench.com/search?q=SM-X828U" target="_blank">achieves scores</a> of between 1,600 and 2,200 for single-core and 6,000 to 7,200 for multi-core performance.</p><p>But then the Tab S9 FE cost $450 when it arrived in October 2023, and with Samsung choosing to skip the regular 10.9-inch Tab S10 in favour of just Plus and Ultra models last year, prices start at an intimidating $999. </p><p>That could make the Galaxy Tab S10 FE an appealing alternative — especially as it’s <a href="https://www.tomsguide.com/tablets/android-tablets/samsung-galaxy-tab-s10-fe-plus-tablet-could-pack-a-surprise-upgrade">rumored to reintroduce the regular-sized 10.9-inch model alongside an even bigger 13.1-inch Plus version</a>. The smaller model is tipped to pack a 2,304 x 1,440 LCD screen, while the latter opts for 2,880 x 1,800. The extra screen space creates more space for a larger battery too: 10,090 mAh for the larger model against 8,000mAh for the smaller version.</p><h2 id="outlook-2">Outlook</h2><p><a href="https://www.tomsguide.com/computing/samsung-galaxy-tab-s10-fe-renders-just-revealed-a-stunning-ipad-rival">Renders based on leaks show a device that will look familiar to fans of Samsung’s tablets</a>, with the S Pen tipped for inclusion once again. The screens are expected to get 200 nits brighter than the previous FE tablets, and buyers should be able to configure their purchases with either 8GB or 12GB RAM, and 128GB or 256GB of onboard storage.</p><p>The tablets have previously been tipped for a release “in the coming weeks” and this appearance on Geekbench seems to back that up. Given the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-beats-apple-to-the-punch-galaxy-s25-edge-teased">Samsung Galaxy S25 Edge</a> has been <a href="https://www.tomsguide.com/phones/samsung-galaxy-s25-edge-latest-leak-hints-at-good-news-for-pricing">tipped for an April launch</a>, it’s possible these cheap and cheerful tablets will be the support act.</p><div data-widget-type="merchantlink" data-model-name="Galaxy Tab S10 Plus"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/tablets/samsungs-galaxy-tab-s10-fe-crushes-its-predecessor-with-40-percent-speed-boost-in-leaked-benchmark</link>
                                                                            <description>
                            <![CDATA[ Significantly faster than its predecessor, but some way off the Tab S10 Plus. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">G7eEELyFamuf2tDzvSBY4C</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/7U8UicYkYY6s6FU3SjGnw6-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 12 Mar 2025 10:56:27 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                                                                                    <dc:creator><![CDATA[ Alan Martin ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xMmhmPSssqZHHFWveDgSs7-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/7U8UicYkYY6s6FU3SjGnw6-1920-80.jpg">
                                                            <media:credit><![CDATA[OnLeaks / SammyGuru]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Tab S10 FE renders]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Tab S10 FE renders]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Tab S10 FE renders]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/7U8UicYkYY6s6FU3SjGnw6-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Samsung Galaxy Tab S10 FE appears to have taken another step closer to release after benchmarks appeared on the Geekbench website. The scores show a big step forward from the company’s previous mid-range tablet — the Galaxy Tab S9 FE — but performance still falls well short of the premium Galaxy Tab S10 range.</p><p>The <a href="https://browser.geekbench.com/v6/cpu/10965375" target="_blank">listing for a device labelled SM-X520</a> appeared on the site yesterday and shows the tablet’s chip — rumored to be the Exynos 1580 — producing scores of 1,349 in single-core tests and 3,882 for the multi-core equivalents. </p><h2 id="turbo-boost">Turbo boost</h2><p>That’s a significant boost on the Exynos 1380-powered <a href="https://www.tomsguide.com/tablets/samsung-galaxy-tab-s9-fe-plus-review">Samsung Galaxy Tab S9 FE Plus</a>. Our review measurement came on a different version of the benchmarking software and is therefore incomparable, but a <a href="https://browser.geekbench.com/v6/cpu/6419449" target="_blank">listing for the Tab S9 FE</a> on the Geekbench site using the same test gave it scores of 1,005 and 2,923. So we’re looking at a possible boost of 32-34%.</p><p>But it’s important to note that “Fan Edition” remains something of a misnomer, given it relates to lower-cost versions of popular Samsung brands, and thus performance isn’t really comparable to the non-FE versions. The same appears true here: the Samsung Galaxy Tab S10 Plus <a href="https://browser.geekbench.com/search?q=SM-X828U" target="_blank">achieves scores</a> of between 1,600 and 2,200 for single-core and 6,000 to 7,200 for multi-core performance.</p><p>But then the Tab S9 FE cost $450 when it arrived in October 2023, and with Samsung choosing to skip the regular 10.9-inch Tab S10 in favour of just Plus and Ultra models last year, prices start at an intimidating $999. </p><p>That could make the Galaxy Tab S10 FE an appealing alternative — especially as it’s <a href="https://www.tomsguide.com/tablets/android-tablets/samsung-galaxy-tab-s10-fe-plus-tablet-could-pack-a-surprise-upgrade">rumored to reintroduce the regular-sized 10.9-inch model alongside an even bigger 13.1-inch Plus version</a>. The smaller model is tipped to pack a 2,304 x 1,440 LCD screen, while the latter opts for 2,880 x 1,800. The extra screen space creates more space for a larger battery too: 10,090 mAh for the larger model against 8,000mAh for the smaller version.</p><h2 id="outlook-2">Outlook</h2><p><a href="https://www.tomsguide.com/computing/samsung-galaxy-tab-s10-fe-renders-just-revealed-a-stunning-ipad-rival">Renders based on leaks show a device that will look familiar to fans of Samsung’s tablets</a>, with the S Pen tipped for inclusion once again. The screens are expected to get 200 nits brighter than the previous FE tablets, and buyers should be able to configure their purchases with either 8GB or 12GB RAM, and 128GB or 256GB of onboard storage.</p><p>The tablets have previously been tipped for a release “in the coming weeks” and this appearance on Geekbench seems to back that up. Given the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-beats-apple-to-the-punch-galaxy-s25-edge-teased">Samsung Galaxy S25 Edge</a> has been <a href="https://www.tomsguide.com/phones/samsung-galaxy-s25-edge-latest-leak-hints-at-good-news-for-pricing">tipped for an April launch</a>, it’s possible these cheap and cheerful tablets will be the support act.</p><div data-widget-type="merchantlink" data-model-name="Galaxy Tab S10 Plus"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I just tested my new favorite Android tablet — here’s why the Honor Pad V9 takes on the iPad (and wins) ]]></title>
                                                                                                <dc:content><![CDATA[ <div data-model-name="Honor Pad V9" data-widget-type="review"></div><p>The <a href="https://www.tomsguide.com/tablets/honor-pad-9-review">Honor Pad 9</a> was an Android tablet disguised as an iPad. MagicOS offers the same levels of “it just works” smoothness to the UI, but drawbacks in performance and the speakers stopped just short of pipping the lower-end <a href="https://www.tomsguide.com/reviews/ipad-2022-10th-gen">iPad 10th Gen</a> to the post — not to mention the huge app store.</p><p>Well, one year later, and the Honor Pad V9 takes its performance to a new level, the battery is way bigger, the speakers are better, and MagicOS just got a dose of AI. Packed into a new slim, sleek chassis with an improved display, I believe the Cupertino crew has just met its match. Put simply, it’s one of the <a href="https://www.tomsguide.com/best-picks/best-android-tablets">best Android tablets</a> you can buy.</p><p>That’s not to say it’s overcome all the obstacles to get to Apple. Android is still behind iPadOS in terms of app market, and the cameras remain unchanged from the potatoes you got on the Pad 9.</p><p>But in where it matters — getting stuff done, playing games and binge watching to your heart’s content — this is a stellar option. Alongside this, Kids Space managed to keep my nephew entertained for so long. Provided you get a durable case (he’s rather clumsy), this is also a shout for one of the <a href="https://www.tomsguide.com/best-picks/best-tablets-for-kids">best kids tablets</a> you can snag.</p><h2 class="article-body__section" id="section-honor-pad-9-cheat-sheet"><span>Honor Pad 9: Cheat Sheet</span></h2><ul><li><strong>What is it? </strong>This is a mid-range Android tablet.</li><li><strong>Who’s it for? </strong>This tablet is ideal for binge watchers and families looking to entertain their kids on-the-go.</li><li><strong>What is the price? </strong>The price is yet to be confirmed, but based on leaks, we’re predicting a £299 price tag.</li><li><strong>How does this compare to an iPad? </strong>The closest competition is the 10th Gen iPad, and on pure hardware, Honor Pad V9 beats it comfortably with a gorgeous display, strong internals and impressive speakers — alongside a smooth UI that matches iPadOS.</li><li><strong>Anything I didn’t like? </strong>Android is still a bit of a desert when it comes to the full suite of iPad apps you can download, and the cameras are a bit naff.</li></ul><h2 class="article-body__section" id="section-honor-pad-v9-specs"><span>Honor Pad V9: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>TBC</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>10.2 x 9.3 x 0.2 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>1.1 pounds</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>11.5-inch LCD display, 2800 x 1840-pixel resolution, 144Hz refresh rate, HDR</p></td></tr><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>Mediatek Dimensity 8350 Octa-core</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>12GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>Up to<strong> </strong>512GB</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-honor-pad-v9-the-ups"><span>Honor Pad V9: The ups</span></h2><p>With important gains made in key areas, there’s a lot to love about the Honor Pad V9 — all of which became obvious over my month with it.</p><h2 id="sleek-and-stylish">Sleek and stylish</h2><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="75nGv4KjqqK5ErznTRUGJb" name="Honor Pad v9" alt="Honor Pad v9" src="https://cdn.mos.cms.futurecdn.net/75nGv4KjqqK5ErznTRUGJb-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Yes, the display is technically smaller than the 12.1-inch panel you got in the Pad 9. But what you get for that mesmerizing-yet-smaller 11.5-inch screen (more on that later) is a smaller, slimmer and lighter design that feels unmistakably premium in the hand.</p><div ><table><thead><tr><th class="firstcol " ><p>Tablet</p></th><th  ><p>Size</p></th><th  ><p>Weight</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Honor Pad V9</strong></p></td><td  ><p>10.2 x 9.3 x 0.2 inches</p></td><td  ><p>1.1 pounds</p></td></tr><tr><td class="firstcol " ><p><strong>Honor Pad 9</strong></p></td><td  ><p>10.9 x 7.1 x 0.3 inches</p></td><td  ><p>1.2 pounds</p></td></tr><tr><td class="firstcol " ><p><strong>iPad (10th Gen)</strong></p></td><td  ><p>9.8 x 7.1 x 0.3 inches</p></td><td  ><p>1.1 pounds</p></td></tr></tbody></table></div><p>The aluminum shell feels great with a nice even weight distribution to not cause any obvious fatigue when holding in one hand, and the NIL Nano-topography process ensures a (mostly) fingerprint-free screen. It works by adding a textured surface that’s so fine it can only be seen through a microscope.</p><p>You won’t be able to feel it — the display glass feels nice and smooth to navigate around. But this industry-first process for tablet glass does make it surprisingly resistant to your typical finger smudges.</p><p>Now, one key thing that comes with making your devices even thinner is something that I’m sure will summon JerryRigEverything like Beetlejuice if I say it three times — does it bend? </p><p>The answer, fortunately, is no. With enough strength, you can see the tiniest milli-degree curve but it doesn’t stick around. The bend resistance here is <strong>strong</strong> enough to give you a resounding confidence in its durability.</p><h2 id="nice-on-the-eyes">Nice on the eyes</h2><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="EEvPvQ2aPZPQ9Ty8w5eTSb" name="Honor Pad v9" alt="Honor Pad v9" src="https://cdn.mos.cms.futurecdn.net/EEvPvQ2aPZPQ9Ty8w5eTSb-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>By default, if ever I have shows to binge watch on my train journeys down to London, I grab my MacBook Pro. But now, the Honor Pad V9 has officially taken over — thanks to its drop dead gorgeous 11.5-inch display.</p><p>Moving from the 16:10 of Pad 9 to a 3:2 aspect ratio makes this feel like a great slab to use in both portrait and landscape. And that 2800 x 1840-pixel resolution is super crispy for text and graphics — all running at a silky smooth 144Hz refresh rate.</p><div ><table><thead><tr><th class="firstcol " ><p>Tablet</p></th><th  ><p>Display size/resolution</p></th><th  ><p>Brightness (nits)</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Honor Pad V9</strong></p></td><td  ><p>11.5-inch, 2800 x 1840 pixels</p></td><td  ><p>500 nits</p></td></tr><tr><td class="firstcol " ><p><strong>iPad (10th Gen)</strong></p></td><td  ><p>10.9-inch, 2360 x 1640 pixels</p></td><td  ><p>500 nits</p></td></tr></tbody></table></div><p>I get it. You saw “IPS LCD” in the specs and probably had a moment of doubt. IPS panels aren’t exactly known for their eye-popping vibrancy, and given this tablet’s lower price, it’s fair to question its display quality. But those concerns vanish the moment you lay eyes on the screen.</p><p>Case in point: watching my partner’s latest obsession, Entergalactic, Kid Cudi’s stunningly animated love story. The resolution handles every intricate detail with precision, while the color and contrast deliver a dazzling rush of vibrancy that keeps every frame alive.</p><h2 id="magicos-gets-a-lot-more-ai-fun">MagicOS gets a lot more AI fun</h2><p>MagicOS 9.0 — built on Android 15 — grows on what we’ve seen so far from what I believe to be the smoothest tablet OS in the Android ecosystem with some extra AI smarts.</p><p>First off, the Magic Lock screen brings a ton of customized wallpapers and color tweaking to get just the right aesthetic for you. Second, the 3D Avatar may be a bit of a gimmick, but it’s definitely fun to see your AI-generated figurine and customize it to your liking.</p><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="vNgwKQdwZVhceD9qf5E2Hb" name="Honor Pad v9" alt="Honor Pad v9" src="https://cdn.mos.cms.futurecdn.net/vNgwKQdwZVhceD9qf5E2Hb-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>And finally, on the more useful side of things, Honor Notes has been enriched with AI. Beyond searching, pinning and categorizing your notes, there’s math formula recognition, handwriting beautification (great for my chicken scratch writing), and even voice-to-text capabilities — even being able to translate and transcribe video meetings in real time.</p><p>These are great little additions, which underpin the fundamental smoothness and logical nature of navigation. </p><p>All the multi-finger gestures make multitasking effortless, swiping in from edges of the screen do exactly what you expect it to do in zipping around the OS, and the interconnection of different devices via Honor Connect screams “it just works” in a way that would make Apple sweat.</p><h2 id="better-performance-and-battery-life">Better performance and battery life</h2><p>The Honor Pad 9’s main thorn in the paw was the Snapdragon 6 Gen 1 chipset not offering much in the way of performance. Switching to MediaTek Dimensity 8350 Elite has helped with that somewhat.</p><p>Don’t get me wrong, you’re not getting pro tablet levels of performance, but you’re getting more than enough for all the casual uses of a cheaper tablet. Zipping between apps came with no slowdown and games run at respectable 60 FPS with decently sharp graphical fidelity.</p><div ><table><thead><tr><th class="firstcol " ><p>Tablet</p></th><th  ><p>Geekbench 6 (single-core)</p></th><th  ><p>Geekbench 6 (multicore)</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Honor Pad V9</strong></p></td><td  ><p>1,414</p></td><td  ><p>4,293</p></td></tr><tr><td class="firstcol " ><p><strong>iPad (10th Gen)</strong></p></td><td  ><p>1,580</p></td><td  ><p>4,400</p></td></tr></tbody></table></div><p>Pair that with a chunky 10,100 mAh battery with a high energy density ensures a good, long runtime. I ran a test of online video streaming last year, and the Pad 9 hit 11 hours and 26 minutes. With Pad V9, you’re looking more at a massive 16:07. That’s an impressive gain that puts it safely into worry-free battery life territory.</p><p>Oh, and if the battery does drain, you can charge it back to full in just under 30 minutes. </p><h2 class="article-body__section" id="section-honor-pad-9-the-downs"><span>Honor Pad 9: The downs</span></h2><p>Honestly, the only real downside to the Honor Pad V9 now (outside of the whole Android tablet app selection issue) is a simple one.</p><h2 id="cameras-are-not-good">Cameras are not good</h2><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="dCqfEbp7a7yP9DPL3j4PPb" name="Honor Pad v9" alt="Honor Pad v9" src="https://cdn.mos.cms.futurecdn.net/dCqfEbp7a7yP9DPL3j4PPb-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I’ll start by saying the obvious — don’t use your tablet to take pictures. Your smartphone will almost always take far superior photos. But for those impromptu video calls or the rare moment when the Honor Pad 9 is your only option, the camera setup is serviceable, though far from impressive.</p><p>The 8MP front camera works well enough for the occasional WhatsApp chat, but expect noticeable noise in dimly lit areas. Around the back, the 13MP main sensor produces images with less grain, but at the cost of fine details and rich color accuracy, leaving shots looking somewhat flat and lacking sharpness.</p><h2 class="article-body__section" id="section-honor-pad-v9-verdict"><span>Honor Pad V9: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="KPxv3gvLGwhpqvDcviGpMb" name="Honor Pad v9" alt="Honor Pad v9" src="https://cdn.mos.cms.futurecdn.net/KPxv3gvLGwhpqvDcviGpMb-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Honor Pad V9 takes mostly everything the company learnt from the previous Pad 9, and fixes it. It’s easily one of the best Android tablets I’ve used in recent memory, and a serious contender for the iPad’s crown.</p><p>Important improvements to performance and the display make this a top notch binge watching device with the battery life to boot, and the sharpened AI features provide a helping hand that doesn’t feel overbearing or gimmicky.</p><p>Put simply, if you’re in the market for an Android tablet, this should be on your list.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/tablets/android-tablets/honor-pad-v9-review</link>
                                                                            <description>
                            <![CDATA[ The Honor Pad V9 takes everything I liked about the Pad 9, and takes it up a notch — improving performance, upgrading the display, vastly increasing battery life, and packing it all into a smaller, thinner chassis. The iPad now has some serious competition. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">mXKquKRZwaR2hC8PnFaYbR</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/U67qtttjonrHbvGrDyRLTb-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 02 Mar 2025 17:00:00 +0000</pubDate>                                                                                                                                <updated>Thu, 04 Jun 2026 12:51:44 +0000</updated>
                                                                                                                                            <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jason brings a decade of tech and gaming journalism experience to his role as a Managing Editor of Computing at Tom&#039;s Guide. He has previously written for Laptop Mag, Tom&#039;s Hardware, Kotaku, Stuff and BBC Science Focus. In his spare time, you&#039;ll find Jason looking for good dogs to pet or thinking about eating pizza if he isn&#039;t already.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/U67qtttjonrHbvGrDyRLTb-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Honor Pad v9]]></media:description>                                                            <media:text><![CDATA[Honor Pad v9]]></media:text>
                                <media:title type="plain"><![CDATA[Honor Pad v9]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/U67qtttjonrHbvGrDyRLTb-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div data-model-name="Honor Pad V9" data-widget-type="review"></div><p>The <a href="https://www.tomsguide.com/tablets/honor-pad-9-review">Honor Pad 9</a> was an Android tablet disguised as an iPad. MagicOS offers the same levels of “it just works” smoothness to the UI, but drawbacks in performance and the speakers stopped just short of pipping the lower-end <a href="https://www.tomsguide.com/reviews/ipad-2022-10th-gen">iPad 10th Gen</a> to the post — not to mention the huge app store.</p><p>Well, one year later, and the Honor Pad V9 takes its performance to a new level, the battery is way bigger, the speakers are better, and MagicOS just got a dose of AI. Packed into a new slim, sleek chassis with an improved display, I believe the Cupertino crew has just met its match. Put simply, it’s one of the <a href="https://www.tomsguide.com/best-picks/best-android-tablets">best Android tablets</a> you can buy.</p><p>That’s not to say it’s overcome all the obstacles to get to Apple. Android is still behind iPadOS in terms of app market, and the cameras remain unchanged from the potatoes you got on the Pad 9.</p><p>But in where it matters — getting stuff done, playing games and binge watching to your heart’s content — this is a stellar option. Alongside this, Kids Space managed to keep my nephew entertained for so long. Provided you get a durable case (he’s rather clumsy), this is also a shout for one of the <a href="https://www.tomsguide.com/best-picks/best-tablets-for-kids">best kids tablets</a> you can snag.</p><h2 class="article-body__section" id="section-honor-pad-9-cheat-sheet"><span>Honor Pad 9: Cheat Sheet</span></h2><ul><li><strong>What is it? </strong>This is a mid-range Android tablet.</li><li><strong>Who’s it for? </strong>This tablet is ideal for binge watchers and families looking to entertain their kids on-the-go.</li><li><strong>What is the price? </strong>The price is yet to be confirmed, but based on leaks, we’re predicting a £299 price tag.</li><li><strong>How does this compare to an iPad? </strong>The closest competition is the 10th Gen iPad, and on pure hardware, Honor Pad V9 beats it comfortably with a gorgeous display, strong internals and impressive speakers — alongside a smooth UI that matches iPadOS.</li><li><strong>Anything I didn’t like? </strong>Android is still a bit of a desert when it comes to the full suite of iPad apps you can download, and the cameras are a bit naff.</li></ul><h2 class="article-body__section" id="section-honor-pad-v9-specs"><span>Honor Pad V9: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>TBC</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>10.2 x 9.3 x 0.2 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>1.1 pounds</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>11.5-inch LCD display, 2800 x 1840-pixel resolution, 144Hz refresh rate, HDR</p></td></tr><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>Mediatek Dimensity 8350 Octa-core</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>12GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>Up to<strong> </strong>512GB</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-honor-pad-v9-the-ups"><span>Honor Pad V9: The ups</span></h2><p>With important gains made in key areas, there’s a lot to love about the Honor Pad V9 — all of which became obvious over my month with it.</p><h2 id="sleek-and-stylish">Sleek and stylish</h2><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="75nGv4KjqqK5ErznTRUGJb" name="Honor Pad v9" alt="Honor Pad v9" src="https://cdn.mos.cms.futurecdn.net/75nGv4KjqqK5ErznTRUGJb-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Yes, the display is technically smaller than the 12.1-inch panel you got in the Pad 9. But what you get for that mesmerizing-yet-smaller 11.5-inch screen (more on that later) is a smaller, slimmer and lighter design that feels unmistakably premium in the hand.</p><div ><table><thead><tr><th class="firstcol " ><p>Tablet</p></th><th  ><p>Size</p></th><th  ><p>Weight</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Honor Pad V9</strong></p></td><td  ><p>10.2 x 9.3 x 0.2 inches</p></td><td  ><p>1.1 pounds</p></td></tr><tr><td class="firstcol " ><p><strong>Honor Pad 9</strong></p></td><td  ><p>10.9 x 7.1 x 0.3 inches</p></td><td  ><p>1.2 pounds</p></td></tr><tr><td class="firstcol " ><p><strong>iPad (10th Gen)</strong></p></td><td  ><p>9.8 x 7.1 x 0.3 inches</p></td><td  ><p>1.1 pounds</p></td></tr></tbody></table></div><p>The aluminum shell feels great with a nice even weight distribution to not cause any obvious fatigue when holding in one hand, and the NIL Nano-topography process ensures a (mostly) fingerprint-free screen. It works by adding a textured surface that’s so fine it can only be seen through a microscope.</p><p>You won’t be able to feel it — the display glass feels nice and smooth to navigate around. But this industry-first process for tablet glass does make it surprisingly resistant to your typical finger smudges.</p><p>Now, one key thing that comes with making your devices even thinner is something that I’m sure will summon JerryRigEverything like Beetlejuice if I say it three times — does it bend? </p><p>The answer, fortunately, is no. With enough strength, you can see the tiniest milli-degree curve but it doesn’t stick around. The bend resistance here is <strong>strong</strong> enough to give you a resounding confidence in its durability.</p><h2 id="nice-on-the-eyes">Nice on the eyes</h2><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="EEvPvQ2aPZPQ9Ty8w5eTSb" name="Honor Pad v9" alt="Honor Pad v9" src="https://cdn.mos.cms.futurecdn.net/EEvPvQ2aPZPQ9Ty8w5eTSb-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>By default, if ever I have shows to binge watch on my train journeys down to London, I grab my MacBook Pro. But now, the Honor Pad V9 has officially taken over — thanks to its drop dead gorgeous 11.5-inch display.</p><p>Moving from the 16:10 of Pad 9 to a 3:2 aspect ratio makes this feel like a great slab to use in both portrait and landscape. And that 2800 x 1840-pixel resolution is super crispy for text and graphics — all running at a silky smooth 144Hz refresh rate.</p><div ><table><thead><tr><th class="firstcol " ><p>Tablet</p></th><th  ><p>Display size/resolution</p></th><th  ><p>Brightness (nits)</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Honor Pad V9</strong></p></td><td  ><p>11.5-inch, 2800 x 1840 pixels</p></td><td  ><p>500 nits</p></td></tr><tr><td class="firstcol " ><p><strong>iPad (10th Gen)</strong></p></td><td  ><p>10.9-inch, 2360 x 1640 pixels</p></td><td  ><p>500 nits</p></td></tr></tbody></table></div><p>I get it. You saw “IPS LCD” in the specs and probably had a moment of doubt. IPS panels aren’t exactly known for their eye-popping vibrancy, and given this tablet’s lower price, it’s fair to question its display quality. But those concerns vanish the moment you lay eyes on the screen.</p><p>Case in point: watching my partner’s latest obsession, Entergalactic, Kid Cudi’s stunningly animated love story. The resolution handles every intricate detail with precision, while the color and contrast deliver a dazzling rush of vibrancy that keeps every frame alive.</p><h2 id="magicos-gets-a-lot-more-ai-fun">MagicOS gets a lot more AI fun</h2><p>MagicOS 9.0 — built on Android 15 — grows on what we’ve seen so far from what I believe to be the smoothest tablet OS in the Android ecosystem with some extra AI smarts.</p><p>First off, the Magic Lock screen brings a ton of customized wallpapers and color tweaking to get just the right aesthetic for you. Second, the 3D Avatar may be a bit of a gimmick, but it’s definitely fun to see your AI-generated figurine and customize it to your liking.</p><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="vNgwKQdwZVhceD9qf5E2Hb" name="Honor Pad v9" alt="Honor Pad v9" src="https://cdn.mos.cms.futurecdn.net/vNgwKQdwZVhceD9qf5E2Hb-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>And finally, on the more useful side of things, Honor Notes has been enriched with AI. Beyond searching, pinning and categorizing your notes, there’s math formula recognition, handwriting beautification (great for my chicken scratch writing), and even voice-to-text capabilities — even being able to translate and transcribe video meetings in real time.</p><p>These are great little additions, which underpin the fundamental smoothness and logical nature of navigation. </p><p>All the multi-finger gestures make multitasking effortless, swiping in from edges of the screen do exactly what you expect it to do in zipping around the OS, and the interconnection of different devices via Honor Connect screams “it just works” in a way that would make Apple sweat.</p><h2 id="better-performance-and-battery-life">Better performance and battery life</h2><p>The Honor Pad 9’s main thorn in the paw was the Snapdragon 6 Gen 1 chipset not offering much in the way of performance. Switching to MediaTek Dimensity 8350 Elite has helped with that somewhat.</p><p>Don’t get me wrong, you’re not getting pro tablet levels of performance, but you’re getting more than enough for all the casual uses of a cheaper tablet. Zipping between apps came with no slowdown and games run at respectable 60 FPS with decently sharp graphical fidelity.</p><div ><table><thead><tr><th class="firstcol " ><p>Tablet</p></th><th  ><p>Geekbench 6 (single-core)</p></th><th  ><p>Geekbench 6 (multicore)</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Honor Pad V9</strong></p></td><td  ><p>1,414</p></td><td  ><p>4,293</p></td></tr><tr><td class="firstcol " ><p><strong>iPad (10th Gen)</strong></p></td><td  ><p>1,580</p></td><td  ><p>4,400</p></td></tr></tbody></table></div><p>Pair that with a chunky 10,100 mAh battery with a high energy density ensures a good, long runtime. I ran a test of online video streaming last year, and the Pad 9 hit 11 hours and 26 minutes. With Pad V9, you’re looking more at a massive 16:07. That’s an impressive gain that puts it safely into worry-free battery life territory.</p><p>Oh, and if the battery does drain, you can charge it back to full in just under 30 minutes. </p><h2 class="article-body__section" id="section-honor-pad-9-the-downs"><span>Honor Pad 9: The downs</span></h2><p>Honestly, the only real downside to the Honor Pad V9 now (outside of the whole Android tablet app selection issue) is a simple one.</p><h2 id="cameras-are-not-good">Cameras are not good</h2><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="dCqfEbp7a7yP9DPL3j4PPb" name="Honor Pad v9" alt="Honor Pad v9" src="https://cdn.mos.cms.futurecdn.net/dCqfEbp7a7yP9DPL3j4PPb-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I’ll start by saying the obvious — don’t use your tablet to take pictures. Your smartphone will almost always take far superior photos. But for those impromptu video calls or the rare moment when the Honor Pad 9 is your only option, the camera setup is serviceable, though far from impressive.</p><p>The 8MP front camera works well enough for the occasional WhatsApp chat, but expect noticeable noise in dimly lit areas. Around the back, the 13MP main sensor produces images with less grain, but at the cost of fine details and rich color accuracy, leaving shots looking somewhat flat and lacking sharpness.</p><h2 class="article-body__section" id="section-honor-pad-v9-verdict"><span>Honor Pad V9: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="KPxv3gvLGwhpqvDcviGpMb" name="Honor Pad v9" alt="Honor Pad v9" src="https://cdn.mos.cms.futurecdn.net/KPxv3gvLGwhpqvDcviGpMb-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Honor Pad V9 takes mostly everything the company learnt from the previous Pad 9, and fixes it. It’s easily one of the best Android tablets I’ve used in recent memory, and a serious contender for the iPad’s crown.</p><p>Important improvements to performance and the display make this a top notch binge watching device with the battery life to boot, and the sharpened AI features provide a helping hand that doesn’t feel overbearing or gimmicky.</p><p>Put simply, if you’re in the market for an Android tablet, this should be on your list.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung Galaxy Tab S10 FE Plus tablet could pack a surprise upgrade ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Samsung Galaxy Tab S series has consistently been among the <a href="https://www.tomsguide.com/best-picks/best-android-tablets">best Android tablets</a> you can buy, but they don’t come cheap. With the standard 11-inch Galaxy Tab discontinued for this generation, the cheapest current entry is the Samsung Galaxy Tab S10 Plus, which starts at $999, rising to $1,199 if you fancy the massive <a href="https://www.tomsguide.com/tablets/android-tablets/samsung-galaxy-tab-s10-ultra-review">14.6-inch Galaxy Tab S10 Ultra</a>.</p><p>Good news for those with tighter tablet budgets may be coming soon. According to the leaker <a href="https://bsky.app/profile/rquandt.bsky.social/post/3lj3ebunmy225" target="_blank">Roland Quandt</a>, Samsung is planning a follow-up to 2023’s <a href="https://www.tomsguide.com/reviews/samsung-galaxy-tab-s9-fe-hands-on-an-affordable-ipad-air-alternative">Galaxy Tab S9 FE</a>, when prices started at a far more reasonable $450.  </p><p>According to Quandt, the Galaxy Tab S10 FE will once again be available in two form factors: regular and Plus sizes. </p><p>But while the former will keep the same 10.9-inch screen as its predecessor, the latter is set to grow to 13.1 inches — a 0.7-inch size increase on its Fan Edition predecessor and the regular Tab S10 Plus, both of which measured 12.4 inches.</p><p>While that’s still smaller than the 14.6 inches of the Galaxy Tab S10 Ultra, the extra screen real estate will certainly be welcome both for content creators and consumers. </p><p>Our Australian Managing Editor, Stephen Lambrechts will certainly be happy — last year, he discovered how <a href="https://www.tomsguide.com/tablets/android-tablets/samsung-galaxy-tab-s10-plus-has-convinced-me-that-we-still-need-tablets-in-a-post-foldable-world">much more pleasurable it is to sketch, read comics and watch movies on the Galaxy Tab S10 Plus</a> over the smaller internal screens of the <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldable phones</a>. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="nutYLBxg3FARwrb63nPcvZ" name="Samsung-Galaxy-Tab-S10-Plus-sorta-homer" alt="Samsung Galaxy Tab S10 Plus demonstrating the Galaxy AI feature 'Sketch to Image'" src="https://cdn.mos.cms.futurecdn.net/nutYLBxg3FARwrb63nPcvZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Apart from screen tech, Quandt reveals two more details about the upcoming tablets. They will apparently pack up to 12GB RAM and 256GB of storage, which suggests an upgrade for the non-Plus model at least. While the Tab S9 FE Plus could be bought in a 12GB/256GB configuration, the regular tablet started with just 6GB and RAM and maxed out at 8GB. </p><p>Of course, to make it a ‘FE’ device, savings have got to be found somewhere — especially with previous models coming with a bundled S Pen — and the most obvious place to do that is with the processor. </p><p>We’ve heard that the Tab S10 FE series will use the Exynos 1580 chipset, which should certainly offer weaker performance than the MediaTek Dimensity 9300 powering the regular Tab S10 series.</p><p>While Samsung hasn’t given any indication of when the Tab S10 FE range might arrive, one big hint is hidden on the <a href="https://www.samsung.com/us/tablets/galaxy-tab-s10/offers/?merchant=17946&cid=uk_paid_affiliate_awin-TechAdvisor_0_none_Editorial+Content_0_none_none&sv1=affiliate&sv_campaign_id=254429&awc=17946_1740823391_62729c2a7ba12149178bd0104f4344dc&affiliatename=Tech%20Advisor&affiliateid=254429&clicktimestamp=1740823391" target="_blank">company’s official website</a>. </p><p>In the small print of an offer for a year’s worth of free Good Notes to tablet buyers, the text clearly says that the offer is “open to participants in the United States who purchase and activate a Tab S10 series, or Tab S10 FE series device by 7/31/2025.” Either that’s a cruel typo, or we can expect the cheaper tablets to arrive before summer is out.</p><div data-widget-type="merchantlink" data-model-name="Galaxy Tab S10 Plus"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/tablets/android-tablets/samsung-galaxy-tab-s10-fe-plus-tablet-could-pack-a-surprise-upgrade</link>
                                                                            <description>
                            <![CDATA[ A larger screen, but not quite of Galaxy Tab Ultra proportions. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">x4UpxcTB7hAdWBRsUSDLv6</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/t8GoQQe2NCN27qycBBUWtL-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 01 Mar 2025 13:41:09 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                                    <dc:creator><![CDATA[ Alan Martin ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xMmhmPSssqZHHFWveDgSs7-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/t8GoQQe2NCN27qycBBUWtL-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Tab S10 Plus held up with movie Friday playing on display]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Tab S10 Plus held up with movie Friday playing on display]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Tab S10 Plus held up with movie Friday playing on display]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/t8GoQQe2NCN27qycBBUWtL-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Samsung Galaxy Tab S series has consistently been among the <a href="https://www.tomsguide.com/best-picks/best-android-tablets">best Android tablets</a> you can buy, but they don’t come cheap. With the standard 11-inch Galaxy Tab discontinued for this generation, the cheapest current entry is the Samsung Galaxy Tab S10 Plus, which starts at $999, rising to $1,199 if you fancy the massive <a href="https://www.tomsguide.com/tablets/android-tablets/samsung-galaxy-tab-s10-ultra-review">14.6-inch Galaxy Tab S10 Ultra</a>.</p><p>Good news for those with tighter tablet budgets may be coming soon. According to the leaker <a href="https://bsky.app/profile/rquandt.bsky.social/post/3lj3ebunmy225" target="_blank">Roland Quandt</a>, Samsung is planning a follow-up to 2023’s <a href="https://www.tomsguide.com/reviews/samsung-galaxy-tab-s9-fe-hands-on-an-affordable-ipad-air-alternative">Galaxy Tab S9 FE</a>, when prices started at a far more reasonable $450.  </p><p>According to Quandt, the Galaxy Tab S10 FE will once again be available in two form factors: regular and Plus sizes. </p><p>But while the former will keep the same 10.9-inch screen as its predecessor, the latter is set to grow to 13.1 inches — a 0.7-inch size increase on its Fan Edition predecessor and the regular Tab S10 Plus, both of which measured 12.4 inches.</p><p>While that’s still smaller than the 14.6 inches of the Galaxy Tab S10 Ultra, the extra screen real estate will certainly be welcome both for content creators and consumers. </p><p>Our Australian Managing Editor, Stephen Lambrechts will certainly be happy — last year, he discovered how <a href="https://www.tomsguide.com/tablets/android-tablets/samsung-galaxy-tab-s10-plus-has-convinced-me-that-we-still-need-tablets-in-a-post-foldable-world">much more pleasurable it is to sketch, read comics and watch movies on the Galaxy Tab S10 Plus</a> over the smaller internal screens of the <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldable phones</a>. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="nutYLBxg3FARwrb63nPcvZ" name="Samsung-Galaxy-Tab-S10-Plus-sorta-homer" alt="Samsung Galaxy Tab S10 Plus demonstrating the Galaxy AI feature 'Sketch to Image'" src="https://cdn.mos.cms.futurecdn.net/nutYLBxg3FARwrb63nPcvZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Apart from screen tech, Quandt reveals two more details about the upcoming tablets. They will apparently pack up to 12GB RAM and 256GB of storage, which suggests an upgrade for the non-Plus model at least. While the Tab S9 FE Plus could be bought in a 12GB/256GB configuration, the regular tablet started with just 6GB and RAM and maxed out at 8GB. </p><p>Of course, to make it a ‘FE’ device, savings have got to be found somewhere — especially with previous models coming with a bundled S Pen — and the most obvious place to do that is with the processor. </p><p>We’ve heard that the Tab S10 FE series will use the Exynos 1580 chipset, which should certainly offer weaker performance than the MediaTek Dimensity 9300 powering the regular Tab S10 series.</p><p>While Samsung hasn’t given any indication of when the Tab S10 FE range might arrive, one big hint is hidden on the <a href="https://www.samsung.com/us/tablets/galaxy-tab-s10/offers/?merchant=17946&cid=uk_paid_affiliate_awin-TechAdvisor_0_none_Editorial+Content_0_none_none&sv1=affiliate&sv_campaign_id=254429&awc=17946_1740823391_62729c2a7ba12149178bd0104f4344dc&affiliatename=Tech%20Advisor&affiliateid=254429&clicktimestamp=1740823391" target="_blank">company’s official website</a>. </p><p>In the small print of an offer for a year’s worth of free Good Notes to tablet buyers, the text clearly says that the offer is “open to participants in the United States who purchase and activate a Tab S10 series, or Tab S10 FE series device by 7/31/2025.” Either that’s a cruel typo, or we can expect the cheaper tablets to arrive before summer is out.</p><div data-widget-type="merchantlink" data-model-name="Galaxy Tab S10 Plus"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Google Pixel Tablet is cheaper than ever in epic post-Christmas deal — Save $120 ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Google Pixel Tablet is easily one of the most underrated slates. It makes the cut on our detailed <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablet</a> list as the best option for the smart home. It's<a href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZMFZ84J" target="_blank" rel="nofollow"> currently on sale for $279 at Amazon</a>, an impressive $120 off the regular price and tied for the all-time low.</p><p>If you want a new tablet at an excellent price and would rather avoid Apple's iPad devices, the Pixel Tablet is a good choice. Between the wealth of smart home features and reliable performance from the Tensor processor. </p><div class="product"><a data-dimension112="37c42fbc-f1cf-418c-a5cd-82f24b856420" data-action="Deal Block" data-label="Pixel Tablet (128GB)" data-dimension48="Pixel Tablet (128GB)" data-dimension25="$279" href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZMFZ84J" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="u8yDk6yKYeXMkdRrQocf9n" name="Google Pixel Tablet.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/u8yDk6yKYeXMkdRrQocf9n-1920-80.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZMFZ84J" target="_blank" rel="nofollow" data-dimension112="37c42fbc-f1cf-418c-a5cd-82f24b856420" data-action="Deal Block" data-label="Pixel Tablet (128GB)" data-dimension48="Pixel Tablet (128GB)" data-dimension25="$279">Pixel Tablet (128GB): was $399 now $279</a></strong><br>The Google Pixel Tablet is one of the best tablets on the market, even without a deal. In our <a href="https://www.tomsguide.com/reviews/google-pixel-tablet">Google Pixel Tablet review</a>, we praised its sharp 8MP f/2.0 cameras, bright 11-inch 2560 x 1600 display, and great photo editing features. The charging dock adds a strong speaker and excellent smart home functionality. With $120 off, this is a fantastic deal.<a class="view-deal button" href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZMFZ84J" target="_blank" rel="nofollow" data-dimension112="37c42fbc-f1cf-418c-a5cd-82f24b856420" data-action="Deal Block" data-label="Pixel Tablet (128GB)" data-dimension48="Pixel Tablet (128GB)" data-dimension25="$279">View Deal</a></p></div><div class="product"><a data-dimension112="f5c10363-3bc2-48b2-9e0c-8606abbd3f4c" data-action="Deal Block" data-label="Pixel Tablet (256GB)" data-dimension48="Pixel Tablet (256GB)" data-dimension25="$359" href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZM9N4ZS" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:600px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="mZEhX39LM4ZAKXdVRn2fhS" name="Google Pixel Tablet.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/mZEhX39LM4ZAKXdVRn2fhS-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZM9N4ZS" target="_blank" rel="nofollow" data-dimension112="f5c10363-3bc2-48b2-9e0c-8606abbd3f4c" data-action="Deal Block" data-label="Pixel Tablet (256GB)" data-dimension48="Pixel Tablet (256GB)" data-dimension25="$359">Pixel Tablet (256GB): was $499 now $359</a></strong><br>Everything I said about the 128GB version of the Pixel Tablet applies to this version, except it costs more and offers more storage. However, it's discounted by $140, so you can save a little more by choosing the more expensive model.<a class="view-deal button" href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZM9N4ZS" target="_blank" rel="nofollow" data-dimension112="f5c10363-3bc2-48b2-9e0c-8606abbd3f4c" data-action="Deal Block" data-label="Pixel Tablet (256GB)" data-dimension48="Pixel Tablet (256GB)" data-dimension25="$359">View Deal</a></p></div><p>Our U.S. Editor in Chief gave the Pixel Tablet four stars in our review, which means it's a fantastic device. When testing it, he was particularly fond of the good photo quality and deep photo editing features. It's just an all-around well-made tablet with a generous set of AI and other features.</p><p>We also liked the Speaker Dock, which doesn't come with the discounted models. If you want the device with the Speaker Dock, you'll need to spend <a href="https://www.amazon.com/Google-Pixel-Tablet-Charging-Speaker/dp/B0C1SHGHSZ" target="_blank" rel="nofollow">$399 for the 128GB</a> version and <a href="https://www.amazon.com/Google-Pixel-Tablet-Charging-Speaker/dp/B0C1SL9TW8" target="_blank" rel="nofollow">$459 for the 256GB</a> model. Those models are slightly reduced from their regular price but not as substantially as the standalone tablet.</p><p>While it's affordable, the Pixel Tablet still has solid specs — the 11-inch display with a 2560 x 1600 resolution is one standout specification offered by Google's slate. </p><p>If you're a <a href="https://www.tomsguide.com/us/best-smart-home-devices,review-2008.html">smart home</a> user, the Pixel Tablet can still do the job as a fantastic hub without the Speaker Dock so that you can keep tabs on everything happening in your home with it. </p><div data-model-name="Apple iPad Air (2024),OnePlus Pad,Amazon Fire 7 (2022),Samsung Galaxy Tab S9 Ultra,Apple iPad Pro M4,Microsoft Surface Pro 9,Pixel Tablet" data-widget-type="multimodelreview" data-widget-title="Best tablet deals"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/tablets/android-tablets/google-pixel-tablet-is-cheaper-than-ever-in-epic-post-christmas-deal-save-usd120</link>
                                                                            <description>
                            <![CDATA[ The Google Pixel Tablet is an incredible device and it's worth getting in this epic post-Christmas deal. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Ca5DvH4xRykB2xw9HHRiK6</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/BrYjJDXSBhqgB6MAQneHUf-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 26 Dec 2024 15:36:08 +0000</pubDate>                                                                                                                                <updated>Thu, 10 Apr 2025 14:04:07 +0000</updated>
                                                                                                                                            <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                <author><![CDATA[ dave.leclair@futurenet.com (Dave LeClair) ]]></author>                    <dc:creator><![CDATA[ Dave LeClair ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/fyx7qYdxPMTNBhdnMfNmaB-320-70.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Dave LeClair is the Managing News Editor for Tom&#039;s Guide, keeping his finger on the pulse of all things technology. He loves taking the complicated happenings in the tech world and explaining why they matter. Whether Apple is announcing the next big thing in the mobile space or a small startup advancing generative AI, Dave will apply his experience to help you figure out what&#039;s happening and why it&#039;s relevant to your life.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Before Tom&#039;s Guide, Dave worked for publications like PCMag, Pocket-lint, MUO, How-To Geek, Digital Trends, and others. He started writing about technology professionally for MUO in 2011 and hasn&#039;t looked back since. In addition to news, you can find reviews, how-to pieces, shopping guides, and many other types of content with Dave&#039;s name attached.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/BrYjJDXSBhqgB6MAQneHUf-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Google Pixel Tablet in-hand]]></media:description>                                                            <media:text><![CDATA[Google Pixel Tablet in-hand]]></media:text>
                                <media:title type="plain"><![CDATA[Google Pixel Tablet in-hand]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/BrYjJDXSBhqgB6MAQneHUf-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Google Pixel Tablet is easily one of the most underrated slates. It makes the cut on our detailed <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablet</a> list as the best option for the smart home. It's<a href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZMFZ84J" target="_blank" rel="nofollow"> currently on sale for $279 at Amazon</a>, an impressive $120 off the regular price and tied for the all-time low.</p><p>If you want a new tablet at an excellent price and would rather avoid Apple's iPad devices, the Pixel Tablet is a good choice. Between the wealth of smart home features and reliable performance from the Tensor processor. </p><div class="product"><a data-dimension112="37c42fbc-f1cf-418c-a5cd-82f24b856420" data-action="Deal Block" data-label="Pixel Tablet (128GB)" data-dimension48="Pixel Tablet (128GB)" data-dimension25="$279" href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZMFZ84J" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="u8yDk6yKYeXMkdRrQocf9n" name="Google Pixel Tablet.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/u8yDk6yKYeXMkdRrQocf9n-1920-80.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZMFZ84J" target="_blank" rel="nofollow" data-dimension112="37c42fbc-f1cf-418c-a5cd-82f24b856420" data-action="Deal Block" data-label="Pixel Tablet (128GB)" data-dimension48="Pixel Tablet (128GB)" data-dimension25="$279">Pixel Tablet (128GB): was $399 now $279</a></strong><br>The Google Pixel Tablet is one of the best tablets on the market, even without a deal. In our <a href="https://www.tomsguide.com/reviews/google-pixel-tablet">Google Pixel Tablet review</a>, we praised its sharp 8MP f/2.0 cameras, bright 11-inch 2560 x 1600 display, and great photo editing features. The charging dock adds a strong speaker and excellent smart home functionality. With $120 off, this is a fantastic deal.<a class="view-deal button" href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZMFZ84J" target="_blank" rel="nofollow" data-dimension112="37c42fbc-f1cf-418c-a5cd-82f24b856420" data-action="Deal Block" data-label="Pixel Tablet (128GB)" data-dimension48="Pixel Tablet (128GB)" data-dimension25="$279">View Deal</a></p></div><div class="product"><a data-dimension112="f5c10363-3bc2-48b2-9e0c-8606abbd3f4c" data-action="Deal Block" data-label="Pixel Tablet (256GB)" data-dimension48="Pixel Tablet (256GB)" data-dimension25="$359" href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZM9N4ZS" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:600px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="mZEhX39LM4ZAKXdVRn2fhS" name="Google Pixel Tablet.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/mZEhX39LM4ZAKXdVRn2fhS-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZM9N4ZS" target="_blank" rel="nofollow" data-dimension112="f5c10363-3bc2-48b2-9e0c-8606abbd3f4c" data-action="Deal Block" data-label="Pixel Tablet (256GB)" data-dimension48="Pixel Tablet (256GB)" data-dimension25="$359">Pixel Tablet (256GB): was $499 now $359</a></strong><br>Everything I said about the 128GB version of the Pixel Tablet applies to this version, except it costs more and offers more storage. However, it's discounted by $140, so you can save a little more by choosing the more expensive model.<a class="view-deal button" href="https://www.amazon.com/Google-Pixel-Tablet-Android-Extra-Long/dp/B0CZM9N4ZS" target="_blank" rel="nofollow" data-dimension112="f5c10363-3bc2-48b2-9e0c-8606abbd3f4c" data-action="Deal Block" data-label="Pixel Tablet (256GB)" data-dimension48="Pixel Tablet (256GB)" data-dimension25="$359">View Deal</a></p></div><p>Our U.S. Editor in Chief gave the Pixel Tablet four stars in our review, which means it's a fantastic device. When testing it, he was particularly fond of the good photo quality and deep photo editing features. It's just an all-around well-made tablet with a generous set of AI and other features.</p><p>We also liked the Speaker Dock, which doesn't come with the discounted models. If you want the device with the Speaker Dock, you'll need to spend <a href="https://www.amazon.com/Google-Pixel-Tablet-Charging-Speaker/dp/B0C1SHGHSZ" target="_blank" rel="nofollow">$399 for the 128GB</a> version and <a href="https://www.amazon.com/Google-Pixel-Tablet-Charging-Speaker/dp/B0C1SL9TW8" target="_blank" rel="nofollow">$459 for the 256GB</a> model. Those models are slightly reduced from their regular price but not as substantially as the standalone tablet.</p><p>While it's affordable, the Pixel Tablet still has solid specs — the 11-inch display with a 2560 x 1600 resolution is one standout specification offered by Google's slate. </p><p>If you're a <a href="https://www.tomsguide.com/us/best-smart-home-devices,review-2008.html">smart home</a> user, the Pixel Tablet can still do the job as a fantastic hub without the Speaker Dock so that you can keep tabs on everything happening in your home with it. </p><div data-model-name="Apple iPad Air (2024),OnePlus Pad,Amazon Fire 7 (2022),Samsung Galaxy Tab S9 Ultra,Apple iPad Pro M4,Microsoft Surface Pro 9,Pixel Tablet" data-widget-type="multimodelreview" data-widget-title="Best tablet deals"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Act fast! Samsung Galaxy Tab S9 FE is at its lowest price ever right now ]]></title>
                                                                                                <dc:content><![CDATA[ <p>While Apple is the brand most synonymous with tablets, Samsung still makes some of the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a> worth considering for Android fans. </p><p>The Galaxy Tab S9 FE offers the perfect balance of performance and price at its regular $449 cost. With this insane deal that gets you the <a href="https://www.amazon.com/SAMSUNG-Dust-Resistant-Powerful-Processor-Lightweight/dp/B0CCX11JT6?th=1" target="_blank" rel="nofollow">Galaxy Tab S9 FE for $280 at Amazon</a>, the value goes through the roof. Without sacrificing the performance, you get to save $170, which is a huge win.</p><div class="product"><a data-dimension112="9bd0c2de-cefc-4a9d-9963-b0c15622547b" data-action="Deal Block" data-label="Galaxy Tab S9 FE" data-dimension48="Galaxy Tab S9 FE" data-dimension25="$280" href="https://www.amazon.com/SAMSUNG-Dust-Resistant-Powerful-Processor-Lightweight/dp/B0CCX11JT6" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:827px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="CMSrqJPPMBytzFX2ucDb8E" name="Samsung Galaxy Tab S9 FE" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/CMSrqJPPMBytzFX2ucDb8E-1920-80.jpg" mos="" align="middle" fullscreen="" width="827" height="827" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Galaxy Tab S9 FE is an excellent tablet for this price (which just happens to be an all-time low). In our <a href="https://www.tomsguide.com/reviews/samsung-galaxy-tab-s9-fe-hands-on-an-affordable-ipad-air-alternative" data-dimension112="9bd0c2de-cefc-4a9d-9963-b0c15622547b" data-action="Deal Block" data-label="Galaxy Tab S9 FE" data-dimension48="Galaxy Tab S9 FE" data-dimension25="$280">Galaxy Tab S9 FE hands-on</a>, we liked the robust multitasking features and included S Pen, and you get all that and more with this deal. If you received some Amazon gift cards for Christmas, this is a great way to spend them on something that's both fun and productive.<a class="view-deal button" href="https://www.amazon.com/SAMSUNG-Dust-Resistant-Powerful-Processor-Lightweight/dp/B0CCX11JT6" target="_blank" rel="nofollow" data-dimension112="9bd0c2de-cefc-4a9d-9963-b0c15622547b" data-action="Deal Block" data-label="Galaxy Tab S9 FE" data-dimension48="Galaxy Tab S9 FE" data-dimension25="$280">View Deal</a></p></div><p>This tablet has a powerful Exynos 1380 chip, which allows it to handle multitasking and gaming without struggle. It only has 6GB of RAM, which could be better, but it's optimized well enough to feel snappy and powerful.</p><p>In our hands-on impressions of the tablet, our own John Velasco said of its design, "There’s definitely a premium feel that I like about it, and its design is boosted by its IP68 water-resistant construction, AKG tuned speakers with Dolby Atmos support, and most notably, the inclusion of the S Pen."</p><p>Essentially, if you're looking to get an iPad Air alternative at a base model iPad price, you'll want to jump on this deal while you can. The 10.9-inch screen with the tasty 2304 X 1440 resolution is great for web browsing, reading, and more. And don't forget the included S Pen that'll help you with all the creative art tasks you'll want to accomplish once this beautiful slate arrives.</p><p>Velasco rounded out his thoughts on the Tab S9 FE, saying it "can’t be overlooked," and I couldn't agree more, especially with how affordable it is at $280. </p><div data-widget-type="multimodelreview" data-model-name="Galaxy Tab S9,Galaxy Tab S9 FE,Galaxy Tab S9 Plus,Galaxy Tab S9 Ultra" data-widget-title="Samsung tablet deals"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/tablets/android-tablets/act-fast-samsung-galaxy-tab-s9-fe-is-at-its-lowest-price-ever-right-now</link>
                                                                            <description>
                            <![CDATA[ If you're looking for a fantastic tablet at an absurd price, this deal is for you. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Qmb96ecmUES7YMg5jmcjRX</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/qJwTxR8TJhLavSaurJxDZj-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 25 Dec 2024 14:14:01 +0000</pubDate>                                                                                                                                <updated>Thu, 10 Apr 2025 14:04:43 +0000</updated>
                                                                                                                                            <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                <author><![CDATA[ dave.leclair@futurenet.com (Dave LeClair) ]]></author>                    <dc:creator><![CDATA[ Dave LeClair ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/fyx7qYdxPMTNBhdnMfNmaB-320-70.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Dave LeClair is the Managing News Editor for Tom&#039;s Guide, keeping his finger on the pulse of all things technology. He loves taking the complicated happenings in the tech world and explaining why they matter. Whether Apple is announcing the next big thing in the mobile space or a small startup advancing generative AI, Dave will apply his experience to help you figure out what&#039;s happening and why it&#039;s relevant to your life.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Before Tom&#039;s Guide, Dave worked for publications like PCMag, Pocket-lint, MUO, How-To Geek, Digital Trends, and others. He started writing about technology professionally for MUO in 2011 and hasn&#039;t looked back since. In addition to news, you can find reviews, how-to pieces, shopping guides, and many other types of content with Dave&#039;s name attached.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/qJwTxR8TJhLavSaurJxDZj-1920-80.jpg">
                                                            <media:credit><![CDATA[Samsung]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Tab S9 FE+]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Tab S9 FE+]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Tab S9 FE+]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/qJwTxR8TJhLavSaurJxDZj-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>While Apple is the brand most synonymous with tablets, Samsung still makes some of the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a> worth considering for Android fans. </p><p>The Galaxy Tab S9 FE offers the perfect balance of performance and price at its regular $449 cost. With this insane deal that gets you the <a href="https://www.amazon.com/SAMSUNG-Dust-Resistant-Powerful-Processor-Lightweight/dp/B0CCX11JT6?th=1" target="_blank" rel="nofollow">Galaxy Tab S9 FE for $280 at Amazon</a>, the value goes through the roof. Without sacrificing the performance, you get to save $170, which is a huge win.</p><div class="product"><a data-dimension112="9bd0c2de-cefc-4a9d-9963-b0c15622547b" data-action="Deal Block" data-label="Galaxy Tab S9 FE" data-dimension48="Galaxy Tab S9 FE" data-dimension25="$280" href="https://www.amazon.com/SAMSUNG-Dust-Resistant-Powerful-Processor-Lightweight/dp/B0CCX11JT6" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:827px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="CMSrqJPPMBytzFX2ucDb8E" name="Samsung Galaxy Tab S9 FE" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/CMSrqJPPMBytzFX2ucDb8E-1920-80.jpg" mos="" align="middle" fullscreen="" width="827" height="827" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Galaxy Tab S9 FE is an excellent tablet for this price (which just happens to be an all-time low). In our <a href="https://www.tomsguide.com/reviews/samsung-galaxy-tab-s9-fe-hands-on-an-affordable-ipad-air-alternative" data-dimension112="9bd0c2de-cefc-4a9d-9963-b0c15622547b" data-action="Deal Block" data-label="Galaxy Tab S9 FE" data-dimension48="Galaxy Tab S9 FE" data-dimension25="$280">Galaxy Tab S9 FE hands-on</a>, we liked the robust multitasking features and included S Pen, and you get all that and more with this deal. If you received some Amazon gift cards for Christmas, this is a great way to spend them on something that's both fun and productive.<a class="view-deal button" href="https://www.amazon.com/SAMSUNG-Dust-Resistant-Powerful-Processor-Lightweight/dp/B0CCX11JT6" target="_blank" rel="nofollow" data-dimension112="9bd0c2de-cefc-4a9d-9963-b0c15622547b" data-action="Deal Block" data-label="Galaxy Tab S9 FE" data-dimension48="Galaxy Tab S9 FE" data-dimension25="$280">View Deal</a></p></div><p>This tablet has a powerful Exynos 1380 chip, which allows it to handle multitasking and gaming without struggle. It only has 6GB of RAM, which could be better, but it's optimized well enough to feel snappy and powerful.</p><p>In our hands-on impressions of the tablet, our own John Velasco said of its design, "There’s definitely a premium feel that I like about it, and its design is boosted by its IP68 water-resistant construction, AKG tuned speakers with Dolby Atmos support, and most notably, the inclusion of the S Pen."</p><p>Essentially, if you're looking to get an iPad Air alternative at a base model iPad price, you'll want to jump on this deal while you can. The 10.9-inch screen with the tasty 2304 X 1440 resolution is great for web browsing, reading, and more. And don't forget the included S Pen that'll help you with all the creative art tasks you'll want to accomplish once this beautiful slate arrives.</p><p>Velasco rounded out his thoughts on the Tab S9 FE, saying it "can’t be overlooked," and I couldn't agree more, especially with how affordable it is at $280. </p><div data-widget-type="multimodelreview" data-model-name="Galaxy Tab S9,Galaxy Tab S9 FE,Galaxy Tab S9 Plus,Galaxy Tab S9 Ultra" data-widget-title="Samsung tablet deals"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung Galaxy Tab S10 Ultra review ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Samsung Galaxy Tab S10 Ultra ($1,199 to start) is the latest and greatest slate Samsung has released in 2024, not to mention the biggest.</p><p>But at this point that's no surprise, since Samsung has been releasing super-sized Ultra tablets since it debuted the Galaxy Tab S8 Ultra in 2022. This is the third iteration of Samsung's massive Ultra slate, and while the 14.6-inch AMOLED display remains the star of the show there's a new MediaTek Dimensity 9300+ chip under the hood providing a much-needed speed boost.</p><p>Unfortunately, that's basically the only notable upgrade in this 2024 Ultra, and while the speed is nice it can't compare to the power of Apple's latest iPad Pro M4. So while this isn't the <a href="https://www.tomsguide.com/best-picks/best-tablet" target="_blank">best tablet</a> released this year, it is one of the <a href="https://www.tomsguide.com/best-picks/best-android-tablets" target="_blank">best Android tablets</a> you can buy if you want a laptop replacement or just the most ginormous screen possible. </p><h2 class="article-body__section" id="section-samsung-galaxy-tab-s10-ultra-review-cheat-sheet"><span>Samsung Galaxy Tab S10 Ultra review: Cheat sheet</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Q26TmXhETVUDdDEV6QtPBT" name="Samsung Galaxy Tab S10 Ultra (2024)-02.jpg" alt="Samsung Galaxy Tab S10 Ultra review unit on a desk" src="https://cdn.mos.cms.futurecdn.net/Q26TmXhETVUDdDEV6QtPBT-1920-80.jpg" mos="" align="middle" fullscreen="1" width="2000" height="1125" attribution="" endorsement="" class="expandable"><a href='https://cdn.mos.cms.futurecdn.net/Q26TmXhETVUDdDEV6QtPBT-1920-80.jpg' target='_blank' class='expand-button icon-expand-image icon' ></a></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><ul><li><strong>What is it?</strong> As the name suggest, the Samsung Galaxy Tab S10 Ultra is the biggest, most expensive tablet in Samsung's Galaxy Tab S10 family of slates.</li><li><strong>What does it cost?</strong> $1,199 to start via Samsung's <a href="https://www.samsung.com/us/tablets/galaxy-tab-s10/buy/galaxy-tab-s10-ultra-256gb-moonstone-gray-wi-fi-sm-x920nzaaxar/" target="_blank" rel="nofollow">website</a>, though the price rises if you upgrade the Samsung Galaxy Tab S10 Ultra and falls if you take advantage of Samsung's trade-in deals.</li><li><strong>Who is it for? </strong>Anyone who wants a top-of-the-line $1,200+ Android tablet with a nearly 15-inch AMOLED screen. It's well-suited for watching movies and using as a laptop replacement.</li><li><strong>What do we like?</strong> The big, lovely AMOLED display, the speedy performance that can run any app in the Google Play Store and the packed-in stylus.</li><li><strong>What don’t we like?</strong> The size of this tablet makes it a bit unwieldy to use, even with both hands.</li></ul><div data-model-name="Samsung Galaxy Tab S10 Ultra" data-widget-type="review"></div><h2 class="article-body__section" id="section-samsung-galaxy-tab-s10-ultra-review-specs"><span>Samsung Galaxy Tab S10 Ultra review: Specs</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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4R8gV5zJNvTq8qt5VFazvS" name="Samsung Galaxy Tab S10 Ultra (2024)-09.jpg" alt="Samsung Galaxy Tab S10 Ultra review unit on a desk" src="https://cdn.mos.cms.futurecdn.net/4R8gV5zJNvTq8qt5VFazvS-1920-80.jpg" mos="" align="middle" fullscreen="1" width="2000" height="1125" attribution="" endorsement="" class="expandable"><a href='https://cdn.mos.cms.futurecdn.net/4R8gV5zJNvTq8qt5VFazvS-1920-80.jpg' target='_blank' class='expand-button icon-expand-image icon' ></a></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><div ><table><thead><tr><th class="firstcol empty" ></th><th  >Samsung Galaxy Tab S10 Ultra</th></tr></thead><tbody><tr><td class="firstcol " ><strong>Price</strong></td><td  >$1,199 to start</td></tr><tr><td class="firstcol " ><strong>Display</strong></td><td  >14.6-inch 3K (2960 x 1848 pixels) Dynamic AMOLED</td></tr><tr><td class="firstcol " ><strong>Chip </strong></td><td  >MediaTek Dimensity 9300+</td></tr><tr><td class="firstcol " ><strong>RAM</strong></td><td  >12GB</td></tr><tr><td class="firstcol " ><strong>Storage</strong></td><td  >256GB </td></tr><tr><td class="firstcol " ><strong>Cameras </strong></td><td  >12MP FF + Ultrawide (front), 13MP AF + 8MP UW (rear)</td></tr><tr><td class="firstcol " ><strong>Wireless</strong></td><td  >Wi-Fi 7, Bluetooth 5.3</td></tr><tr><td class="firstcol " ><strong>Size</strong></td><td  >12.85 x 8.21 x 0.21 inches</td></tr><tr><td class="firstcol " ><strong>Weight </strong></td><td  >1.58 pounds</td></tr></tbody></table></div><h2 class="article-body__section" id="section-samsung-galaxy-tab-s10-ultra-review-the-ups"><span>Samsung Galaxy Tab S10 Ultra review: The ups</span></h2><p>I like the Samsung Galaxy Tab S10 Ultra because it feels like a big, premium Android tablet with an eye-catching AMOLED display. Here are a few specific things I love about this slate.</p><h2 id="big-amoled-display-makes-everything-look-great">Big AMOLED display makes everything look great</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rdJF4ZuxDoKFYaBWxi85jS" name="Samsung Galaxy Tab S10 Ultra (2024)-06.jpg" alt="Samsung Galaxy Tab S10 Ultra review unit on a desk" src="https://cdn.mos.cms.futurecdn.net/rdJF4ZuxDoKFYaBWxi85jS-1920-80.jpg" mos="" align="middle" fullscreen="1" width="2000" height="1125" attribution="" endorsement="" class="expandable"><a href='https://cdn.mos.cms.futurecdn.net/rdJF4ZuxDoKFYaBWxi85jS-1920-80.jpg' target='_blank' class='expand-button icon-expand-image icon' ></a></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I love a good OLED screen, so the 14.6-inch AMOLED display on the Samsung Galaxy Tab S10 Ultra is one of the things I adore most about it. I'm happy Samsung has put such a good screen on this slate because it's huge and 99% display, so you'll spend all your time looking at what you spent your money on.</p><p>I know because I spent hours playing games and streaming movies on this slate, and the colors really pop with lots of nice contrasts between lights and darks. </p><p>While I sometimes grew frustrated with the way fingerprints show up on the screen quite easily, it's easy to wipe them off with a cleaning cloth whenever they begin to irritate you.</p><div ><table><caption>Display benchmarks</caption><thead><tr><th class="firstcol empty" ></th><th  >Samsung Galaxy Tab S10 Ultra</th><th  >iPad Pro M4</th><th  >OnePlus Pad 2</th></tr></thead><tbody><tr><td class="firstcol " ><strong>Nits (brightness)</strong></td><td  >564/775 (SDR/HDR)</td><td  >938/1516 (SDR/HDR)</td><td  >580/555 (SDR/HDR)</td></tr><tr><td class="firstcol " ><strong>sRGB</strong></td><td  >141.1%</td><td  >117.4%</td><td  >105.7%</td></tr><tr><td class="firstcol " ><strong>DCI-P3</strong></td><td  >99.2%</td><td  >83.2%</td><td  >74.9%</td></tr><tr><td class="firstcol " ><strong>Delta-E</strong></td><td  >0.22</td><td  >0.29</td><td  >0.25</td></tr></tbody></table></div><p>When we brought our Samsung Galaxy Tab S10 Ultra review unit into our testing lab and pointed our instruments at it, we discovered this slate is capable getting decently bright, peaking at roughly 775 nits when viewing HDR content.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Dp56zb83CbZPBsoqnjhzPT" name="Samsung Galaxy Tab S10 Ultra (2024)-04.jpg" alt="Samsung Galaxy Tab S10 Ultra review unit on a desk" src="https://cdn.mos.cms.futurecdn.net/Dp56zb83CbZPBsoqnjhzPT-1920-80.jpg" mos="" align="middle" fullscreen="1" width="2000" height="1125" attribution="" endorsement="" class="expandable"><a href='https://cdn.mos.cms.futurecdn.net/Dp56zb83CbZPBsoqnjhzPT-1920-80.jpg' target='_blank' class='expand-button icon-expand-image icon' ></a></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>It's also capable of good color reproduction, and proved better at covering the more demanding DCI-P3 color gamut than either Apple's new iPad Pro M4 or the OnePlus Pad 2.</p><p>However, Apple's iPad Pro M4 with its Tandem OLED display is capable of getting far brighter than the Galaxy Tab S10 Ultra. So if a bright screen is the most important thing to look for in a tablet, the Ultra is fine but Apple's Pro slate can get far brighter for nearly the same price.</p><h2 id="under-the-hood-upgrade-helps-this-slate-feel-speedy">Under-the-hood upgrade helps this slate feel speedy</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hbkTpkG7SthdfJJ7anNCfT" name="Samsung Galaxy Tab S10 Ultra (2024)-07.jpg" alt="Samsung Galaxy Tab S10 Ultra review unit on a desk" src="https://cdn.mos.cms.futurecdn.net/hbkTpkG7SthdfJJ7anNCfT-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">You can stream movies and music while editing documents, all while flipping back and forth between browser tabs to do research, without the S10 Ultra bogging down. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Samsung Galaxy Tab S10 Ultra runs on a MediaTek Dimensity 9300+ SoC, which is a bit of an upgrade from the Qualcomm Snapdragon 8 Gen 2 which powered its predecessor. </p><p>It's plenty fast enough to run most any app you can pull from the Google Play Store at good to great framerates, and I had a good time playing games, watching movies and multitasking between apps on the S10 Ultra without noticing any major lag or slowdown.</p><p>I really like how snappy and fast the Galaxy Tab S10 Ultra feels, and I do think it's one of the high points of splurging on this expensive slate. However, when we got the S10 Ultra into our testing lab and ran in through some benchmarking utilities we saw that while it performs well, it can't keep pace with Apple's top-tier iPad Pro M4.</p><div ><table><caption>Performance benchmarks</caption><thead><tr><th class="firstcol empty" ></th><th  >Samsung Galaxy Tab S10 Ultra</th><th  >iPad Pro M4</th><th  >OnePlus Pad 2</th></tr></thead><tbody><tr><td class="firstcol " ><strong>Geekbench 6 single-core</strong></td><td  >2171</td><td  >3700</td><td  >2033</td></tr><tr><td class="firstcol " ><strong>Geekbench 6 multi-core</strong></td><td  >7246</td><td  >14523</td><td  >6161</td></tr><tr><td class="firstcol " ><strong>3DMark Wild Life Extreme Unlimited</strong></td><td  >5256</td><td  >8529</td><td  >4440</td></tr></tbody></table></div><p>We run all tablets we test through a gauntlet of tests, and the chart of results above shows you a rundown of how the Samsung Galaxy Tab S10 Ultra scored versus the iPad Pro M4 and OnePlus Pad 2. These benchmarks assign scores to a tablet based on how well it performs: we use Geekbench 6 to test a tablet's CPU capabilities, and 3DMark to test its graphical output.</p><p>As you can see, the Samsung Galaxy Tab S10 Ultra is neck-and-neck with the One Plus Pad 2 when it comes to single-core and multi-core CPU performance, though the OnePlus Pad 2 falls into last place when it comes to graphical performance.</p><p>But in every test, Apple's iPad Pro M4 blows both Android tablets out of the water. The M4 chip is simply faster and better, so if pure performance is all you care about the S10 Ultra is clearly not the best tablet for you.</p><h2 id="packed-in-stylus-is-a-welcome-touch">Packed-in stylus is a welcome touch</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="QgDz9qcvSWj8TUv3sDmZ4S" name="Samsung Galaxy Tab S10 Ultra (2024)-05.jpg" alt="Samsung Galaxy Tab S10 Ultra review unit on a desk" src="https://cdn.mos.cms.futurecdn.net/QgDz9qcvSWj8TUv3sDmZ4S-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Maybe it seems like a minor detail when you're looking at spending over $1,000 on a new tablet, but I love that Samsung includes a stylus for free with every Galaxy Tab S10 Ultra.</p><p>Apple doesn't give you the same courtesy, and I think that's a real failing because getting a tablet with a stylus included gives you permission to immediately start using it as a content creation device. Sure, you can use your fingers to draw or paint on a tablet, but I find it feels inaccurate and no fun at all. </p><p>But with the Samsung Galaxy Tab S10 Ultra, you can immediately start taking notes, annotating papers and doodling notes in the margins. The stylus also snaps magnetically to the tablet, either on the edge or on the rear, making it pretty easy to keep track of when you're moving around. </p><h2 class="article-body__section" id="section-samsung-galaxy-tab-s10-ultra-review-the-downs"><span>Samsung Galaxy Tab S10 Ultra review: The downs</span></h2><p>While I love the Samsung Galaxy Tab S10 Ultra for its sheer size and audacity, there are some downsides you should know about before you buy.</p><h2 id="this-is-an-awkward-tablet-for-all-but-the-biggest-hands">This is an awkward tablet for all but the biggest hands</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4XQigRey7s9hJCkAsZiQk8" name="Samsung Galaxy Tab S10 Ultra (2024)-09.jpg" alt="Samsung Galaxy Tab S10 Ultra review unit on a desk" src="https://cdn.mos.cms.futurecdn.net/4XQigRey7s9hJCkAsZiQk8-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I'm 6'4" tall with big hands, and even I find the Samsung Galaxy Tab S10 Ultra a little frustrating to use as a tablet because of its sheer size.</p><p>Don't get me wrong, it's amazing that you can hold this 14.6-inch AMOLED tablet in your hands and carry it around like a portable screen that opens up onto the Internet. The screen size takes some getting used to, but once you do you'll find yourself squinting at all your other mobile devices. </p><p>But even I basically have to use this thing propped up on a pillow, a couch arm or something else to help me manage the weight. Sure, 1.58 pounds doesn't sound like much, but it's really the awkward size of the tablet that makes it feel so burdensome. you can hold it with both hands for a few minutes, but trying to hang onto it while watching an episode of your favorite show or playing your favorite games can be a real pain. </p><p>Unfortunately, the only good permanent solution to this problem is to buy a nice case that comes with a built-in kickstand or something else you can use to prop the tablet up when you're tired of holding it. </p><h2 id="costs-the-same-more-as-ipad-pro-m4-performs-worse">Costs the same/more as iPad Pro M4, performs worse</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="CbZLEaXKiMGtYPNTU5cAT7" name="Samsung Galaxy Tab S10 Ultra (2024)-03.jpg" alt="Samsung Galaxy Tab S10 Ultra review unit on a desk" src="https://cdn.mos.cms.futurecdn.net/CbZLEaXKiMGtYPNTU5cAT7-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>As much as I like the Samsung Galaxy Tab S10 Ultra, I have to say that it's really hard to recommend over the iPad Pro M4 if you're open to using Apple's tablets.</p><p>That was less true in years past, when Samsung's Ultra tablets sported AMOLED displays while Apple's iPads all had LCD screens. When that was true you could buy a Samsung tablet and feel like even if you weren't getting iPad speeds or apps, you were getting a nicer display that made everything look better than it would on an iPad.</p><p>But now the iPad Pro M4 comes with a Tandem OLED display that gets brighter and more colorful than the Galaxy Tab S10 Ultra, so Samsung's slates have lost their OLED advantage. On top of that, the M4 chip drives the latest iPad Pro to greater heights of performance and better battery life than the Samsung Galaxy Tab S10 Ultra (the Pro M4 lasted 13:13 in our testing, while the S10 Ultra lasted just 9:22), and there's no reason not to choose an iPad Pro M4 if you're not tied to Google's app ecosystem.</p><p>Factor in the fact that the entry-level 11-inch iPad Pro M4 starts at $999, while the 13-inch model starts just over the S10 Ultra at $1,299, and you can see why I think it sucks that the S10 Ultra can't match the performance or power efficiency of the M4 chip.</p><h2 class="article-body__section" id="section-samsung-galaxy-tab-s10-ultra-review-verdict"><span>Samsung Galaxy Tab S10 Ultra review: Verdict</span></h2><p>If you've made it this far you know the Samsung Galaxy Tab S10 Ultra is the latest edition of the biggest Android tablet you can buy from Samsung right now, and it looks great and feels snappy.</p><p>It's marketed as a laptop replacement, and I've used it that way myself while working in both standard mode and DeX mode. Both are doable, and in the wake of Android 14 landing I think there's never been a better time to own an Android tablet. If you need one with a massive screen, either for enjoying movies like a king or getting work done on the road, this is a great choice.</p><p>But like I said, Apple's M4 chip is just plain better than what the Samsung Galaxy Tab S10 Ultra is packing under the hood. So while the S10 Ultra is easily among the <a href="https://www.tomsguide.com/best-picks/best-samsung-tablets">best Samsung tablets</a> you can buy right now, those open to Apple's ways might be happier spending that money on an iPad Pro M4.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/tablets/android-tablets/samsung-galaxy-tab-s10-ultra-review</link>
                                                                            <description>
                            <![CDATA[ The Samsung Galaxy Tab S10 Ultra is the company's latest ultra-large Android tablet with a stunning 14.6-inch AMOLED display and even more power under the hood. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">RqfwsDXnxK94vNi3YwGCXc</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/cD8vcANL2ViyASkcTPGit9-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 12 Dec 2024 02:51:03 +0000</pubDate>                                                                                                                                <updated>Thu, 26 Mar 2026 10:28:40 +0000</updated>
                                                                                                                                            <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                <author><![CDATA[ alex.wawro@futurenet.com (Alex Wawro) ]]></author>                    <dc:creator><![CDATA[ Alex Wawro ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/Y4wW9n7CZrNzgofqVkGA5J-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Alex Wawro was a senior editor for computing at Tom’s Guide. A lifelong tech and games enthusiast, he has more than a decade of experience covering both for outlets like Game Developer, Black Hat, and PC World magazine. &lt;/p&gt;&lt;p&gt;  &lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/cD8vcANL2ViyASkcTPGit9-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Tab S10 Ultra review unit on a desk]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Tab S10 Ultra review unit on a desk]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Tab S10 Ultra review unit on a desk]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/cD8vcANL2ViyASkcTPGit9-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Samsung Galaxy Tab S10 Ultra ($1,199 to start) is the latest and greatest slate Samsung has released in 2024, not to mention the biggest.</p><p>But at this point that's no surprise, since Samsung has been releasing super-sized Ultra tablets since it debuted the Galaxy Tab S8 Ultra in 2022. This is the third iteration of Samsung's massive Ultra slate, and while the 14.6-inch AMOLED display remains the star of the show there's a new MediaTek Dimensity 9300+ chip under the hood providing a much-needed speed boost.</p><p>Unfortunately, that's basically the only notable upgrade in this 2024 Ultra, and while the speed is nice it can't compare to the power of Apple's latest iPad Pro M4. So while this isn't the <a href="https://www.tomsguide.com/best-picks/best-tablet" target="_blank">best tablet</a> released this year, it is one of the <a href="https://www.tomsguide.com/best-picks/best-android-tablets" target="_blank">best Android tablets</a> you can buy if you want a laptop replacement or just the most ginormous screen possible. </p><h2 class="article-body__section" id="section-samsung-galaxy-tab-s10-ultra-review-cheat-sheet"><span>Samsung Galaxy Tab S10 Ultra review: Cheat sheet</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Q26TmXhETVUDdDEV6QtPBT" name="Samsung Galaxy Tab S10 Ultra (2024)-02.jpg" alt="Samsung Galaxy Tab S10 Ultra review unit on a desk" src="https://cdn.mos.cms.futurecdn.net/Q26TmXhETVUDdDEV6QtPBT-1920-80.jpg" mos="" align="middle" fullscreen="1" width="2000" height="1125" attribution="" endorsement="" class="expandable"><a href='https://cdn.mos.cms.futurecdn.net/Q26TmXhETVUDdDEV6QtPBT-1920-80.jpg' target='_blank' class='expand-button icon-expand-image icon' ></a></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><ul><li><strong>What is it?</strong> As the name suggest, the Samsung Galaxy Tab S10 Ultra is the biggest, most expensive tablet in Samsung's Galaxy Tab S10 family of slates.</li><li><strong>What does it cost?</strong> $1,199 to start via Samsung's <a href="https://www.samsung.com/us/tablets/galaxy-tab-s10/buy/galaxy-tab-s10-ultra-256gb-moonstone-gray-wi-fi-sm-x920nzaaxar/" target="_blank" rel="nofollow">website</a>, though the price rises if you upgrade the Samsung Galaxy Tab S10 Ultra and falls if you take advantage of Samsung's trade-in deals.</li><li><strong>Who is it for? </strong>Anyone who wants a top-of-the-line $1,200+ Android tablet with a nearly 15-inch AMOLED screen. It's well-suited for watching movies and using as a laptop replacement.</li><li><strong>What do we like?</strong> The big, lovely AMOLED display, the speedy performance that can run any app in the Google Play Store and the packed-in stylus.</li><li><strong>What don’t we like?</strong> The size of this tablet makes it a bit unwieldy to use, even with both hands.</li></ul><div data-model-name="Samsung Galaxy Tab S10 Ultra" data-widget-type="review"></div><h2 class="article-body__section" id="section-samsung-galaxy-tab-s10-ultra-review-specs"><span>Samsung Galaxy Tab S10 Ultra review: Specs</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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4R8gV5zJNvTq8qt5VFazvS" name="Samsung Galaxy Tab S10 Ultra (2024)-09.jpg" alt="Samsung Galaxy Tab S10 Ultra review unit on a desk" src="https://cdn.mos.cms.futurecdn.net/4R8gV5zJNvTq8qt5VFazvS-1920-80.jpg" mos="" align="middle" fullscreen="1" width="2000" height="1125" attribution="" endorsement="" class="expandable"><a href='https://cdn.mos.cms.futurecdn.net/4R8gV5zJNvTq8qt5VFazvS-1920-80.jpg' target='_blank' class='expand-button icon-expand-image icon' ></a></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><div ><table><thead><tr><th class="firstcol empty" ></th><th  >Samsung Galaxy Tab S10 Ultra</th></tr></thead><tbody><tr><td class="firstcol " ><strong>Price</strong></td><td  >$1,199 to start</td></tr><tr><td class="firstcol " ><strong>Display</strong></td><td  >14.6-inch 3K (2960 x 1848 pixels) Dynamic AMOLED</td></tr><tr><td class="firstcol " ><strong>Chip </strong></td><td  >MediaTek Dimensity 9300+</td></tr><tr><td class="firstcol " ><strong>RAM</strong></td><td  >12GB</td></tr><tr><td class="firstcol " ><strong>Storage</strong></td><td  >256GB </td></tr><tr><td class="firstcol " ><strong>Cameras </strong></td><td  >12MP FF + Ultrawide (front), 13MP AF + 8MP UW (rear)</td></tr><tr><td class="firstcol " ><strong>Wireless</strong></td><td  >Wi-Fi 7, Bluetooth 5.3</td></tr><tr><td class="firstcol " ><strong>Size</strong></td><td  >12.85 x 8.21 x 0.21 inches</td></tr><tr><td class="firstcol " ><strong>Weight </strong></td><td  >1.58 pounds</td></tr></tbody></table></div><h2 class="article-body__section" id="section-samsung-galaxy-tab-s10-ultra-review-the-ups"><span>Samsung Galaxy Tab S10 Ultra review: The ups</span></h2><p>I like the Samsung Galaxy Tab S10 Ultra because it feels like a big, premium Android tablet with an eye-catching AMOLED display. Here are a few specific things I love about this slate.</p><h2 id="big-amoled-display-makes-everything-look-great">Big AMOLED display makes everything look great</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rdJF4ZuxDoKFYaBWxi85jS" name="Samsung Galaxy Tab S10 Ultra (2024)-06.jpg" alt="Samsung Galaxy Tab S10 Ultra review unit on a desk" src="https://cdn.mos.cms.futurecdn.net/rdJF4ZuxDoKFYaBWxi85jS-1920-80.jpg" mos="" align="middle" fullscreen="1" width="2000" height="1125" attribution="" endorsement="" class="expandable"><a href='https://cdn.mos.cms.futurecdn.net/rdJF4ZuxDoKFYaBWxi85jS-1920-80.jpg' target='_blank' class='expand-button icon-expand-image icon' ></a></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I love a good OLED screen, so the 14.6-inch AMOLED display on the Samsung Galaxy Tab S10 Ultra is one of the things I adore most about it. I'm happy Samsung has put such a good screen on this slate because it's huge and 99% display, so you'll spend all your time looking at what you spent your money on.</p><p>I know because I spent hours playing games and streaming movies on this slate, and the colors really pop with lots of nice contrasts between lights and darks. </p><p>While I sometimes grew frustrated with the way fingerprints show up on the screen quite easily, it's easy to wipe them off with a cleaning cloth whenever they begin to irritate you.</p><div ><table><caption>Display benchmarks</caption><thead><tr><th class="firstcol empty" ></th><th  >Samsung Galaxy Tab S10 Ultra</th><th  >iPad Pro M4</th><th  >OnePlus Pad 2</th></tr></thead><tbody><tr><td class="firstcol " ><strong>Nits (brightness)</strong></td><td  >564/775 (SDR/HDR)</td><td  >938/1516 (SDR/HDR)</td><td  >580/555 (SDR/HDR)</td></tr><tr><td class="firstcol " ><strong>sRGB</strong></td><td  >141.1%</td><td  >117.4%</td><td  >105.7%</td></tr><tr><td class="firstcol " ><strong>DCI-P3</strong></td><td  >99.2%</td><td  >83.2%</td><td  >74.9%</td></tr><tr><td class="firstcol " ><strong>Delta-E</strong></td><td  >0.22</td><td  >0.29</td><td  >0.25</td></tr></tbody></table></div><p>When we brought our Samsung Galaxy Tab S10 Ultra review unit into our testing lab and pointed our instruments at it, we discovered this slate is capable getting decently bright, peaking at roughly 775 nits when viewing HDR content.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Dp56zb83CbZPBsoqnjhzPT" name="Samsung Galaxy Tab S10 Ultra (2024)-04.jpg" alt="Samsung Galaxy Tab S10 Ultra review unit on a desk" src="https://cdn.mos.cms.futurecdn.net/Dp56zb83CbZPBsoqnjhzPT-1920-80.jpg" mos="" align="middle" fullscreen="1" width="2000" height="1125" attribution="" endorsement="" class="expandable"><a href='https://cdn.mos.cms.futurecdn.net/Dp56zb83CbZPBsoqnjhzPT-1920-80.jpg' target='_blank' class='expand-button icon-expand-image icon' ></a></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>It's also capable of good color reproduction, and proved better at covering the more demanding DCI-P3 color gamut than either Apple's new iPad Pro M4 or the OnePlus Pad 2.</p><p>However, Apple's iPad Pro M4 with its Tandem OLED display is capable of getting far brighter than the Galaxy Tab S10 Ultra. So if a bright screen is the most important thing to look for in a tablet, the Ultra is fine but Apple's Pro slate can get far brighter for nearly the same price.</p><h2 id="under-the-hood-upgrade-helps-this-slate-feel-speedy">Under-the-hood upgrade helps this slate feel speedy</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hbkTpkG7SthdfJJ7anNCfT" name="Samsung Galaxy Tab S10 Ultra (2024)-07.jpg" alt="Samsung Galaxy Tab S10 Ultra review unit on a desk" src="https://cdn.mos.cms.futurecdn.net/hbkTpkG7SthdfJJ7anNCfT-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">You can stream movies and music while editing documents, all while flipping back and forth between browser tabs to do research, without the S10 Ultra bogging down. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Samsung Galaxy Tab S10 Ultra runs on a MediaTek Dimensity 9300+ SoC, which is a bit of an upgrade from the Qualcomm Snapdragon 8 Gen 2 which powered its predecessor. </p><p>It's plenty fast enough to run most any app you can pull from the Google Play Store at good to great framerates, and I had a good time playing games, watching movies and multitasking between apps on the S10 Ultra without noticing any major lag or slowdown.</p><p>I really like how snappy and fast the Galaxy Tab S10 Ultra feels, and I do think it's one of the high points of splurging on this expensive slate. However, when we got the S10 Ultra into our testing lab and ran in through some benchmarking utilities we saw that while it performs well, it can't keep pace with Apple's top-tier iPad Pro M4.</p><div ><table><caption>Performance benchmarks</caption><thead><tr><th class="firstcol empty" ></th><th  >Samsung Galaxy Tab S10 Ultra</th><th  >iPad Pro M4</th><th  >OnePlus Pad 2</th></tr></thead><tbody><tr><td class="firstcol " ><strong>Geekbench 6 single-core</strong></td><td  >2171</td><td  >3700</td><td  >2033</td></tr><tr><td class="firstcol " ><strong>Geekbench 6 multi-core</strong></td><td  >7246</td><td  >14523</td><td  >6161</td></tr><tr><td class="firstcol " ><strong>3DMark Wild Life Extreme Unlimited</strong></td><td  >5256</td><td  >8529</td><td  >4440</td></tr></tbody></table></div><p>We run all tablets we test through a gauntlet of tests, and the chart of results above shows you a rundown of how the Samsung Galaxy Tab S10 Ultra scored versus the iPad Pro M4 and OnePlus Pad 2. These benchmarks assign scores to a tablet based on how well it performs: we use Geekbench 6 to test a tablet's CPU capabilities, and 3DMark to test its graphical output.</p><p>As you can see, the Samsung Galaxy Tab S10 Ultra is neck-and-neck with the One Plus Pad 2 when it comes to single-core and multi-core CPU performance, though the OnePlus Pad 2 falls into last place when it comes to graphical performance.</p><p>But in every test, Apple's iPad Pro M4 blows both Android tablets out of the water. The M4 chip is simply faster and better, so if pure performance is all you care about the S10 Ultra is clearly not the best tablet for you.</p><h2 id="packed-in-stylus-is-a-welcome-touch">Packed-in stylus is a welcome touch</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="QgDz9qcvSWj8TUv3sDmZ4S" name="Samsung Galaxy Tab S10 Ultra (2024)-05.jpg" alt="Samsung Galaxy Tab S10 Ultra review unit on a desk" src="https://cdn.mos.cms.futurecdn.net/QgDz9qcvSWj8TUv3sDmZ4S-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Maybe it seems like a minor detail when you're looking at spending over $1,000 on a new tablet, but I love that Samsung includes a stylus for free with every Galaxy Tab S10 Ultra.</p><p>Apple doesn't give you the same courtesy, and I think that's a real failing because getting a tablet with a stylus included gives you permission to immediately start using it as a content creation device. Sure, you can use your fingers to draw or paint on a tablet, but I find it feels inaccurate and no fun at all. </p><p>But with the Samsung Galaxy Tab S10 Ultra, you can immediately start taking notes, annotating papers and doodling notes in the margins. The stylus also snaps magnetically to the tablet, either on the edge or on the rear, making it pretty easy to keep track of when you're moving around. </p><h2 class="article-body__section" id="section-samsung-galaxy-tab-s10-ultra-review-the-downs"><span>Samsung Galaxy Tab S10 Ultra review: The downs</span></h2><p>While I love the Samsung Galaxy Tab S10 Ultra for its sheer size and audacity, there are some downsides you should know about before you buy.</p><h2 id="this-is-an-awkward-tablet-for-all-but-the-biggest-hands">This is an awkward tablet for all but the biggest hands</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4XQigRey7s9hJCkAsZiQk8" name="Samsung Galaxy Tab S10 Ultra (2024)-09.jpg" alt="Samsung Galaxy Tab S10 Ultra review unit on a desk" src="https://cdn.mos.cms.futurecdn.net/4XQigRey7s9hJCkAsZiQk8-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I'm 6'4" tall with big hands, and even I find the Samsung Galaxy Tab S10 Ultra a little frustrating to use as a tablet because of its sheer size.</p><p>Don't get me wrong, it's amazing that you can hold this 14.6-inch AMOLED tablet in your hands and carry it around like a portable screen that opens up onto the Internet. The screen size takes some getting used to, but once you do you'll find yourself squinting at all your other mobile devices. </p><p>But even I basically have to use this thing propped up on a pillow, a couch arm or something else to help me manage the weight. Sure, 1.58 pounds doesn't sound like much, but it's really the awkward size of the tablet that makes it feel so burdensome. you can hold it with both hands for a few minutes, but trying to hang onto it while watching an episode of your favorite show or playing your favorite games can be a real pain. </p><p>Unfortunately, the only good permanent solution to this problem is to buy a nice case that comes with a built-in kickstand or something else you can use to prop the tablet up when you're tired of holding it. </p><h2 id="costs-the-same-more-as-ipad-pro-m4-performs-worse">Costs the same/more as iPad Pro M4, performs worse</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="CbZLEaXKiMGtYPNTU5cAT7" name="Samsung Galaxy Tab S10 Ultra (2024)-03.jpg" alt="Samsung Galaxy Tab S10 Ultra review unit on a desk" src="https://cdn.mos.cms.futurecdn.net/CbZLEaXKiMGtYPNTU5cAT7-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>As much as I like the Samsung Galaxy Tab S10 Ultra, I have to say that it's really hard to recommend over the iPad Pro M4 if you're open to using Apple's tablets.</p><p>That was less true in years past, when Samsung's Ultra tablets sported AMOLED displays while Apple's iPads all had LCD screens. When that was true you could buy a Samsung tablet and feel like even if you weren't getting iPad speeds or apps, you were getting a nicer display that made everything look better than it would on an iPad.</p><p>But now the iPad Pro M4 comes with a Tandem OLED display that gets brighter and more colorful than the Galaxy Tab S10 Ultra, so Samsung's slates have lost their OLED advantage. On top of that, the M4 chip drives the latest iPad Pro to greater heights of performance and better battery life than the Samsung Galaxy Tab S10 Ultra (the Pro M4 lasted 13:13 in our testing, while the S10 Ultra lasted just 9:22), and there's no reason not to choose an iPad Pro M4 if you're not tied to Google's app ecosystem.</p><p>Factor in the fact that the entry-level 11-inch iPad Pro M4 starts at $999, while the 13-inch model starts just over the S10 Ultra at $1,299, and you can see why I think it sucks that the S10 Ultra can't match the performance or power efficiency of the M4 chip.</p><h2 class="article-body__section" id="section-samsung-galaxy-tab-s10-ultra-review-verdict"><span>Samsung Galaxy Tab S10 Ultra review: Verdict</span></h2><p>If you've made it this far you know the Samsung Galaxy Tab S10 Ultra is the latest edition of the biggest Android tablet you can buy from Samsung right now, and it looks great and feels snappy.</p><p>It's marketed as a laptop replacement, and I've used it that way myself while working in both standard mode and DeX mode. Both are doable, and in the wake of Android 14 landing I think there's never been a better time to own an Android tablet. If you need one with a massive screen, either for enjoying movies like a king or getting work done on the road, this is a great choice.</p><p>But like I said, Apple's M4 chip is just plain better than what the Samsung Galaxy Tab S10 Ultra is packing under the hood. So while the S10 Ultra is easily among the <a href="https://www.tomsguide.com/best-picks/best-samsung-tablets">best Samsung tablets</a> you can buy right now, those open to Apple's ways might be happier spending that money on an iPad Pro M4.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Motion sickness while using Android phones could be a thing of the past — here’s why ]]></title>
                                                                                                <dc:content><![CDATA[ <p>A recent APK has given us our first look at how the Android Motion Cue feature will look before its possible release. </p><p>Using a phone in the car always comes with the threat of motion sickness, it's just a part of traveling. However, phone manufacturers have been working on ways to minimize, if not completely resolve, this problem. Apple introduced <a href="https://www.tomsguide.com/phones/iphones/how-to-turn-on-ios-vehicle-motion-cues-beat-car-sickness-while-traveling">Vehicle Motion Cues in iOS 18</a>, and Google was spotted working on a similar feature. Now it seems we have our first look at exactly what this will look like when it finally releases.</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/P7p58GtbsjU" allowfullscreen></iframe></div></div><p>The feature was found in the APK performed by <a href="https://www.androidauthority.com/google-motion-cues-feature-demo-3507554/" target="_blank">Android Authority</a>, who were able to get a demo to function on one of their devices and released the <a href="https://www.youtube.com/watch?v=P7p58GtbsjU" target="_blank">above video</a> showing off how the feature looks. According to the video, when the feature is activated, dots appear on the screen that mimic the direction of your vehicle's movement. This movement aims to help lessen the sensory conflict between your eyes and the motion felt by your inner ear, thus reducing motion sickness.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PnfL3GDnRJngnrE4sW6GzM" name="Android motion Cues.JPEG" alt="Motion cue menu on Android devices" src="https://cdn.mos.cms.futurecdn.net/PnfL3GDnRJngnrE4sW6GzM-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Android Authority)</span></figcaption></figure><p>Unfortunately, the feature is not currently available within Play Services, and there's no mention of when it might be released. However, considering the state of completion that we can see in the video, which was taken in the current Google Play Services v24.29.32 beta, it likely isn't far off. It's also worth noting that Google will want the feature available as soon as possible to help compete with Apple's release.</p><p>This isn't the only big change coming for Android phones, as <a href="https://www.tomsguide.com/phones/android-phones/android-16-first-developer-preview-just-announced-heres-whats-new">Android 16</a> is currently in the works and could be <a href="https://www.tomsguide.com/phones/android-phones/android-16-release-date-just-tipped-and-its-shockingly-early">released shockingly soon</a>. Meanwhile, Samsung users are preparing for the next <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-unpacked-2025">Galaxy Unpacked</a> in January, which will see the release of the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s25-all-the-rumors-so-far">Galaxy S25 </a>and, according to leaks, the official unveiling of <a href="https://www.tomsguide.com/phones/android-phones/one-ui-7-everything-you-need-to-know-about-samsungs-big-galaxy-phone-update">One UI 7</a>. Finally, it seems that Google is working to improve the user experience on<a href="https://www.tomsguide.com/computing/mobile-apps/google-maps-just-stole-one-of-the-best-things-about-waze-what-you-need-to-know"> Google Maps with one major upgrade</a> to make traveling much easier. </p><p>As with any APK, there's no guarantee that these features will arrive, and there are other ways to avoid getting motion sickness. The main thing is to take breaks from looking at the screen while traveling. However, this feature would make life just a little easier when using some of the <a href="https://www.tomsguide.com/us/best-android-phones,review-6051.html">best Android phones</a> while on the move.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s25-series-just-tipped-for-price-hike-in-new-report-heres-what-we-know"><strong>Samsung Galaxy S25 series just tipped for price hike in new report — here's what we know</strong></a></li><li><a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-10-case-leak-just-gave-us-our-first-look-at-the-new-flagships-design"><strong>Google Pixel 10 leak just gave us our first look at the new flagship's design</strong></a></li><li><a href="https://www.tomsguide.com/phones/android-phones/samsung-galaxy-s25-just-tipped-to-feature-qi2-this-could-be-a-game-changer-for-android"><strong>Samsung Galaxy S25 just tipped to feature Qi2 — this could be a game-changer for Android</strong></a></li></ul><div data-model-name="Google Pixel 9 Pro" data-widget-type="review"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/tablets/android-tablets/motion-sickness-while-using-android-phones-could-be-a-thing-of-the-past-heres-why</link>
                                                                            <description>
                            <![CDATA[ A recent APK video has unveiled how Android phones might combat motion sickness. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">6E6pZosZDHQEGcgHCD9pKj</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/YwCpPiPVqcLo8UsRVbPbsL-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 11 Dec 2024 16:18:08 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                <author><![CDATA[ josh.render@futurenet.com (Josh Render) ]]></author>                    <dc:creator><![CDATA[ Josh Render ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/KC66jeFVj9pkfXKGSojaoW-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Josh Render was a UK-based staff writer at Tom&#039;s Guides covering news and features focusing primarily on mobile phones and their workings. Josh has been around phones for many years, having worked in a few different second-hand retailers. He knows the ins and outs of most phones, including how to repair many of them. Meanwhile, he has worked as a freelance journalist for several publications which range over a bunch of different tech aspects. Josh is also a fan of pairing people with the right tech and helping people understand the more nuanced aspects of their latest purchases. Outside of phones Josh is a fan of video games, novels, and Warhammer and has worked around all three to some degree. &lt;/p&gt;&lt;p&gt;Josh has a degree in Film Production from the University of Central Lancashire and has worked for publications such as GameGrin and CBR as well as a few smaller independent outfits. He is often found trying to paint models, completing levels, reading books, or figuring out the next best gaming app to invest his time in.&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/YwCpPiPVqcLo8UsRVbPbsL-1920-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Woman looking at her phone in the car]]></media:description>                                                            <media:text><![CDATA[Woman looking at her phone in the car]]></media:text>
                                <media:title type="plain"><![CDATA[Woman looking at her phone in the car]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/YwCpPiPVqcLo8UsRVbPbsL-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>A recent APK has given us our first look at how the Android Motion Cue feature will look before its possible release. </p><p>Using a phone in the car always comes with the threat of motion sickness, it's just a part of traveling. However, phone manufacturers have been working on ways to minimize, if not completely resolve, this problem. Apple introduced <a href="https://www.tomsguide.com/phones/iphones/how-to-turn-on-ios-vehicle-motion-cues-beat-car-sickness-while-traveling">Vehicle Motion Cues in iOS 18</a>, and Google was spotted working on a similar feature. Now it seems we have our first look at exactly what this will look like when it finally releases.</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/P7p58GtbsjU" allowfullscreen></iframe></div></div><p>The feature was found in the APK performed by <a href="https://www.androidauthority.com/google-motion-cues-feature-demo-3507554/" target="_blank">Android Authority</a>, who were able to get a demo to function on one of their devices and released the <a href="https://www.youtube.com/watch?v=P7p58GtbsjU" target="_blank">above video</a> showing off how the feature looks. According to the video, when the feature is activated, dots appear on the screen that mimic the direction of your vehicle's movement. This movement aims to help lessen the sensory conflict between your eyes and the motion felt by your inner ear, thus reducing motion sickness.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PnfL3GDnRJngnrE4sW6GzM" name="Android motion Cues.JPEG" alt="Motion cue menu on Android devices" src="https://cdn.mos.cms.futurecdn.net/PnfL3GDnRJngnrE4sW6GzM-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Android Authority)</span></figcaption></figure><p>Unfortunately, the feature is not currently available within Play Services, and there's no mention of when it might be released. However, considering the state of completion that we can see in the video, which was taken in the current Google Play Services v24.29.32 beta, it likely isn't far off. It's also worth noting that Google will want the feature available as soon as possible to help compete with Apple's release.</p><p>This isn't the only big change coming for Android phones, as <a href="https://www.tomsguide.com/phones/android-phones/android-16-first-developer-preview-just-announced-heres-whats-new">Android 16</a> is currently in the works and could be <a href="https://www.tomsguide.com/phones/android-phones/android-16-release-date-just-tipped-and-its-shockingly-early">released shockingly soon</a>. Meanwhile, Samsung users are preparing for the next <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-unpacked-2025">Galaxy Unpacked</a> in January, which will see the release of the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s25-all-the-rumors-so-far">Galaxy S25 </a>and, according to leaks, the official unveiling of <a href="https://www.tomsguide.com/phones/android-phones/one-ui-7-everything-you-need-to-know-about-samsungs-big-galaxy-phone-update">One UI 7</a>. Finally, it seems that Google is working to improve the user experience on<a href="https://www.tomsguide.com/computing/mobile-apps/google-maps-just-stole-one-of-the-best-things-about-waze-what-you-need-to-know"> Google Maps with one major upgrade</a> to make traveling much easier. </p><p>As with any APK, there's no guarantee that these features will arrive, and there are other ways to avoid getting motion sickness. The main thing is to take breaks from looking at the screen while traveling. However, this feature would make life just a little easier when using some of the <a href="https://www.tomsguide.com/us/best-android-phones,review-6051.html">best Android phones</a> while on the move.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s25-series-just-tipped-for-price-hike-in-new-report-heres-what-we-know"><strong>Samsung Galaxy S25 series just tipped for price hike in new report — here's what we know</strong></a></li><li><a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-10-case-leak-just-gave-us-our-first-look-at-the-new-flagships-design"><strong>Google Pixel 10 leak just gave us our first look at the new flagship's design</strong></a></li><li><a href="https://www.tomsguide.com/phones/android-phones/samsung-galaxy-s25-just-tipped-to-feature-qi2-this-could-be-a-game-changer-for-android"><strong>Samsung Galaxy S25 just tipped to feature Qi2 — this could be a game-changer for Android</strong></a></li></ul><div data-model-name="Google Pixel 9 Pro" data-widget-type="review"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ You can now save your US passport in the Google Wallet app — here’s how  ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Traveling could soon be a little less stressful as the <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pay-is-being-discontinued-in-the-us-everything-you-need-to-know">Google Wallet app</a> can now store a digital version of US passports. </p><p>Google has slowly been improving the Google Wallet app by allowing it to store <a href="https://www.tomsguide.com/news/apple-wallet-identity-card">several different forms of ID for ease of use</a>. The idea is to store everything you usually carry in your wallet on your phone. However, many were waiting to see <a href="https://www.tomsguide.com/computing/mobile-apps/google-will-soon-let-you-add-your-passport-to-google-wallet-heres-how-it-works">when the confirmed rumor </a>about the wallet being able to store passports would happen. According to a report from <a href="https://www.theverge.com/2024/12/6/24315065/google-wallet-digital-id-passport-airports" target="_blank">The Verge</a>, it seems that Google is starting to roll out the feature. </p><p>According to the article, Google Wallet users can now add a digital version of their US passports to the app. This is accomplished by selecting the prompt to create an ID pass in the app, following the instructions to scan the security chip in the back of the passport, and taking a selfie to confirm your identity. However, Google stated in their <a href="https://blog.google/products/google-pay/google-wallet-update-september-2024/" target="_blank">September blog post</a> that Google Wallet is not a replacement for a physical ID, so you should still carry a physical passport for now. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VSMqw5GHxhkpiqLk8rkiJn" name="Google wallet drawing.JPEG" alt="Google's blog image of passport on Google Wallet app" src="https://cdn.mos.cms.futurecdn.net/VSMqw5GHxhkpiqLk8rkiJn-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Google)</span></figcaption></figure><p>The digital ID feature will reportedly be available to all eligible users in the coming weeks, according to Jenny Chang, the VP and GM of Google Wallet. The <a href="https://www.tsa.gov/digital-id" target="_blank">TSA's website</a> shows a map of all the airports that accept a digital ID. Cheng also revealed that Google Wallet can now save New Mexico driver's licenses and IDs, making it the sixth state to support the feature, according to <a href="https://9to5google.com/2024/12/05/google-wallet-id-new-mexico/" target="_blank">9to5 Google</a>.</p><p>Google has slowly been improving the wallet feature over the last few months. For instance, <a href="https://www.tomsguide.com/phones/android-phones/google-wallet-is-getting-the-biggest-upgrade-in-years-meet-the-everything-else-pass">the "Everything Else" feature </a>showed off at<a href="https://www.tomsguide.com/news/live/google-io-2024-keynote"> Google's I/O</a> event in May has started to roll out to users. This feature allows users to scan any pass, such as a concert ticket, insurance card, or library card, to create a digital version. Not only that, Google Wallet now allows <a href="https://www.tomsguide.com/computing/mobile-apps/your-kids-can-now-make-contactless-payments-with-google-wallet-heres-how-it-works">kids to make contactless payments</a> from their phones while using a <a href="https://www.tomsguide.com/reviews/google-family-link">Family Link</a>-managed account.</p><p>Google is constantly looking to make its app more central to users' lives, and this is a great step in that direction. While there's no word on whether this will go global just yet, we can only hope it does. </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/android-phones/galaxy-s25-ultra-could-see-a-major-ram-increase-heres-what-we-know">Galaxy S25 Ultra could see a major RAM increase — here’s what we know</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s24-could-get-this-incredible-ai-feature-thanks-to-one-ui-7">Samsung Galaxy S24 could get this incredible AI feature thanks to One UI 7</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-tipped-for-big-price-hike-in-2026-heres-why">iPhone 18 Pro tipped for big price hike in 2026 — here's why</a></li></ul><div data-model-name="Samsung Galaxy S24 Ultra" data-widget-type="review"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/tablets/android-tablets/you-can-now-save-your-us-passport-in-the-google-wallet-app-heres-how</link>
                                                                            <description>
                            <![CDATA[ Google has started to roll out a feature that allows users to store a digital version of their US passports on the Google Wallet app. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">mUnmYsCYsu7sC7KUH3H5B8</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/T2RiV7Cxh6E6iZixok6PnR-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 09 Dec 2024 15:49:54 +0000</pubDate>                                                                                                                                <updated>Thu, 10 Apr 2025 14:04:08 +0000</updated>
                                                                                                                                            <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                <author><![CDATA[ josh.render@futurenet.com (Josh Render) ]]></author>                    <dc:creator><![CDATA[ Josh Render ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/KC66jeFVj9pkfXKGSojaoW-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Josh Render was a UK-based staff writer at Tom&#039;s Guides covering news and features focusing primarily on mobile phones and their workings. Josh has been around phones for many years, having worked in a few different second-hand retailers. He knows the ins and outs of most phones, including how to repair many of them. Meanwhile, he has worked as a freelance journalist for several publications which range over a bunch of different tech aspects. Josh is also a fan of pairing people with the right tech and helping people understand the more nuanced aspects of their latest purchases. Outside of phones Josh is a fan of video games, novels, and Warhammer and has worked around all three to some degree. &lt;/p&gt;&lt;p&gt;Josh has a degree in Film Production from the University of Central Lancashire and has worked for publications such as GameGrin and CBR as well as a few smaller independent outfits. He is often found trying to paint models, completing levels, reading books, or figuring out the next best gaming app to invest his time in.&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/T2RiV7Cxh6E6iZixok6PnR-1920-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Google wallet app on screen]]></media:description>                                                            <media:text><![CDATA[Google wallet app on screen]]></media:text>
                                <media:title type="plain"><![CDATA[Google wallet app on screen]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/T2RiV7Cxh6E6iZixok6PnR-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Traveling could soon be a little less stressful as the <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pay-is-being-discontinued-in-the-us-everything-you-need-to-know">Google Wallet app</a> can now store a digital version of US passports. </p><p>Google has slowly been improving the Google Wallet app by allowing it to store <a href="https://www.tomsguide.com/news/apple-wallet-identity-card">several different forms of ID for ease of use</a>. The idea is to store everything you usually carry in your wallet on your phone. However, many were waiting to see <a href="https://www.tomsguide.com/computing/mobile-apps/google-will-soon-let-you-add-your-passport-to-google-wallet-heres-how-it-works">when the confirmed rumor </a>about the wallet being able to store passports would happen. According to a report from <a href="https://www.theverge.com/2024/12/6/24315065/google-wallet-digital-id-passport-airports" target="_blank">The Verge</a>, it seems that Google is starting to roll out the feature. </p><p>According to the article, Google Wallet users can now add a digital version of their US passports to the app. This is accomplished by selecting the prompt to create an ID pass in the app, following the instructions to scan the security chip in the back of the passport, and taking a selfie to confirm your identity. However, Google stated in their <a href="https://blog.google/products/google-pay/google-wallet-update-september-2024/" target="_blank">September blog post</a> that Google Wallet is not a replacement for a physical ID, so you should still carry a physical passport for now. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VSMqw5GHxhkpiqLk8rkiJn" name="Google wallet drawing.JPEG" alt="Google's blog image of passport on Google Wallet app" src="https://cdn.mos.cms.futurecdn.net/VSMqw5GHxhkpiqLk8rkiJn-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Google)</span></figcaption></figure><p>The digital ID feature will reportedly be available to all eligible users in the coming weeks, according to Jenny Chang, the VP and GM of Google Wallet. The <a href="https://www.tsa.gov/digital-id" target="_blank">TSA's website</a> shows a map of all the airports that accept a digital ID. Cheng also revealed that Google Wallet can now save New Mexico driver's licenses and IDs, making it the sixth state to support the feature, according to <a href="https://9to5google.com/2024/12/05/google-wallet-id-new-mexico/" target="_blank">9to5 Google</a>.</p><p>Google has slowly been improving the wallet feature over the last few months. For instance, <a href="https://www.tomsguide.com/phones/android-phones/google-wallet-is-getting-the-biggest-upgrade-in-years-meet-the-everything-else-pass">the "Everything Else" feature </a>showed off at<a href="https://www.tomsguide.com/news/live/google-io-2024-keynote"> Google's I/O</a> event in May has started to roll out to users. This feature allows users to scan any pass, such as a concert ticket, insurance card, or library card, to create a digital version. Not only that, Google Wallet now allows <a href="https://www.tomsguide.com/computing/mobile-apps/your-kids-can-now-make-contactless-payments-with-google-wallet-heres-how-it-works">kids to make contactless payments</a> from their phones while using a <a href="https://www.tomsguide.com/reviews/google-family-link">Family Link</a>-managed account.</p><p>Google is constantly looking to make its app more central to users' lives, and this is a great step in that direction. While there's no word on whether this will go global just yet, we can only hope it does. </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/android-phones/galaxy-s25-ultra-could-see-a-major-ram-increase-heres-what-we-know">Galaxy S25 Ultra could see a major RAM increase — here’s what we know</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s24-could-get-this-incredible-ai-feature-thanks-to-one-ui-7">Samsung Galaxy S24 could get this incredible AI feature thanks to One UI 7</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-tipped-for-big-price-hike-in-2026-heres-why">iPhone 18 Pro tipped for big price hike in 2026 — here's why</a></li></ul><div data-model-name="Samsung Galaxy S24 Ultra" data-widget-type="review"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
            </channel>
</rss>